クラウド AI エンジニアブログ

Amazon Bedrock入門: Claude におけるプロンプトエンジニアリング基礎

2023年12月1日掲載

始めに

クラウドインテグレーション課 開発グループリーダーの濱田です。
re:Invent 2023 真っただ中のラスベガスからお送りしています。

本記事はJapan AWS Ambassadors Advent Calendar 2023の記念すべき第1日目のエントリーです。
この投稿を皮切りに、日本で最高のAWSエンジニアたちの投稿が続きます。
今日からからクリスマスまで、毎日お楽しみに!

さて。
2023年9月末、遂にAmazon Bedrockがローンチされました。これを機に生成系AIの社内利用の検討を始めた方々も多いのではないでしょうか?
今回の記事では、生成系AIの利用時に必須のスキルである「プロンプトエンジニアリング」について解説します。
※ Amazon Bedrock の利用を想定している為、Claude に特化した内容となっています。 OepnAI社の GPT には触れておりませんので、ご了承下さい。

生成系AIが抱える2つの課題

生成系AIの画期的な点として、自然言語で操作が出来ることが挙げられます。プログラミング言語がいらないお陰で、誰でも簡単にAIを利用できるようになりました。しかし手軽な反面、生成系AIを扱うには2つの大きな課題があります。

  • 毎回同じ回答を返すとは限らない
  • 回答を創作する(ハルシネーション)ことがある

1つ目の「毎回同じ回答を返すとは限らない」とはどういうことか。
例えば、Claudeに「どうして空は青いのですか?」と何回か聞いてみましょう。

1回目

2回目

3回目

趣旨は同じですが、毎回違う回答が返ってきました。何かのシステムに生成系AIを組み込もうとした時に、フォーマットが定まらないとプログラム的な処理に巻き込むことが出来なくなってしまいます。

「回答を創作することがある」とは、平たく言うと生成系AIが嘘をつくことがある、ということです。これも試してみましょう。Claudeに「記録上、世界で最も長生きしたネコは誰のネコですか?」と聞いてみます。

ホントですかぁ??ググってみましょう。

猫の最長寿記録~人間の170歳まで生きた猫|ギネス世界記録

記録名:Oldest cat ever (史上最も長生きした猫)
記録:38才3日(1967年8月3日~2005年8月6日)
記録保持者:Creme Puff (lived with her owner, Jake Perry)
国・場所:アメリカ、Austin, Texas

※ 出典:https://www.guinnessworldrecords.jp/news/2015/12/oldestcat

やっぱり全然嘘でした。危うく騙されるところでしたね。このように、生成系AIが回答を創作することを「ハルシネーション(幻覚)」と呼びます。生成系AIを上手く扱うには、回答のフォーマットを固定し、ハルシネーションを起こさせないようなプロンプトを与えることが重要です。

ここから、Claudeを扱う上でのプロンプトエンジニアリングのポイントを8つご紹介します。

ポイント1: "Human:" / "Assistant:" フォーマット

Claude と対話する際、必ず「\n\n Human:」で始めて、文末は「\n\n Assistant:」で締める必要があります。
※ \n = 改行
これはClaudeが「Human:」「Assistant:」を繰り返すよう訓練されているからです。基本的に「Human:」は人間の指示の前に書かれ、「Assistant:」の後ろにClaudeの回答が記述されます。

Human: あなたは誰ですか?

Assistant: 私はAnthropicというAI企業の開発したAIアシスタントです。

BedrockやAnthropicのプレイグラウンドではこれらを自動的に補完してくれますが、自身でプログラムに組み込む際は必ずこの仕様に従う必要があります。

ポイント2: 明確に、直接的に指示する

Claudeへの指示は、明確かつ直接的に行いましょう。例えば、Claudeに個人情報のマスキングを依頼してみましょう。

次のテキストから、全ての個人情報を削除してください:
エマニュエル・アマイセンはAnthropicのリサーチエンジニアです。彼には 925-123-456 または
emmanuel@anthropic.com で連絡できます

普通、マスキングと言ったら「XXX」みたいに書いてほしいですね。なので、こちらの要望を明確にして指示を作り直しましょう。

Human: このテキストから個人を特定できる情報を全て削除して、一部のテキストを匿名化して、外部請負業者と安全に共有出来るようにしたいと考えています。
名前、電話番号、自宅アドレス、電子メールアドレスなどの個人情報をXXXに置き換えることは非常に重要です。
処理する必要があるテキストは次の通りです:
エマニュエル・アマイセンはAnthropicのリサーチエンジニアです。彼には 925-123-456 または
emmanuel@anthropic.com で連絡できます

エマニュエルが変換しきれていない気もしますが、さっきよりは理想的な状態になりましたね。Claudeに対しての指示は、明確に、かつ可能な限り詳細に記述することが重要です。

