Amazon Bedrok GuradrailsでSensitive information filters(機密情報フィルター)を試す

# はじめに
Amazon Bedrockが出力するプロンプトには、機密情報が含まれることがあります。機密情報をフィルタリングするために、Sensitive information filtersを使用することができます。この記事では、Sensitive information filtersを試してみました。
Amazon Bedrock Guardrailsは英語のみをサポートしていますが、日本語のプロンプトを作成することも可能です。日本語と英語のダミー個人情報に対し、それぞれ日本語と英語でプロンプトを作成し、Sensitive information filtersを試します。


# Sensitive information filters(機密情報フィルター)とは
Sensitive information filtersは、Amazon Bedrockのモデルレスポンスで個人を特定できる情報（PIIs）などの機密情報を検出するものです。
PII typesには、名前、住所、電話番号、メールアドレス、クレジットカード番号のほか、アメリカやカナダ、イギリス固有の識別情報など31種類のフィルタがあります。
ガードレールによって機密情報が検出された場合、すべてのコンテンツをブロックし特定のメッセージを返すか、機密情報をマスクして返すかを選択することができます。
正規表現フィルターを使用して、独自の機密情報フィルターを作成することも可能です。

# 参考情報

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/guardrails-sensitive-filters.html

https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails-contextual-grounding-check.html

https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails-use-converse-api.html

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/bedrock-runtime/client/converse.html

# ガードレールを作成する
## Sensitive information filtersを作成する
Amazon Bedrock のコンソールメニューから Guardrails を選択し、Create guardrail を選択します。`Step 1: Provide guardrail details` では、任意の名称と説明を入力します。`Messaging for blocked prompts` には、ガードレールがユーザープロンプトをブロックする場合に表示するメッセージを入力します。以下の内容を入力し、Next を選択します。

|項目名|入力内容|
|---|---|
|Name(任意の名称) | PIIs_TEST
|Description(任意の説明) ||
|Messaging for blocked prompts (ガードレールがユーザープロンプトをブロックする場合に表示するメッセージ)|Sorry, the model cannot answer this question.|

![Amazon Bedrock Guardrails: Guardrails作成画面 step 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/3ec466a4-c64e-61b1-857b-e4e7ae0ce04e.png)

以下のステップは入力をスキップします
Step 2: Configure content filters
Step 3: Add denied topics
Step 4: Add word filters

Step 5: Add sensitive information filters では`Add all PII types(31) with behavior: Mask`を選択します。

![Amazon Bedrock Guardrails: Guardrails作成画面 step 5](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/5d985ca7-d036-88ea-03bc-57985046a04a.png)

すると、以下のようにPII typesが追加されます。それぞれのPII typesには、検出された場合の動作が設定されています。`Mask`を設定しているので、検出された機密情報がマスクされます。

![Amazon Bedrock Guardrails: Guardrails作成画面 step 5 - PII Typesが設定された状態](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/3968db0e-9508-1a8c-0e34-2f877139bf27.png)

Step 6: Add contextual grounding check ではグラウンドチェックを有効にします。
Groundingはモデルのレスポンスがソースに基づいているかどうかを確認します。Relevanceはモデルのレスポンスがユーザークエリに関連しているかどうかを確認します。それぞれ、レスポンス内容に信頼スコアが付与され、閾値を下回る場合はハルシネーションと判定され出力がブロックされます。

![Amazon Bedrock Guardrails: Guardrails作成画面 step 6](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/3baeac01-c091-82ec-fcc7-45d952448239.png)

Step 7まで進みGuradrailsの作成を完了します。


