Amazon Bedrockの入出力に個人情報が含まれていたらAmazon Comprehendでフィルタする

記事タイトルとURLをコピーする

サーバーワークスの村上です。

ハロウィンが終わり11月になりました。224cmルーキー、ウェンバンヤマによるスレンダーマンの仮装を貼っておきます。

構成

チャットボットのアプリを通じてAmazon Bedrockを使っていると想定します。

以下のようにAmazon Bedrockへの入力前またはAmazon Bedrockからの出力後に、Amazon Comprehendを挟むことで入出力を制御しています。

動作

使用しているモデルはAnthropic Claude 2です。

フィルタしない場合

Amazon Comprehendを使わない場合は自由に入力できます。

適当な名前やメールアドレスなら、出力も可能です。なお、差別的・暴力的な表現等は大規模言語モデルの仕様上、たいていの場合出力されないようになっていることを補足しておきます。

ユーザーからの入力をフィルタする場合

ユーザーからの入力に個人情報が含まれていた場合に警告が出ます。Amazon Bedrockにリクエストはされません。

Amazon Bedrockからの出力をフィルタする場合

Amazon Bedrockからの出力に個人情報が含まれていた場合、アプリには表示されません。

想定しないユースケース

AWSに個人情報が保存されないようにしたい、というユースケースは想定しません。

当然ですが、Amazon Comprehendにはユーザーからの入力(またはAmazon Bedrockからの出力)を送信しているからです。

また、Amazon Comprehendの場合、送信した内容はAWSの品質向上のために使用される場合があります。

Amazon Comprehend では、サービスの提供と保守、および Amazon Comprehend やその他の Amazon 機械学習/人工知能技術の品質向上のためにのみ、サービスにより処理されたテキスト入力を保存して使用することがあります。
よくある質問 - Amazon Comprehend | AWS

なお、過去のブログにも記載したとおり、Amazon Bedrockではユーザーの入力やモデルからの出力などはAWSのサービス改善に利用されないことが明記されています。

blog.serverworks.co.jp

想定するユースケース

想定するユースケースは例えば以下のような場合です。

  • Amazon Bedrockに個人情報を含む入力に基づいた出力を生成してほしくない
  • 個人情報を含むAmazon Bedrockからの出力をアプリに表示させたくない

あくまで対エンドユーザーに対する施策という理解です。

ここでいう個人情報とは?

Amazon Comprehendの個人情報(PII)検出の機能を使っています。

  • 名前
  • メールアドレス
  • クレジットカード番号
  • AWSのアクセスキー・シークレットアクセスキー など

上記のような情報を検出できます。詳細は公式ドキュメントをご確認ください

docs.aws.amazon.com

実装

チャットボットについては本題ではありませんので割愛しますが、Streamlitで作成しています。

Comprehendでチェックする箇所のコードを掲載します。

prompt = st.chat_input("なにか質問してください")
if prompt:
    # comprehendで個人情報が入力に含まれていないかチェック
    check_input = comprehend.detect_pii_entities(
        Text=prompt,
        LanguageCode='en' #英語のみサポート
    )
    
    pii_input = {}
    for i, entity in enumerate(check_input['Entities']):
        # スコアが0.8以上の場合のみフィルタ
        if entity["Score"] >= 0.8:
            pii_input[i] = f"{entity['Type']} (confidence={entity['Score']})"
    if pii_input != {}:
        st.warning(f'入力に個人情報が含まれています\n\n{prompt}\n\n{pii_input}', icon="⚠️")
    else:
        # 個人情報がない場合のみ、ユーザーの入力をセッションに保存し、画面に表示
        st.session_state.messages.append({"role": "user", "content": prompt})
        with st.chat_message("user"):
            st.markdown(prompt)
        
        # LLMにリクエスト
        with st.chat_message("assistant"):
            callback = StreamlitCallbackHandler(st.container())
            response = st.session_state.chain.run(prompt, callbacks=[callback])

ユーザーが入力したpromptをLLMにリクエストする前にAmazon Comprehendに送信し、個人情報が含まれていないかチェックします。

個人情報が含まれていた場合は警告を出し、LLMへリクエストは行いません。

また、Amazon Bedrockからの出力を画面に表示する前に同様のコードを書くことで、出力をフィルタすることも可能です。

言語は英語のみ

Amazon Comprehendの個人情報(PII)検出の機能では、英語のみサポートされています。

なので、クレジットカード番号やアクセスキーなど言語に依らない情報を検出する目的になるかと考えます。

Currently, English is the only valid language.
contains-pii-entities — AWS CLI 2.13.32 Command Reference

スコアによる判定

Amazon Comprehendからの出力には、確率を推定するスコアが含まれています。

今回の場合、スコアが0.8以上の場合に個人情報であると判断し、入出力をフィルタしています。

docs.aws.amazon.com

まとめ

大規模言語モデルには最初から差別的・暴力的な表現を抑制する機能があります。

追加で個人情報を含む入出力を防ぎたい場合、Amazon Comprehendを使うことで実現できます。

村上博哉 (執筆記事の一覧)

2020年4月入社。機械学習が好きです。記事へのご意見など:hiroya.murakami@serverworks.co.jp