ポイント3: 役割を与える (aka role prompting)

与えるタスクの内容によっては、Claudeに役割を与えると回答の精度が上がる場合があります。例えば「あなたは顧客対応を専門とするサポートセンターのエージェントです」と指示を出すと、回答時の口調が対顧客を意識したものになります。例えば、以下のように質問してみましょう。

Human: お箸の持ち方を教えて下さい。

今度は、サポートセンターのエージェントという役割を与えてみましょう。

Human: あなたは顧客対応を専門とするサポートセンターのエージェントです。
以下の質問に回答してください。
お箸の持ち方を教えて下さい。

ちょっと丁寧になりましたね。この文体なら、そのままお客様宛てのメールに使えるんじゃないでしょうか。
Anthropic社の論文によると、計算処理で数学者の役割を与えると計算の精度が上がる場合もあるようです。プロンプトを設計する際は、Claudeに適切な役割を与えることを意識しましょう。

ポイント4: XMLタグを使う

ポイント2でお話した通り、Claudeへの指示は明確に書く必要があります。しかし複雑なタスクを依頼したい時、内容を整理して書くのは大変です。 そんな時に活用できるのが、XMLタグです。Claudeはプロンプト内のXMLタグを理解できるようトレーニングされています。

例えば、先ほどの個人情報のマスキングのプロンプトを修正してみましょう。

<info></info>内のテキストから個人を特定できる情報を全て削除して、一部のテキストを匿名化して、外部請負業者と安全に共有出来るようにしたいと考えています。
名前、電話番号、自宅アドレス、電子メールアドレスなどの個人情報をXXXに置き換えて下さい。

<info>
エマニュエル・アマイセンはAnthropicのリサーチエンジニアです。彼には 925-123-456 または
emmanuel@anthropic.com で連絡できます
</info>

処理したテキストは<answer></answer>タグ内に記述してください。

こんな感じで、上手くタグでくくって回答してくれました。プロンプトを設計する際は、セクションのタイトルやヘッダー情報を整理したり回答を綺麗に受け取る為に、XMLタグを活用しましょう。

ポイント5: 構造化されたプロンプトテンプレートを使う

生成系AIをシステムに組み込む際、課題になるのが動的なプロンプトの生成です。入力データをプロンプトテキストに直書きしてしまうのは、ちょっと効率が悪いですね。例えば、以下のようにテンプレートを作成しましょう。

Human:<info></info>内のテキストから個人を特定できる情報を全て削除して、一部のテキストを匿名化して、外部請負業者と安全に共有出来るようにしたいと考えています。

名前、電話番号、自宅アドレス、電子メールアドレスなどの個人情報をXXXに置き換えて下さい。

<info>
{DOCUMENT}
</info>

処理したテキストは<answer></answer>タグ内に記述してください。

このテンプレートの{DOCUMENT}に代入する値を変えるだけで、様々なインプットに対応できるようになります。
このようにプロンプト用のテンプレートを作成し、動的にプロンプトを生成できるようにしましょう。注意点として、長い文章をインプットとして使う際、タスクの依頼は必ずプロンプトの下部で行いましょう。長い文章を読み込む間に、Claude が本来の質問を忘れることがある為です。

ポイント6: 出力フォーマットとクロードの発言