## ダミー個人情報を用意する
Sensitive information filtersを試すために、ダミー個人情報を用意します。適当なダミーデータを [Claude.ai](https://claude.ai/)を使って作成しました。このとき使用したプロンプトは以下のとおりです。

```text
ユーザー一覧のダミーデータを20人分作って。出力形式はCSV、項目は以下のとおり。
名前, メールアドレス, 携帯電話番号, 住所(都道府県),住所(市区町村), 年齢, 職, 好きなスポーツ, 性別
```

### ダミー個人情報(日本語版)
このようなダミーの個人情報が作成されました。

```
名前,メールアドレス,携帯電話番号,住所(都道府県),住所(市区町村),年齢,職,好きなスポーツ,性別
佐藤 美咲,misaki.sato@example.com,090-1234-5678,東京都,新宿区,28,会社員,テニス,女性
鈴木 健太,kenta.suzuki@example.com,080-2345-6789,大阪府,大阪市中央区,35,自営業,サッカー,男性
高橋 愛,ai.takahashi@example.com,070-3456-7890,北海道,札幌市中央区,42,教師,スキー,女性
田中 洋介,yosuke.tanaka@example.com,090-4567-8901,福岡県,福岡市博多区,31,エンジニア,バスケットボール,男性
渡辺 さくら,sakura.watanabe@example.com,080-5678-9012,神奈川県,横浜市西区,25,デザイナー,ヨガ,女性
伊藤 隆,takashi.ito@example.com,070-6789-0123,愛知県,名古屋市中区,50,医師,ゴルフ,男性
山本 麻衣,mai.yamamoto@example.com,090-7890-1234,京都府,京都市左京区,29,公務員,水泳,女性
中村 太郎,taro.nakamura@example.com,080-8901-2345,兵庫県,神戸市中央区,38,弁護士,ランニング,男性
小林 優子,yuko.kobayashi@example.com,070-9012-3456,静岡県,静岡市葵区,33,看護師,バレーボール,女性
加藤 誠,makoto.kato@example.com,090-0123-4567,埼玉県,さいたま市大宮区,45,会社役員,野球,男性
吉田 花子,hanako.yoshida@example.com,080-1234-5678,千葉県,千葉市中央区,27,美容師,ダンス,女性
山田 一郎,ichiro.yamada@example.com,070-2345-6789,広島県,広島市中区,52,大学教授,卓球,男性
佐々木 美穂,miho.sasaki@example.com,090-3456-7890,宮城県,仙台市青葉区,36,主婦,フィットネス,女性
木村 拓也,takuya.kimura@example.com,080-4567-8901,福井県,福井市,30,営業職,フットサル,男性
林 真理子,mariko.hayashi@example.com,070-5678-9012,長野県,松本市,41,作家,ハイキング,女性
清水 勇太,yuta.shimizu@example.com,090-6789-0123,岡山県,岡山市北区,34,獣医,サーフィン,男性
松本 菜々子,nanako.matsumoto@example.com,080-7890-1234,新潟県,新潟市中央区,26,バリスタ,クライミング,女性
井上 健一,kenichi.inoue@example.com,070-8901-2345,石川県,金沢市,48,建築家,剣道,男性
斎藤 由美,yumi.saito@example.com,090-9012-3456,群馬県,前橋市,39,カウンセラー,ピラティス,女性
岡田 翔太,shota.okada@example.com,080-0123-4567,三重県,津市,32,シェフ,ボクシング,男性
```


### ダミー個人情報(英語版)
同様に、英語版のダミー個人情報も作成しました。

```text
Name,Email,Mobile Phone,Address (State),Address (City),Age,Occupation,Favorite Sport,Gender
Emily Johnson,emily.johnson@example.com,202-555-0101,California,Los Angeles,28,Office Worker,Tennis,Female
Michael Smith,michael.smith@example.com,303-555-0202,Texas,Houston,35,Self-employed,Soccer,Male
Olivia Brown,olivia.brown@example.com,404-555-0303,New York,New York City,42,Teacher,Skiing,Female
William Davis,william.davis@example.com,505-555-0404,Florida,Miami,31,Engineer,Basketball,Male
Sophia Wilson,sophia.wilson@example.com,606-555-0505,Illinois,Chicago,25,Designer,Yoga,Female
James Anderson,james.anderson@example.com,707-555-0606,Pennsylvania,Philadelphia,50,Doctor,Golf,Male
Ava Taylor,ava.taylor@example.com,808-555-0707,Ohio,Columbus,29,Civil Servant,Swimming,Female
Benjamin Thomas,benjamin.thomas@example.com,909-555-0808,Georgia,Atlanta,38,Lawyer,Running,Male
Emma Martinez,emma.martinez@example.com,202-555-0909,Michigan,Detroit,33,Nurse,Volleyball,Female
Alexander Clark,alexander.clark@example.com,303-555-1010,New Jersey,Newark,45,Company Executive,Baseball,Male
Mia Rodriguez,mia.rodriguez@example.com,404-555-1111,Virginia,Richmond,27,Hairdresser,Dance,Female
Daniel Lee,daniel.lee@example.com,505-555-1212,Washington,Seattle,52,University Professor,Table Tennis,Male
Charlotte Walker,charlotte.walker@example.com,606-555-1313,Arizona,Phoenix,36,Housewife,Fitness,Female
Joseph Hall,joseph.hall@example.com,707-555-1414,Massachusetts,Boston,30,Sales Representative,Futsal,Male
Amelia Green,amelia.green@example.com,808-555-1515,Indiana,Indianapolis,41,Writer,Hiking,Female
Samuel Baker,samuel.baker@example.com,909-555-1616,Tennessee,Nashville,34,Veterinarian,Surfing,Male
Harper Adams,harper.adams@example.com,202-555-1717,Missouri,Kansas City,26,Barista,Rock Climbing,Female
David Nelson,david.nelson@example.com,303-555-1818,Wisconsin,Milwaukee,48,Architect,Martial Arts,Male
Evelyn Hill,evelyn.hill@example.com,404-555-1919,Colorado,Denver,39,Counselor,Pilates,Female
Christopher Campbell,christopher.campbell@example.com,505-555-2020,Maryland,Baltimore,32,Chef,Boxing,Male
```

## ガードレールを試す

### ダミー個人情報(日本語版)を使ってガードレールを試す
ダミー個人情報（日本語版）をソースとしてガードレールを試します。日本語と英語のプロンプトを作成し、それぞれの結果を比較します。言語モデルはすべてClaude 3.5 Sonnetを使用しました。

#### 日本語でプロンプトを作成する
以下のプロンプトを実行したところ、ガードレールによって機密情報がマスクされていることが確認できました。ただし、一部の住所（都道府県）はマスクされませんでした。また、1行目以外は年齢のカラムが欠落しています。

Promot
```text
関東地方在住者の一覧をCSVで作成してください。
```

Model response
```text
以下が関東地方在住者の一覧をCSV形式で表したものです：

名前,メールアドレス,携帯電話番号,住所(都道府県),住所(市区町村),年齢,職,好きなスポーツ,性別
佐藤 美咲,misaki.sato@example.com,090-1234-5678,東京都,新宿区,28,会社員,テニス,女性
渡辺 さくら,sakura.watanabe@example.com,080-5678-9012,神奈川県,横浜市西区,25,デザイナー,ヨガ,女性
加藤 誠,makoto.kato@example.com,090-0123-4567,埼玉県,さいたま市大宮区,45,会社役員,野球,男性
吉田 花子,hanako.yoshida@example.com,080-1234-5678,千葉県,千葉市中央区,27,美容師,ダンス,女性
斎藤 由美,yumi.saito@example.com,090-9012-3456,群馬県,前橋市,39,カウンセラー,ピラティス,女性
```

Final response
```text
以下が関東地方在住者の一覧をCSV形式で表したものです：

名前,メールアドレス,携帯電話番号,住所(都道府県),住所(市区町村),年齢,職,好きなスポーツ,性別
{NAME},{EMAIL},{PHONE},東京都,{ADDRESS},28,会社員,テニス,女性
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},デザイナー,ヨガ,女性
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},会社役員,野球,男性
{NAME},{EMAIL},{PHONE},千葉県,{ADDRESS},美容師,ダンス,女性
{NAME},{EMAIL},{PHONE},{ADDRESS},カウンセラー,ピラティス,女性
```

![日本語のソースに日本語で質問する例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/3b26e212-97dc-e0a2-32f2-cb89d9224021.png)

#### 英語でプロンプトを作成する
つづいて、英語のプロンプトを作成します。以下のプロンプトを実行したところ、ガードレールによって機密情報がマスクされていることが確認できました。今回も、1行目以外は年齢のカラムが欠落しています。
そして、群馬県の方がリストに含まれませんでした。日本語プロンプトの場合も群馬県の方が含まれたり含まれなかったりするので、言語モデルの回答に一貫性がないようです。

Promot
```text
Please create a CSV of residents living in the Kanto region.
```

Model response
```text
Here's a CSV of residents living in the Kanto region, based on the provided data:

名前,メールアドレス,携帯電話番号,住所(都道府県),住所(市区町村),年齢,職,好きなスポーツ,性別
佐藤 美咲,misaki.sato@example.com,090-1234-5678,東京都,新宿区,28,会社員,テニス,女性
渡辺 さくら,sakura.watanabe@example.com,080-5678-9012,神奈川県,横浜市西区,25,デザイナー,ヨガ,女性
加藤 誠,makoto.kato@example.com,090-0123-4567,埼玉県,さいたま市大宮区,45,会社役員,野球,男性
吉田 花子,hanako.yoshida@example.com,080-1234-5678,千葉県,千葉市中央区,27,美容師,ダンス,女性
```

Final response
```text
Here's a CSV of residents living in the {ADDRESS} region, based on the provided data:

名前,メールアドレス,携帯電話番号,住所(都道府県),住所(市区町村),年齢,職,好きなスポーツ,性別
{NAME},{EMAIL},{PHONE},{ADDRESS},28,会社員,テニス,女性
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},デザイナー,ヨガ,女性
{NAME},{EMAIL},{PHONE},{ADDRESS},会社役員,野球,男性
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},美容師,ダンス,女性
```

![日本語のソースに英語で質問する例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/4c7e8cfa-9d20-3ca5-6f55-3824d8aa86fd.png)


### ダミー個人情報(英語版)を使ってガードレールを試す
ダミー個人情報（英語版）をソースとしてガードレールを試します。日本語と英語のプロンプトを作成し、それぞれの結果を比較します。言語モデルはすべてClaude 3.5 Sonnetを使用しました。

#### 日本語でプロンプトを作成する
以下のプロンプトを実行したところ、ガードレールによって機密情報がマスクされていることが確認できました。しかし、Address (State)とAddress (City)がひとつの住所としてマスクされたか、カラムが欠落したようです。また、住所が名前としてマスクされたものもありました。

Promot
```text
アメリカ東部在住者の一覧をCSVで作成してください。
```

Model response
```text
以下は、アメリカ東部在住者のみを抽出したCSVリストです：

Name,Email,Mobile Phone,Address (State),Address (City),Age,Occupation,Favorite Sport,Gender
Olivia Brown,olivia.brown@example.com,404-555-0303,New York,New York City,42,Teacher,Skiing,Female
William Davis,william.davis@example.com,505-555-0404,Florida,Miami,31,Engineer,Basketball,Male
James Anderson,james.anderson@example.com,707-555-0606,Pennsylvania,Philadelphia,50,Doctor,Golf,Male
Ava Taylor,ava.taylor@example.com,808-555-0707,Ohio,Columbus,29,Civil Servant,Swimming,Female
Benjamin Thomas,benjamin.thomas@example.com,909-555-0808,Georgia,Atlanta,38,Lawyer,Running,Male
Emma Martinez,emma.martinez@example.com,202-555-0909,Michigan,Detroit,33,Nurse,Volleyball,Female
Alexander Clark,alexander.clark@example.com,303-555-1010,New Jersey,Newark,45,Company Executive,Baseball,Male
Mia Rodriguez,mia.rodriguez@example.com,404-555-1111,Virginia,Richmond,27,Hairdresser,Dance,Female
Charlotte Walker,charlotte.walker@example.com,606-555-1313,Massachusetts,Boston,36,Housewife,Fitness,Female
Joseph Hall,joseph.hall@example.com,707-555-1414,Massachusetts,Boston,30,Sales Representative,Futsal,Male
Amelia Green,amelia.green@example.com,808-555-1515,Indiana,Indianapolis,41,Writer,Hiking,Female
Samuel Baker,samuel.baker@example.com,909-555-1616,Tennessee,Nashville,34,Veterinarian,Surfing,Male
Evelyn Hill,evelyn.hill@example.com,404-555-1919,Maryland,Baltimore,39,Counselor,Pilates,Female

このリストには、一般的にアメリカ東部と考えられる州（ニューヨーク、フロリダ、ペンシルベニア、オハイオ、ジョージア、ミシガン、ニュージャージー、バージニア、マサチューセッツ、インディアナ、テネシー、メリーランド）に住んでいる人々が含まれています。
```

Final response
```text
以下は、アメリカ東部在住者のみを抽出したCSVリストです：

Name,Email,Mobile Phone,Address (State),Address (City),Age,Occupation,Favorite Sport,Gender
{NAME},{EMAIL},{PHONE},{ADDRESS},{AGE},Teacher,Skiing,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},{AGE},Engineer,Basketball,Male
{NAME},{EMAIL},{PHONE},{ADDRESS},{AGE},Doctor,Golf,Male
{NAME},{EMAIL},{PHONE},{ADDRESS},{AGE},Civil Servant,Swimming,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},Atlanta,{AGE},Lawyer,Running,Male
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},{AGE},Nurse,Volleyball,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},45,Company Executive,Baseball,Male
{NAME},{EMAIL},{PHONE},{NAME},{AGE},Hairdresser,Dance,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},36,Housewife,Fitness,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},30,Sales Representative,Futsal,Male
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},41,Writer,Hiking,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},34,Veterinarian,Surfing,Male
{NAME},{EMAIL},{PHONE},{NAME},39,Counselor,Pilates,Female

このリストには、一般的にアメリカ東部と考えられる州（ニューヨーク、{ADDRESS}、{ADDRESS}、{ADDRESS}、{ADDRESS}、{ADDRESS}、{ADDRESS}、{ADDRESS}、{ADDRESS}、{ADDRESS}、{ADDRESS}、{ADDRESS}。```
```

![英語のソースに日本語で質問する例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/0bfcd849-a13c-aa8f-6ca3-eb4173d49cf7.png)

#### 英語でプロンプトを作成する
以下のプロンプトを実行したところ、ガードレールによって機密情報がマスクされていることが確認できました。こちらも、一部の住所が名前としてマスクされたものがありました。

Promot
```text
Please create a CSV of residents living in the Eastern United States.
```

Model response
```text
Here's a CSV of residents living in the Eastern United States, extracted from the provided data:

Name,Email,Mobile Phone,Address (State),Address (City),Age,Occupation,Favorite Sport,Gender
Olivia Brown,olivia.brown@example.com,404-555-0303,New York,New York City,42,Teacher,Skiing,Female
William Davis,william.davis@example.com,505-555-0404,Florida,Miami,31,Engineer,Basketball,Male
James Anderson,james.anderson@example.com,707-555-0606,Pennsylvania,Philadelphia,50,Doctor,Golf,Male
Ava Taylor,ava.taylor@example.com,808-555-0707,Ohio,Columbus,29,Civil Servant,Swimming,Female
Benjamin Thomas,benjamin.thomas@example.com,909-555-0808,Georgia,Atlanta,38,Lawyer,Running,Male
Emma Martinez,emma.martinez@example.com,202-555-0909,Michigan,Detroit,33,Nurse,Volleyball,Female
Alexander Clark,alexander.clark@example.com,303-555-1010,New Jersey,Newark,45,Company Executive,Baseball,Male
Mia Rodriguez,mia.rodriguez@example.com,404-555-1111,Virginia,Richmond,27,Hairdresser,Dance,Female
Charlotte Walker,charlotte.walker@example.com,606-555-1313,Massachusetts,Boston,36,Housewife,Fitness,Female
Joseph Hall,joseph.hall@example.com,707-555-1414,Massachusetts,Boston,30,Sales Representative,Futsal,Male
Amelia Green,amelia.green@example.com,808-555-1515,Indiana,Indianapolis,41,Writer,Hiking,Female
Samuel Baker,samuel.baker@example.com,909-555-1616,Tennessee,Nashville,34,Veterinarian,Surfing,Male
Evelyn Hill,evelyn.hill@example.com,404-555-1919,Maryland,Baltimore,39,Counselor,Pilates,Female
```

Final response
```
Here's a CSV of residents living in the {ADDRESS}, extracted from the provided data:

Name,Email,Mobile Phone,Address (State),Address (City),Age,Occupation,Favorite Sport,Gender
{NAME},{EMAIL},{PHONE},{ADDRESS},{AGE},Teacher,Skiing,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},{AGE},Engineer,Basketball,Male
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},{AGE},Doctor,Golf,Male
{NAME},{EMAIL},{PHONE},{ADDRESS},{AGE},Civil Servant,Swimming,Female
{NAME},{EMAIL},{PHONE},{NAME},{AGE},Lawyer,Running,Male
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},{AGE},Nurse,Volleyball,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},{AGE},Company Executive,Baseball,Male
{NAME},{EMAIL},{PHONE},{ADDRESS},{NAME},{AGE},Hairdresser,Dance,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},36,Housewife,Fitness,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},30,Sales Representative,Futsal,Male
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},41,Writer,Hiking,Female
{NAME},{EMAIL},{PHONE},{ADDRESS},34,Veterinarian,Surfing,Male
{NAME},{EMAIL},{PHONE},{NAME},39,Counselor,Pilates,Female
```

![英語のソースに英語で質問する例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/11a132e1-7c20-0b7c-f8ad-d7d5042e0d7e.png)


### ダミー個人情報(日本語版)をJSON形式にしてガードレールを試す

CSVのダミー個人情報をJSON形式に変換してガードレールを試します。各プロパティがキーと値で構成されるJSONのほうが、機密情報をマスクする際の誤判定を防ぐことができるのではと考えました。

```json
{
    "users": [
      {
        "名前": "佐藤 美咲",
        "メールアドレス": "misaki.sato@example.com",
        "携帯電話番号": "090-1234-5678",
        "住所": {
          "都道府県": "東京都",
          "市区町村": "新宿区"
        },
        "年齢": 28,
        "職": "会社員",
        "好きなスポーツ": "テニス",
        "性別": "女性"
      },
      {
        "名前": "鈴木 健太",
        "メールアドレス": "kenta.suzuki@example.com",
        "携帯電話番号": "080-2345-6789",
        "住所": {
          "都道府県": "大阪府",
          "市区町村": "大阪市中央区"
        },
        "年齢": 35,
        "職": "自営業",
        "好きなスポーツ": "サッカー",
        "性別": "男性"
      },
(以降省略)
```

以下のプロンプトを実行したところ、CSVデータのときと同様に都道府県や年齢がマスクされなかったり、関東地方として挙げた一覧の一部がマスクされてしまったりと、不安定な回答になりました。

Prompt
```text
関東地方在住者の一覧をCSVで作成してください。
```

Model response
```
はい、関東地方（東京都、神奈川県、千葉県、埼玉県、茨城県、栃木県、群馬県）在住者の一覧をCSVで作成いたします。以下が結果です：

名前,メールアドレス,携帯電話番号,都道府県,市区町村,年齢,職,好きなスポーツ,性別
佐藤 美咲,misaki.sato@example.com,090-1234-5678,東京都,新宿区,28,会社員,テニス,女性
渡辺 さくら,sakura.watanabe@example.com,080-5678-9012,神奈川県,横浜市西区,25,デザイナー,ヨガ,女性
加藤 誠,makoto.kato@example.com,090-0123-4567,埼玉県,さいたま市大宮区,45,会社役員,野球,男性
吉田 花子,hanako.yoshida@example.com,080-1234-5678,千葉県,千葉市中央区,27,美容師,ダンス,女性
斎藤 由美,yumi.saito@example.com,090-9012-3456,群馬県,前橋市,39,カウンセラー,ピラティス,女性

この一覧には、提供されたデータの中から関東地方に住んでいる人々の情報が含まれています。茨城県と栃木県の住民はデータに含まれていなかったため、リストには表示されていません。
```

Final response
```
はい、関東地方（東京都、神奈川県、千葉県、埼玉県、{ADDRESS}、栃木県、群馬県）在住者の一覧をCSVで作成いたします。以下が結果です：

名前,メールアドレス,携帯電話番号,都道府県,市区町村,年齢,職,好きなスポーツ,性別
{NAME},{EMAIL},{PHONE},東京都,{ADDRESS},会社員,テニス,女性
{NAME},{EMAIL},{PHONE},神奈川県,{ADDRESS},デザイナー,ヨガ,女性
{NAME},{EMAIL},{PHONE},埼玉県,{ADDRESS},会社役員,野球,男性
{NAME},{EMAIL},{PHONE},千葉県,{ADDRESS},美容師,ダンス,女性
{NAME},{EMAIL},{PHONE},{ADDRESS},{ADDRESS},39,カウンセラー,ピラティス,女性

この一覧には、提供されたデータの中から関東地方に住んでいる人々の情報が含まれています。{ADDRESS}、リストには表示されていません。
```


![JSON形式のソースデータを使用した例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61809/65e23909-3515-bb0a-bf3e-18939d98a20e.png)


### コードで書いてみる
以下のコードは、コマンドライン引数で入力されたテキストに対して、Amazon Bedrock Guardrailsを使って回答を生成するものです。
Converse APIであれば、guardrailConfigを指定することでGuardrailを適用できます。

```python:app.py
import json
import logging
import sys

import boto3
from botocore.exceptions import ClientError

logging.basicConfig(format="%(asctime)s [%(levelname)s] %(message)s", level=logging.INFO)
logger = logging.getLogger(__name__)


def get_bedrock_client():
    """Bedrock クライアントを取得する"""
    return boto3.client(service_name="bedrock-runtime", region_name="us-east-1")

def generate_response(input_text: str) -> str:
    """応答を生成する"""
    bedrock_client = get_bedrock_client()

    messages = [{"role": "user", "content": [{"text": f"{input_text}"}]}]

    modelid = "anthropic.claude-3-5-sonnet-20240620-v1:0"

    inference_config = {
        "temperature": 0,
        "maxTokens": 500,
        "topP": 0.99,
    }

    guardrail_id = "xxxxxxxxxxxx" # Guardrail IDを指定する
    guardrail_version = "DRAFT"   # Guardrail Versionを指定する

    guardrail_config = {
        "guardrailIdentifier": guardrail_id,
        "guardrailVersion": guardrail_version,
        "trace": "enabled"
    }

    try:
        response_body = bedrock_client.converse(
            messages=messages,
            modelId=modelid,
            inferenceConfig=inference_config,
            guardrailConfig=guardrail_config
        )

        logger.info("Usage: %s",  json.dumps(response_body['usage'], indent=2, ensure_ascii=False))
        logger.info("Output: %s", json.dumps(response_body['output'], indent=2, ensure_ascii=False))
        logger.info("stopReason: %s", json.dumps(response_body['stopReason'], indent=2, ensure_ascii=False))
        logger.info("Trace: %s", json.dumps(response_body['trace'], indent=2, ensure_ascii=False))

        return response_body['output']['message']['content'][0]['text']

    except Exception as e:
        logger.error("Failed to generate response: %s", e)
        raise


def main():
    # コマンドライン引数を取得する
    if len(sys.argv) < 2:
        print("Usage: python3 ./app.py <input_text>")
        sys.exit(1)

    input_text = sys.argv[1]

    logger.info("Original query: %s", input_text)


    try:
        print("Final response: " f"{generate_response(input_text)}")


    except ClientError  as err:
        message = err.response['Error']['Message']
        logger.error("A client error occurred: %s", message)


if __name__ == "__main__":
    main()
```

#### 日本語プロンプトの結果

郵便番号はマスクされましたが、なぜか住所はマスクされませんでした。

```shell
❯ python ./app.py "IPAの連絡先を教えて。"
2024-10-12 01:03:26,897 [INFO] Original query: IPAの連絡先を教えて。
2024-10-12 01:03:26,945 [INFO] Found credentials in shared credentials file: ~/.aws/credentials
2024-10-12 01:03:35,816 [INFO] Usage: {
  "inputTokens": 19,
  "outputTokens": 298,
  "totalTokens": 317
}
2024-10-12 01:03:35,816 [INFO] Output: {
  "message": {
    "role": "assistant",
    "content": [
      {
        "text": "IPAは、独立行政法人情報処理推進機構(Information-technology Promotion Agency, Japan)の略称です。以下にIPAの主な連絡先情報を記載します：\n\n1. 本部所在地：\n{ADDRESS}\n東京都文京区本駒込2-28-8\n文京グリーンコートセンターオフィス\n\n2. 電話番号：\n{PHONE}\n\n3. FAX番号：\n{PHONE}\n\n4. Webサイト：\n{URL}\n\n5. 一般的な問い合わせ：\n{URL}\n（ウェブサイト上の問い合わせフォームを利用）\n\n具体的な部署や目的によって連絡先が異なる場合がありますので、詳細については公式ウェブサイトで確認することをお勧めします。また、営業時間や休業日についても公式サイトで最新情報を確認してください。"
      }
    ]
  }
}
2024-10-12 01:03:35,816 [INFO] stopReason: "guardrail_intervened"
2024-10-12 01:03:35,817 [INFO] Trace: {
  "guardrail": {
    "modelOutput": [
      "{\"id\":\"msg_bdrk_01V5pFDSuTMjwZRZ9LHd9w3C\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"IPAは、独立行政法人情報処理推進機構(Information-technology Promotion Agency, Japan)の略称です。以下にIPAの主な連絡先情報を記載します：\\n\\n1. 本部所在地：\\n〒113-6591\\n東京都文京区本駒込2-28-8\\n文京グリーンコートセンターオフィス\\n\\n2. 電話番号：\\n03-5978-7501（代表）\\n\\n3. FAX番号：\\n03-5978-7510\\n\\n4. Webサイト：\\nhttps://www.ipa.go.jp/\\n\\n5. 一般的な問い合わせ：\\nhttps://www.ipa.go.jp/about/contact/index.html\\n（ウェブサイト上の問い合わせフォームを利用）\\n\\n具体的な部署や目的によって連絡先が異なる場合がありますので、詳細については公式ウェブサイトで確認することをお勧めします。また、営業時間や休業日についても公式サイトで最新情報を確認してください。\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":19,\"output_tokens\":298}}"
    ],
    "inputAssessment": {
      "qxug23uqmi11": {}
    },
    "outputAssessments": {
      "qxug23uqmi11": [
        {
          "sensitiveInformationPolicy": {
            "piiEntities": [
              {
                "match": "〒113-6591",
                "type": "ADDRESS",
                "action": "ANONYMIZED"
              },
              {
                "match": "03-5978-7501（代表）",
                "type": "PHONE",
                "action": "ANONYMIZED"
              },
              {
                "match": "03-5978-7510",
                "type": "PHONE",
                "action": "ANONYMIZED"
              },
              {
                "match": "https://www.ipa.go.jp/",
                "type": "URL",
                "action": "ANONYMIZED"
              },
              {
                "match": "https://www.ipa.go.jp/about/contact/index.html",
                "type": "URL",
                "action": "ANONYMIZED"
              }
            ]
          }
        }
      ]
    }
  }
}
Final response: IPAは、独立行政法人情報処理推進機構(Information-technology Promotion Agency, Japan)の略称です。以下にIPAの主な連絡先情報を記載します：

1. 本部所在地：
{ADDRESS}
東京都文京区本駒込2-28-8
文京グリーンコートセンターオフィス

2. 電話番号：
{PHONE}

3. FAX番号：
{PHONE}

4. Webサイト：
{URL}

5. 一般的な問い合わせ：
{URL}
（ウェブサイト上の問い合わせフォームを利用）

具体的な部署や目的によって連絡先が異なる場合がありますので、詳細については公式ウェブサイトで確認することをお勧めします。また、営業時間や休業日についても公式サイトで最新情報を確認してください。
```

#### 英語プロンプトの結果
こちらは、すべての機密情報がマスクされたようです。

```shell
❯ python ./invoke_converse.py "Tell us the contact information for Google in the US region."
2024-10-12 01:10:02,932 [INFO] Original query: Tell us the contact information for Google in the US region.
2024-10-12 01:10:02,967 [INFO] Found credentials in shared credentials file: ~/.aws/credentials
2024-10-12 01:10:10,505 [INFO] Usage: {
  "inputTokens": 19,
  "outputTokens": 231,
  "totalTokens": 250
}
2024-10-12 01:10:10,505 [INFO] Output: {
  "message": {
    "role": "assistant",
    "content": [
      {
        "text": "Here is some general contact information for Google in the {ADDRESS}:\n\n1. Mailing Address:\nGoogle LLC\n{ADDRESS}\n\n2. Phone: {PHONE} (This is the main switchboard number for Google's headquarters)\n\n3. Website: {URL}\n\n4. For press inquiries: {EMAIL}\n\n5. For business-related inquiries: {URL}. For advertising-related inquiries: {URL}. For general support: {URL}\n\nPlease note that Google generally prefers users to contact them through their online support channels rather than by phone or mail. They have specific support pages and contact forms for different products and services, which can be found on their website.\n\nFor more specific inquiries or issues, it's best to visit Google's official support page and select the appropriate product or service for tailored assistance."
      }
    ]
  }
}
2024-10-12 01:10:10,505 [INFO] stopReason: "guardrail_intervened"
2024-10-12 01:10:10,505 [INFO] Trace: {
  "guardrail": {
    "modelOutput": [
      "{\"id\":\"msg_bdrk_01WTA1cywaE3UncURVHDsFUK\",\"type\":\"message\",\"role\":\"assistant\",\"model\":\"claude-3-5-sonnet-20240620\",\"content\":[{\"type\":\"text\",\"text\":\"Here is some general contact information for Google in the US:\\n\\n1. Mailing Address:\\nGoogle LLC\\n1600 Amphitheatre Parkway\\nMountain View, CA 94043\\nUSA\\n\\n2. Phone: 1-650-253-0000 (This is the main switchboard number for Google's headquarters)\\n\\n3. Website: www.google.com\\n\\n4. For press inquiries: press@google.com\\n\\n5. For business-related inquiries: https://www.google.com/services/\\n\\n6. For advertising-related inquiries: https://ads.google.com/home/\\n\\n7. For general support: https://support.google.com/\\n\\nPlease note that Google generally prefers users to contact them through their online support channels rather than by phone or mail. They have specific support pages and contact forms for different products and services, which can be found on their website.\\n\\nFor more specific inquiries or issues, it's best to visit Google's official support page and select the appropriate product or service for tailored assistance.\"}],\"stop_reason\":\"end_turn\",\"stop_sequence\":null,\"usage\":{\"input_tokens\":19,\"output_tokens\":231}}"
    ],
    "inputAssessment": {
      "qxug23uqmi11": {}
    },
    "outputAssessments": {
      "qxug23uqmi11": [
        {
          "sensitiveInformationPolicy": {
            "piiEntities": [
              {
                "match": "US",
                "type": "ADDRESS",
                "action": "ANONYMIZED"
              },
              {
                "match": "1600 Amphitheatre Parkway\nMountain View, CA 94043\nUSA",
                "type": "ADDRESS",
                "action": "ANONYMIZED"
              },
              {
                "match": "1-650-253-0000",
                "type": "PHONE",
                "action": "ANONYMIZED"
              },
              {
                "match": "www.google.com",
                "type": "URL",
                "action": "ANONYMIZED"
              },
              {
                "match": "press@google.com",
                "type": "EMAIL",
                "action": "ANONYMIZED"
              },
              {
                "match": "https://www.google.com/services/\n\n6",
                "type": "URL",
                "action": "ANONYMIZED"
              },
              {
                "match": "https://ads.google.com/home/\n\n7",
                "type": "URL",
                "action": "ANONYMIZED"
              },
              {
                "match": "https://support.google.com/",
                "type": "URL",
                "action": "ANONYMIZED"
              }
            ]
          }
        }
      ]
    }
  }
}
Final response: Here is some general contact information for Google in the {ADDRESS}:

1. Mailing Address:
Google LLC
{ADDRESS}

2. Phone: {PHONE} (This is the main switchboard number for Google's headquarters)

3. Website: {URL}

4. For press inquiries: {EMAIL}

5. For business-related inquiries: {URL}. For advertising-related inquiries: {URL}. For general support: {URL}

Please note that Google generally prefers users to contact them through their online support channels rather than by phone or mail. They have specific support pages and contact forms for different products and services, which can be found on their website.

For more specific inquiries or issues, it's best to visit Google's official support page and select the appropriate product or service for tailored assistance.
```

# まとめ
Amazon Bedrock Guardrailsを使って、Sensitive information filtersを試してみました。日本語、英語ともに、住所や電話番号などの機密情報がマスクされていることが確認できました。ただし、住所が名前としてマスクされたり、一部の住所がマスクされなかったりするなど、意図しない結果もありました。
Guardrailsは英語のみ対応しているため、日本語の処理に弱いことは想定していましたが、英語の出力においても不安定な出力となりました。
今回は簡易なプロンプトで試しましたが、実際の業務で使用する際にはシステムプロンプトに秘匿したい情報の例を与えることで、より適切な結果を得ることができるかもしれません。
そして、日本語対応も期待したいところです。