2026年3月24日火曜日

個人情報を送らずに生成AIを使う——ブラウザだけで動くマスキングツール「ふせじ」を作りました

生成AIを業務に使う場面はずいぶん増えてきましたが、入力するテキストに個人情報が含まれるとき、その扱いにはまだ迷いが残ります。氏名やメールアドレス、所属部署の書かれた文書を、そのままクラウド型のAIに送ってよいものかどうか。大学や研究機関、企業の現場では、こうした戸惑いの声をよく耳にします。

そうした場面で少しでも安心して使えるように、ブラウザの中だけで動く個人情報マスキングツール「ふせじ」を作り、無償で公開しました。

https://fuseji.jp


既存ツールを調べてみて

個人情報のマスキングを扱うツールそのものは、すでにいくつか存在します。ただ、実際に調べてみると、個人や小規模な組織が気軽に使えるものは意外と見当たりませんでした。

企業向けのしっかりしたツールは月額契約が前提で、しかもサーバー側で処理する仕組みになっています。無償で試せるデモサービスもありましたが、そちらはマスキングしたい個人情報を、いったん外部のサーバーに送る作りになっていました。個人情報を守るために個人情報を送る、という形になってしまっているわけです。

もう一つ、技術的に気になった点があります。既存のツールの多くは、複数の人物をまとめて同じ記号(●●)に置き換えてしまうため、生成AIに渡した段階で人間関係や文脈が失われてしまいます。誰が誰に何を伝えたのか——本来はその構造こそがAIに読み取ってほしい情報の中心にあるはずなのですが、そこが抜け落ちてしまうのです。


設計の基本方針

「ふせじ」を作るうえで一番大事にしたのは、データが外に出ないことを、仕組みそのもので保証するという点です。

ツールはHTMLファイル1つで完結していて、サーバーとのやり取りは一切発生しません。Google Fontsのような外部リソースの読み込みも省いてあるので、ネットワークにつながっていない環境でも動きます。「データを送信しない」と述べる以上、ソースコードを公開して誰でも中身を確かめられるようにしておくのが筋だろうと考え、GitHubでオープンソースとして公開しています。

https://github.com/TadashiNakai/fuseji


主な機能

番号付きラベルによる文脈の保持

氏名・法人名・部署名・メールアドレス・電話番号・住所といった個人情報を、種別と番号を組み合わせたラベル({姓名1}{学校法人1}{部1} など)に置き換えます。同じ人物・同じ情報には必ず同じ番号を割り当てるので、置き換えたあとのテキストからでも、生成AIは人間関係や組織の構造、文脈をきちんと読み取ることができます。

たとえば、次のような変換になります。

【変換前】
差出人: 布施 譲治 <j.fuse@fuseji.jp>
宛先: 鈴木 花子 <h.suzuki@fuseji.jp>
件名: 例のプロジェクトの進捗について

鈴木さん
先日の細胞抽出液の精製の件だけど、ついに逆翻訳酵素の単離に成功したみたいだね。

【変換後】
差出人: {姓名1} <{メールアドレス1}>
宛先: {姓名2} <{メールアドレス2}>
件名: 例のプロジェクトの進捗について

{姓2}さん
先日の細胞抽出液の精製の件だけど、ついに{伏字1}の単離に成功したみたいだね。

「逆翻訳酵素」のような未発表の研究情報は、「伏字追加」機能で手動登録して {伏字1} として保護できます。(ちなみに「逆翻訳酵素」は、本記事のデモ用にこしらえた架空の物質名です。生物学に詳しい方はどうかご容赦ください。)カテゴリ名を指定すれば、{未発表物質1} のように意味の伝わるラベルにすることもできます。

日本語に特化した自動検出

日本語の氏名判定は難しいとよく言われます。「ふせじ」では、いくつかの手法を組み合わせることで、実用に足る精度を目指しました。

  • メールヘッダー(差出人・宛先・CC)からの氏名抽出
  • 敬称(様・先生・教授・部長など)や職位からの検出
  • スペース入りの氏名(鈴 木 花 子)への対応
  • 3文字以上の姓(佐々木・長谷川・武者小路など)の辞書処理
  • ローマ字表記の氏名(括弧内や署名ブロック)の検出

法人名は種別ごと(学校法人・株式会社・医療法人など)に見分けて、{学校法人1}{株式会社1} のように区別します。部署名・学科名・学部名・大学名も自動で候補として挙げるので、内容を確認し、不要なものを削ってからマスキングを実行できます。

逆変換機能

個人的には、これが「ふせじ」の要になる機能だと思っています。

マスキング済みのテキストを生成AIに入力すると、返ってくる出力にも {姓名1} のようなラベルがそのまま残っています。この出力を「逆変換」機能に貼り付けると、対応リスト(ラベルと原文の対応表)を参照して、元の実名へ一括で戻すことができます。

【AIの出力(ラベル入り)】
{大学1} {学部1} {学科1}の{姓1}研究室に所属する {姓名1} より、
{姓名2}({姓2}さん)へ向けた業務連絡です。
目標としていた「{伏字1}」の単離に成功した旨が報告されています。

【逆変換後】
政令都市大学 生命科学部 分子生化学科の布施研究室に所属する 布施 譲治 より、
鈴木 花子(鈴木さん)へ向けた業務連絡です。
目標としていた「逆翻訳酵素」の単離に成功した旨が報告されています。

対応リストはJSON形式でダウンロードして保存できるので、日を改めて別のセッションで同じ文書を扱うときにも復元できます。TSV形式(タブ区切りテキスト)の読み込みにも対応しているため、スプレッドシートで管理している対応表をそのまま使うこともできます。

「マスキングして送る → AIから受け取る → 元に戻す」という一連の流れが、すべてブラウザの中で完結します(図1)。

図1 「ふせじ」の実行画面。左側の原文(個人情報を含む)が、右側でラベルに置き換えられます。下部の逆変換パネルでは、生成AIの出力に残ったラベルを、元の実名や情報へ一括で戻せます。処理はすべてブラウザ内で完結します。

操作の流れ

基本的な使い方は、3つのステップで済みます。

  1. マスキングしたいテキストを左側に貼り付ける
  2. ⚡自動判定ボタンを押す(候補が一覧で表示されます)
  3. マスキング実行ボタンを押す

不要な候補は✕で消してから実行できます。自動判定で拾いきれなかった固有名詞は、手動の伏字追加機能で補えます。操作の詳しい手順については、図を交えて別の記事で説明する予定です。


今後の課題

正規表現を軸にした検出にはどうしても限界があり、文脈によっては誤検出も起こります。そのため現状は、「広めに拾っておいて、目視で確認しながら削っていく」という使い方を前提に設計しています。形態素解析(GiNZA など)を組み込めば精度は上がりますが、ブラウザ単体で動かすという方針とのあいだで折り合いをつける必要があります。

また、いまのところ日本語に特化しているため、英語混じりの文書への対応は部分的なものにとどまっています。


まとめ

「ふせじ」は、個人情報の保護と生成AIの活用をどう両立させるか、という現場の実務的な悩みに応えたくて作りました。大学や研究機関、自治体、企業などの現場で、誰かの役に立つことがあれば嬉しく思います。

フィードバックや不具合の報告は、GitHub Issues か X(@TadashiNakai)までお寄せください。


0 件のコメント:

コメントを投稿