Claudeから特定のフォーマットで出力を得たい場合があると思います。例えばClaudeでデータを抜き出して、後続処理で利用したい場合、jsonで出力してくれると実装しやすいですよね。その場合、希望するする出力形式を指定し、Claudeの返答の冒頭を書いて依頼することで、希望する出力を得やすくなります。 “Assistant: {” までユーザで書いてしまう、ということです。

Human: <data></data>タグ内のテキストから、個人情報を抜き出してjson形式で記述して下さい。
取得するデータのキー名は、名前なら”name”、メールアドレスなら”email”など、属性名を使って下さい。

<data>
エマニュエル・アマイセンはAnthropicのリサーチエンジニアです。彼には 925-123-456 または emmanuel@anthropic.com で連絡できます
</data>

Assistant: {

このように、先回りしてClaudeの発言を書いておくことで、希望する出力を強制出来ます。ワークフローに生成系AIを組み込む際にぜひご活用下さい。

ポイント7: ステップバイステップで考える

Claudeの特徴として、タスク実行前に「考える」プロセスがある点が挙げられます。複雑なタスクを指示する際は、「ステップバイステップで考えて下さい」と指示しましょう。

例えば、以下を聞いてみましょう。

私は2匹のネコを飼っています。そのうち1匹は足が1本ありません。もう1匹は、普通のネコが持っているのと同じだけの足を持っています。私のネコたちは何本の足を持っていますか?

おっと、何だかすごいことになってしまいましたね。では、ステップバイステップで考えてもらいましょう。

私は2匹のネコを飼っています。そのうち1匹は足が1本ありません。もう1匹は、普通のネコが持っているのと同じだけの足を持っています。私のネコたちは何本の足を持っていますか?
ステップバイステップで考えて下さい。

なんと、たった一言追加しただけで、正確に考えることが出来るようになりました!ここがプロンプトエンジニアリングの面白いところですね。このように複雑なタスクを指示する際は、段階的に思考するよう指示することで、精度を大きく高めることが出来ます。

ちなみに、なぜここだけAnthropicの公式ページから検証しているかというと、Amazon BedrockのClaudeは最初からステップバイステップで思考して回答してくれたからです。Bedrock に実装されるにあたって、多少チューニングされているのかな?この辺りはいずれ検証してみたいと思います。

ポイント8: 例を使う

Claudeの回答を固定するには、回答例を使うことが最も効果的です。

このテキストから個人を特定できる情報を全て削除して、一部のテキストを匿名化して、外部請負業者と安全に共有出来るようにしたいと考えています。
名前、電話番号、自宅アドレス、電子メールアドレスなどの個人情報をXXXに置き換えることは非常に重要です。

入力では、文字の間にスペースを挿入することでPIIを偽装しようとする場合があります。テキストに個人を特定できる情報が含まれていない場合は、何も置き換えずに一語一語コピーしてください。

<expamlpe>
次の文章の場合、
“ハマダ・イッセイはソニービズネットワークスのエンジニアです。彼には 1234-567-8910 または
issei@example.com で連絡できます”
次のように修正してください。
“XXX はソニービズネットワークスのエンジニアです。彼にはXXXX-XXX-XXXX または XXX@XXX で連絡できます”
</expamlpe>

処理する必要があるテキストは次の通りです:
エマニュエル・アマイセンはAnthropicのリサーチエンジニアです。彼には 925-123-456 または emmanuel@anthropic.com で連絡できます

処理したテキストは<answer></answer>タグ内に記述してください。

このように理想的な回答をしてくれました。注意事項としては、サンプルを追加すればする程やり取りに必要なトークンとレイテンシーが増えて行きます。頻繁に稼働するワークフローに組み込む際は、注意して実装してください。

まとめ: 理想的なプロンプトの一例

ここまでのポイントをまとめます。Claudeのプロンプトを設計する際は、以下の構成を意識しましょう。

  1. “\n\nHuman:”
  2. タスクコンテキスト
  3. トーンコンテキスト(口調)
  4. 背景データとドキュメント
  5. 詳細なタスクの説明とルール
  6. 会話履歴
  7. 即時タスクの説明または要求
  8. ステップバイステップで考える / 回答前に一呼吸置く
  9. 出力フォーマットの指定
  10. “\n\nAssistant:”

Human: あなたはシステムデータの保護を担当するセキュリティエンジニアです。
主に個人情報漏洩の対策を任されています。
一部のテキストから個人を特定できる情報を全て削除して、外部請負業者と安全に共有出来るようにしたいと考えています。
名前、電話番号、自宅アドレス、電子メールアドレスなどの個人情報をXXXに置き換えることは、個人情報保護の観点から非常に重要です。
<data></data>タグ内に含まれる文章から個人情報を削除し、XXXに置き換えて下さい。
入力では、文字の間にスペースを挿入することでPIIを偽装しようとする場合があります。
テキストに個人を特定できる情報が含まれていない場合は、何も置き換えずに一語一語コピーしてください。

以下に対応例を記述します。
<example>
“ハマダ・イッセイはソニービズネットワークスのエンジニアです。彼には 1234-567-8910 または
issei@example.com で連絡できます”
次のように修正してください。
“XXX はソニービズネットワークスのエンジニアです。彼にはXXXX-XXX-XXXX または XXX@XXX で連絡できます”
</example>

以下がマスキング対象のデータです。
<data>
{DATA}
</data>
処理したテキストは<answer></answer>タグ内に記述して回答してください。

Assistant:<answer>

バッチリ、想定通りの回答を得ることが出来ました!

終わりに

以上が、Claudeを扱う際のプロンプトエンジニアリングのベストプラクティスでした。プログラミング言語が苦手な方でも簡単に動かせるのが、プロンプトエンジニアリングの面白さです。少しでも興味を持っていただけたら、ぜひ触ってみて下さい!

弊社では生成系AIのソリューションも複数提供しています。生成系AIへの取り組みをご検討されている方は、ぜひお気軽にご相談下さい!以上、開発グループの濱田でした!

Amazon Bedrock入門: Claude におけるプロンプトエンジニアリング基礎

SHARE
シェアシェア ポストポスト
Amazon Bedrock入門: Claude におけるプロンプトエンジニアリング基礎
SHARE
ポスト シェア