6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

「ChatGPTに個人情報を送らないように気をつける」を自動化してみる(プロンプトの匿名化処理)

Last updated at Posted at 2023-06-03

ChatGPT、使っていいよっていう組織は増えてきたが、プロンプトに個人情報や機密情報は含めないでね、というルールになっているところが多い。

とはいえうっかりもある

ということで、エンジニアなら自動化しよう!と、OpenAIに送信する前にローカルや信頼できるサーバーで隠すべき情報を隠し(匿名化)たうえで、送信する、ということが出来ないか考えた。

ja_demo.gif

方式を考えた

とりあえず、個人情報を隠すということを目標にした。
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はプレゼントをあげようと考えています。dbb7bf97673bebd709723021f12c31104866677277fbf93838d409ac4c680d556b0e1c8cc616be88a16bef09ef113a91a3ecceb0f157bae276e200624932912fに渡すプレゼントとして適したものを提案してください。」

これだとかなり読みにくいし、もう一つ問題がある。

何を匿名化したかは分かっていい

山田太郎090-0000-0000 )は来週誕生日です」という文章をハッシュで置き換えると、
6b0e1c8cc616be88a16bef09ef113a91a3ecceb0f157bae276e200624932912f019ed474a1e51cc4d93c1f034478ab1440ac1871c8dc3e56b300275b94d2dc7d )は来週誕生日です」
になってしまい、もともと何が書かれていたのか分からない文章になってしまった。

結果

ということで、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自体を使うときにプロンプトを匿名化したい、ブラウザ拡張のような形にならざるを得ない。匿名化処理はローカルで行うのが良いと思うが、ブラウザ拡張で今回の処理と同じことができるだろうか、、あるいは別の方式があるだろうか、、など考えている。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?