ChatGPT、使っていいよっていう組織は増えてきたが、プロンプトに個人情報や機密情報は含めないでね、というルールになっているところが多い。
とはいえうっかりもある
ということで、エンジニアなら自動化しよう!と、OpenAIに送信する前にローカルや信頼できるサーバーで隠すべき情報を隠し(匿名化)たうえで、送信する、ということが出来ないか考えた。
方式を考えた
とりあえず、個人情報を隠すということを目標にした。
ChatGPTに送るのは文章なので、正規表現などでは対応しきれないだろうと考えた(メールアドレスや電話番号などは対応できそうだが、名前や住所は難しそう)
使用ライブラリ
いろいろ情報を探していると、Presidioというデータ保護や匿名化のためのライブラリを見つけた。
https://github.com/microsoft/presidio
Presidioに含まれる、Presidio analyzerとPresidio anonymizerというモジュールを利用することにした。
Presidio analyzerは個人情報の検知をしてくれる。spaCyを使った自然言語処理による検知が可能。
Presidio anonymizerはPresidio analyzerが出した結果に基づいて、匿名化処理を行ってくれる。
このライブラリを使うだけでOKかな、と思ったのだが、処理結果をプロンプトとして使用するには少し不便な点があった。
プロンプトとして適切になるよう出力の調整
同じものは同じと分かるように
プロンプトとして使用する場合、同じ情報は同じであることが分かった方が適切な回答を得やすいと考える。
例えば、以下のような文章について、
「山田太郎は来週誕生日です。山田太郎の友人である山田花子はプレゼントをあげようと考えています。山田花子が山田太郎に渡すプレゼントとして適したものを提案してください。」
「人名は来週誕生日です。人名の友人である人名はプレゼントをあげようと考えています。人名が人名に渡すプレゼントとして適したものを提案してください。」
となるより
「人名_Aは来週誕生日です。人名_Aの友人である人名_Bはプレゼントをあげようと考えています。人名_Bが人名_Aに渡すプレゼントとして適したものを提案してください。」
となった方が、適切な匿名化であると考えた。
Presidio anonymizerのいくつかある匿名化のオプションで上記に近いのは、ハッシュで置き換えるものであった。
ハッシュで置き換えた場合、以下のようになる。
「6b0e1c8cc616be88a16bef09ef113a91a3ecceb0f157bae276e200624932912fは来週誕生日です。6b0e1c8cc616be88a16bef09ef113a91a3ecceb0f157bae276e200624932912fの友人であるdbb7bf97673bebd709723021f12c31104866677277fbf93838d409ac4c680d55はプレゼントをあげようと考えています。dbb7bf97673bebd709723021f12c31104866677277fbf93838d409ac4c680d55が6b0e1c8cc616be88a16bef09ef113a91a3ecceb0f157bae276e200624932912fに渡すプレゼントとして適したものを提案してください。」
これだとかなり読みにくいし、もう一つ問題がある。
何を匿名化したかは分かっていい
「山田太郎( 090-0000-0000 )は来週誕生日です」という文章をハッシュで置き換えると、
「6b0e1c8cc616be88a16bef09ef113a91a3ecceb0f157bae276e200624932912f( 019ed474a1e51cc4d93c1f034478ab1440ac1871c8dc3e56b300275b94d2dc7d )は来週誕生日です」
になってしまい、もともと何が書かれていたのか分からない文章になってしまった。
結果
ということで、Presidio anonymizerの出力をさらに加工し、以下のような出力になるように調整した。
原文:
「山田太郎( 090-0000-0000 )は来週誕生日です。山田太郎の友人である山田花子はプレゼントをあげようと考えています。山田花子が山田太郎に渡すプレゼントとして適したものを提案してください。」
匿名化後:
「人名_A( 電話番号_A )は来週誕生日です。人名_Aの友人である人名_Bはプレゼントをあげようと考えています。人名_Bが人名_Aに渡すプレゼントとして適したものを提案してください。」
UI
Chromeの拡張にして、ChatGPTの画面に入力された文章を匿名化するようにするとか、既にいくつか存在するOSSのGUI開発プロジェクトのプラグインのような形で作ることも考えたが、とりあえずCLIで動くようにした。
コードはこちら
感想
とりあえず、出来るかなと思ったことができた。
もう少し難しいことしないといけないかと思ったが、そんなにたくさんの量のコード書かずに実現できた。
感覚を現時点の状況にアップデートし続けるためにも、改めてコードを常時書くようにしようと思った。
あと、タイトルに「ChatGPTに個人情報を送らないように」と書いたが、今のコードでは、OpenAIのChat Completion APIに送っている。
いずれもGPT-3.5やGPT-4を使って応答を返してくるが、異なるものだ。
いくつかの企業が、Chat Completion APIを使ってChatGPTに似たインターフェースのサービスを提供し始めているが、そういう形であれば、今回のような匿名化の処理も挟みやすい。
一方、ChatGPT自体を使うときにプロンプトを匿名化したい、ブラウザ拡張のような形にならざるを得ない。匿名化処理はローカルで行うのが良いと思うが、ブラウザ拡張で今回の処理と同じことができるだろうか、、あるいは別の方式があるだろうか、、など考えている。