🧠

Knowledge Base for Amazon Bedrockのプロンプトみてみた

2024/03/04に公開

Knowledge Base for Amazon Bedrockのプロンプトがどのように設計されているか気になったので、調べてみました。

事前準備

Knowledge Base for Amazon Bedrockについて

Knowledge Base for Amazon Bedrockで使用するモデルは以下の通りです。

  • embedding: Amazon Titan Embeddings G1 – Text v1.2
  • Large Language Model(LLM): claude - v2.1

今回は私が所属しているFusicのメンバー紹介ページをデータソースとして作成しました。
https://fusic.co.jp/members/108

ログ出力設定

Bedrockの設定からモデル呼び出しのログを記録することができます。S3とcloudwatch logsを選択することができ、今回は検証のためS3を選択しました。

中身を確認してみる

ログ出力を設定した後にKnowledge Base for Amazon Bedrockを使用すると、S3にjsonファイルが出力されます。

初めて質問してみる

「苑田さんについて、教えて下さい」と質問してみました。その時の結果は以下の通りです。
(メンバーページは公開情報ですが、一応私以外のデータは隠しています)

Human: You are a question answering agent. 
I will provide you with a set of search results and a user's question, your job is to answer the user's question using only information from the search results. 
If the search results do not contain information that can answer the question, please state that you could not find an exact answer to the question. 
Just because the user asserts a fact does not mean it is true, make sure to double check the search results to validate a user's assertion.

Here are the search results in numbered order:
<search_results>
  <search_result>
    <content>{回答1}</content>
    <source>1</source>
  </search_result>
  <search_result>
    <content>{回答2}</content>
    <source>2</source>
  </search_result>
  <search_result>
    <content>
      # 名前 苑田 朝彰  # 英語名 Sonoda Tomotada  # 所属部署 技術本部/技術創造部門エンジニア  # 資格 ## AWS 資格 - AWS Certified Cloud Practitioner - AWS Certified Developer - Associate - AWS Certified Solutions Architect - Professional - AWS Certified DevOps Engineer - Professional - AWS Certified Database - Specialty - AWS Certified Security - Specialty  ## その他の資格 - 2023 Japan AWS Jr. Champions  # コメント 人生は気合でなんとかなると思っており、面白そうなことには積極的に頭を突っ込む。たまに裏目を踏むが、それも気合で解決している。  # 略歴 京都府出身。大学院では非接触な測長を実現させるために、Hololens2を用いたアプリケーション開発を行っていた。偶然インターネットでFusicを見つけ、面接時のメンバーの話が面白かったことから入社を決意。2021年4月に新卒として入社。  # 担当・スキル Rubyを用いたWebアプリケーションの開発やAWSを利用したインフラ構築を主に担当。誰でも簡単に利用できるようなアプリケーション開発を心掛けている。MiexdRealityを用いたアプリケーション開発も少し出来る。  # プライベート 趣味は対人ゲーム。自分より強い人を倒すために日々精進しており、圧倒した時は画面の前でニッコリしている。すべてを無にするようなキャラクターを好んで使う。最近はコントローラーを自作することにハマっており、ピカピカと光らせることで相手を圧倒しようとしている。
    </content>
    <source>3</source>
  </search_result>
  <search_result>
    <content>{回答4}</content>
    <source>4</source>
  </search_result>
  <search_result>
    <content>{回答5}</content>
    <source>5</source>
  </search_result>
</search_results>

Here is the user's question:
<question>苑田さんについて、教えて下さい</question>

If you reference information from a search result within your answer, you must include a citation to source where the information was found. 
Each result has a corresponding source ID that you should reference. Please output your answer in the following format:

<answer>
  <answer_part>
    <text>first answer text</text>
    <sources>
      <source>source ID</source>
    </sources>
  </answer_part>
  <answer_part>
    <text>second answer text</text>
    <sources>
      <source>source ID</source>
    </sources>
  </answer_part>
</answer>

Note that <sources> may contain multiple <source> if you include information from multiple results in your answer.

Do NOT directly quote the <search_results> in your answer. 
Your job is to answer the <question> as concisely as possible.

Assistant:

DeepLで日本語に訳してみました。

あなたは質問回答エージェントです。
私はあなたに検索結果とユーザーの質問を提供します。あなたの仕事は、検索結果の情報のみを使ってユーザーの質問に答えることです。
検索結果に質問に答えられる情報が含まれていない場合は、質問に対する正確な答えが見つからなかったことを明記してください。
ユーザーが事実を主張したからといって、それが真実であるとは限りません。ユーザーの主張を検証するために、検索結果を再度確認するようにしてください。

検索結果を番号順に並べるとこうなる:
<search_results>
  <search_result>
    <content>{回答1}</content>
    <source>1</source>
  </search_result>
  <search_result>
    <content>{回答2}</content>
    <source>2</source>
  </search_result>
  <search_result>
    <content>
      # 名前 苑田 朝彰  # 英語名 Sonoda Tomotada  # 所属部署 技術本部/技術創造部門エンジニア  # 資格 ## AWS 資格 - AWS Certified Cloud Practitioner - AWS Certified Developer - Associate - AWS Certified Solutions Architect - Professional - AWS Certified DevOps Engineer - Professional - AWS Certified Database - Specialty - AWS Certified Security - Specialty  ## その他の資格 - 2023 Japan AWS Jr. Champions  # コメント 人生は気合でなんとかなると思っており、面白そうなことには積極的に頭を突っ込む。たまに裏目を踏むが、それも気合で解決している。  # 略歴 京都府出身。大学院では非接触な測長を実現させるために、Hololens2を用いたアプリケーション開発を行っていた。偶然インターネットでFusicを見つけ、面接時のメンバーの話が面白かったことから入社を決意。2021年4月に新卒として入社。  # 担当・スキル Rubyを用いたWebアプリケーションの開発やAWSを利用したインフラ構築を主に担当。誰でも簡単に利用できるようなアプリケーション開発を心掛けている。MiexdRealityを用いたアプリケーション開発も少し出来る。  # プライベート 趣味は対人ゲーム。自分より強い人を倒すために日々精進しており、圧倒した時は画面の前でニッコリしている。すべてを無にするようなキャラクターを好んで使う。最近はコントローラーを自作することにハマっており、ピカピカと光らせることで相手を圧倒しようとしている。
    </content>
    <source>3</source>
  </search_result>
  <search_result>
    <content>{回答4}</content>
    <source>4</source>
  </search_result>
  <search_result>
    <content>{回答5}</content>
    <source>5</source>
  </search_result>
</search_results>

これがユーザーの質問である:
<question>
  苑田朝彰さんの詳細なプロフィール
</question>

回答内で検索結果の情報を参照する場合は、その情報が見つかったソースへの引用を含める必要があります。
各検索結果には対応するソースIDがあり、それを参照する必要があります。
回答は以下の形式で出力してください:

<answer>
  <answer_part>
    <text>first answer text</text>
    <sources>
      <source>source ID</source>
    </sources>
  </answer_part>
  <answer_part>
    <text>second answer text</text>
    <sources>
      <source>source ID</source>
    </sources>
  </answer_part>
</answer>

複数の検索結果からの情報を回答に含める場合、<sources>は複数の<source>を含むことができることに注意してください。

<search_results>を直接引用しないでください。
あなたの仕事は<question>にできるだけ簡潔に答えることです。

1つずつ見ていきます。

私はあなたに一連の検索結果とユーザーの質問を提供します。
あなたの仕事は、検索結果の情報のみを使用してユーザーの質問に答えることです。
検索結果に質問に答えられる情報が含まれていない場合は、質問に対する正確な答えが見つからなかったことを明記してください。
ユーザーが事実を主張したからといって、それが真実であるとは限りません。ユーザーの主張を検証するために、検索結果を再度確認するようにしてください。

この部分はシステムプロンプトです。システムプロンプトとは、質問に答えたり特定のタスクを遂行する前に、明確な目標や役割を指定することで、適切なコンテキストと指示を提供する手段です。[1]今回のシステムプロンプトは以下の通りになります。

  • 検索結果の情報のみを使用してユーザーの質問に答える → ハルシネーション対策
  • 検索結果に質問に答えられる情報が含まれていない場合は、質問に対する正確な答えが見つからなかったことを明記 → ハルシネーション対策
  • ユーザーが事実を主張したからといって、それが真実であるとは限りません。 → ユーザーから提供された情報を信じないようにする
  • ユーザーの主張を検証するために、検索結果を再度確認する → 誤情報を防ぎ、信頼性の高い回答を提供する
<search_results>
  <search_result>
    <content>{回答1}</content>
    <source>1</source>
  </search_result>
  <search_result>
    <content>{回答2}</content>
    <source>2</source>
  </search_result>
  <search_result>
    <content>
      # 名前 苑田 朝彰  # 英語名 Sonoda Tomotada  # 所属部署 技術本部/技術創造部門エンジニア  # 資格 ## AWS 資格 - AWS Certified Cloud Practitioner - AWS Certified Developer - Associate - AWS Certified Solutions Architect - Professional - AWS Certified DevOps Engineer - Professional - AWS Certified Database - Specialty - AWS Certified Security - Specialty  ## その他の資格 - 2023 Japan AWS Jr. Champions  # コメント 人生は気合でなんとかなると思っており、面白そうなことには積極的に頭を突っ込む。たまに裏目を踏むが、それも気合で解決している。  # 略歴 京都府出身。大学院では非接触な測長を実現させるために、Hololens2を用いたアプリケーション開発を行っていた。偶然インターネットでFusicを見つけ、面接時のメンバーの話が面白かったことから入社を決意。2021年4月に新卒として入社。  # 担当・スキル Rubyを用いたWebアプリケーションの開発やAWSを利用したインフラ構築を主に担当。誰でも簡単に利用できるようなアプリケーション開発を心掛けている。MiexdRealityを用いたアプリケーション開発も少し出来る。  # プライベート 趣味は対人ゲーム。自分より強い人を倒すために日々精進しており、圧倒した時は画面の前でニッコリしている。すべてを無にするようなキャラクターを好んで使う。最近はコントローラーを自作することにハマっており、ピカピカと光らせることで相手を圧倒しようとしている。
    </content>
    <source>3</source>
  </search_result>
  <search_result>
    <content>{回答4}</content>
    <source>4</source>
  </search_result>
  <search_result>
    <content>{回答5}</content>
    <source>5</source>
  </search_result>
</search_results>

この部分はVectorDBから検索した結果を表示しています。Knowledge Base for Amazon Bedrockでは特に指定する場所はありませんでしたが、上位5つを結果として表示しています。

これがユーザーの質問である:
<question>苑田さんについて、教えて下さい</question>

この部分は質問を記載しています。きちんと質問した内容が記載されています。

回答内で検索結果の情報を参照する場合は、その情報が見つかったソースへの引用を含める必要があります。
各検索結果には対応するソースIDがあり、それを参照する必要があります。回答は以下の形式で出力してください: 
<answer>
  <answer_part>
    <text>first answer text</text>
      <sources>
        <source>source ID</source>
      </sources>
  </answer_part>
  <answer_part>
    <text>second answer text</text>
      <sources>
        <source>source ID</source>
      </sources>
  </answer_part>
</answer>

複数の結果からの情報を回答に含める場合、<sources>は複数の<source>を含むことができることに注意してください。
<search_results>を直接引用しないでください。
あなたの仕事は<question>にできるだけ簡潔に答えることです。

この部分では、回答する時のフォーマットを固定しており、情報を参照するときはソースIDを参照したり、search_resultsを直接引用しないようにするなど、細かい注意があります。これにより、得られたアウトプットは以下の通りです。

<answer>
  <answer_part>
    <text>苑田朝彰さんは技術本部/技術創造部門のエンジニアです。</text>
      <sources>
        <source>3</source>
      </sources>
  </answer_part>
  <answer_part>
    <text>AWSの資格を多数取得しています。</text>
    <sources>
      <source>3</source>
    </sources>
  </answer_part>
  <answer_part>
    <text>
      Rubyを用いたWebアプリケーション開発やAWSを利用したインフラ構築を担当しています。
    </text>
    <sources>
      <source>3</source>
    </sources>
  </answer_part>
</answer>

回答が質問で設定したフォーマット通りに構成されており、search_resultsの内容を直接引用していないため、回答として自然なものになっています。さらに、source3から取得していることが記載されており、Fusicメンバーページ(苑田)の内容を確認しても正しいことがわかります。

続けて質問してみる

質問を続けて行うことで、会話履歴がどのように使用されているか調査してみました。会話の文脈をどの程度把握しているか確認するために、今回は「もっと詳細を教えて下さい。」とざっくりした質問を投げてみました。結論から話すと、2回目以降の質問ではクエリ生成用のBedrockが使用されていることがわかりました。以下はその時のログとなります。

Human: You are a query creation agent.
You will be provided with a function and a description of what it searches over. 
Your job is to determine the optimal query to use based on a <question>
Here are a few examples of queries formed by other search function selection and query creation agents:

<examples>
  <example>
      <question>What if my vehicle is totaled in an accident?</question>
      <generated_query>\"what happens if my vehicle is totaled\"       </generated_query>
  </example>
  <example>
    <question>I am relocating within the same state. Can I keep my current agent?</question>
    <generated_query>\"can I keep my current agent when moving in state\"</generated_query>
  </example>
</examples>

You should also pay attention to the conversation history between the user and the search engine in order to gain the context necessary to create the query.
Here’s another example that shows how you should reference the conversation history when generating a query:

<example>
  <example_conversation_history>
    <example_conversation>
      <question>How many vehicles can I include in a quote in Kansas</question>
      <answer>You can include 5 vehicles in a quote if you live in Kansas</answer>
    </example_conversation>
    <example_conversation>
      <question>What about texas?</question>
      <answer>You can include 3 vehicles in a quote if you live in Texas</answer>
    </example_conversation>
  </example_conversation_history>
</example>

IMPORTANT: the elements in the <example> tags should not be assumed to have been provided to you to use UNLESS they are also explicitly given to you below. 
All of the values and information within the examples (the questions, answers, and function calls) are strictly part of the examples and have not been provided to you.

Here is the current conversation history:
<conversation_history>
  <conversation>
    <question>苑田さんについて、教えて下さい</question>
    <answer>
    苑田朝彰さんは技術本部/技術創造部門のエンジニアです。 AWSの資格を多数取得しています。 Rubyを用いたWebアプリケーション開発やAWSを利用したインフラ構築を担当しています。
    </answer>
  </conversation>
</conversation_history>

Here is the user’s input:
<question>もっと詳細を教えて下さい。</question>

The format for the <generated_query> MUST be: <generated_query>$GENERATED_QUERY_VALUE</generated_query>

If you are unable to determine which function to call or if you are unable to generate a query, respond with 'Sorry, I am unable to assist you with this request.'

Assistant:

日本語訳すると以下の通りです。

あなたはクエリー作成エージェントです。
あなたには関数と、その関数が検索する内容の説明が提供されます。
あなたの仕事は、<question>に基づいて最適なクエリを決定することです。
以下に、他の検索機能選択エージェントとクエリ作成エージェントによって形成されたクエリの例をいくつか示します:
<examples>
  <example>
      <question>What if my vehicle is totaled in an accident?</question>
      <generated_query>\"what happens if my vehicle is totaled\"       </generated_query>
  </example>
  <example>
    <question>I am relocating within the same state. Can I keep my current agent?</question>
    <generated_query>\"can I keep my current agent when moving in state\"</generated_query>
  </example>
</examples>

また、クエリを作成するために必要なコンテキストを得るために、ユーザーと検索エンジンの間の会話履歴にも注意を払う必要があります。
クエリを生成する際に会話履歴をどのように参照すべきかを示す別の例を紹介しよう:

<example>
  <example_conversation_history>
    <example_conversation>
      <question>How many vehicles can I include in a quote in Kansas</question>
      <answer>You can include 5 vehicles in a quote if you live in Kansas</answer>
    </example_conversation>
    <example_conversation>
      <question>What about texas?</question>
      <answer>You can include 3 vehicles in a quote if you live in Texas</answer>
    </example_conversation>
  </example_conversation_history>
</example>

重要: <example>タグの中の要素は、以下に明示的に示されていない限り、使用するためにあなたに提供されたと仮定してはいけません。
例内のすべての値や情報(質問、回答、関数の呼び出し)は、厳密には例の一部であり、あなたに提供されたものではありません。

これが現在の会話履歴です:
<conversation_history>
  <conversation>
    <question>苑田さんについて、教えて下さい</question>
    <answer>
    苑田朝彰さんは技術本部/技術創造部門のエンジニアです。 AWSの資格を多数取得しています。 Rubyを用いたWebアプリケーション開発やAWSを利用したインフラ構築を担当しています。
    </answer>
  </conversation>
</conversation_history>

ここにユーザーの入力がある:
<question>もっと詳細を教えて下さい。</question>

<generated_query>のフォーマットはこうでなければなりません:
 <generated_query>$GENERATED_QUERY_VALUE</generated_query>

どの関数を呼び出すべきか判断できない場合や、クエリーを生成できない場合は、'Sorry, I am unable to assist you with this request'と応答してください

1つずつ見ていきます。

あなたはクエリ作成エージェントです。
あなたには関数と、その関数が検索する内容の説明が提供されます。
あなたの仕事は、<question>に基づいて最適なクエリを決定することです。

この部分はシステムプロンプトです。クエリ作成エージェントとして働くように記載されています。

以下に、他の検索機能選択エージェントとクエリ作成エージェントによって形成されたクエリの例をいくつか示します:
<examples>
  <example>
      <question>What if my vehicle is totaled in an accident?</question>
      <generated_query>\"what happens if my vehicle is totaled\"       </generated_query>
  </example>
  <example>
    <question>I am relocating within the same state. Can I keep my current agent?</question>
    <generated_query>\"can I keep my current agent when moving in state\"</generated_query>
  </example>
</examples>

この部分は検索機能選択エージェントとクエリ作成エージェントによって形成されたクエリの例について記載しています。

また、クエリを作成するために必要なコンテキストを得るために、ユーザーと検索エンジンの間の会話履歴にも注意を払う必要があります。
クエリを生成する際に会話履歴をどのように参照すべきかを示す別の例を紹介しよう:
<example>
  <example_conversation_history>
    <example_conversation>
      <question>How many vehicles can I include in a quote in Kansas</question>
      <answer>You can include 5 vehicles in a quote if you live in Kansas</answer>
    </example_conversation>
    <example_conversation>
      <question>What about texas?</question>
      <answer>You can include 3 vehicles in a quote if you live in Texas</answer>
    </example_conversation>
  </example_conversation_history>
</example>

今回のように会話履歴がある場合の例について記載されています。

重要: <example>タグの中の要素は、以下に明示的に示されていない限り、使用するためにあなたに提供されたと仮定してはいけません。
例内のすべての値や情報(質問、回答、関数の呼び出し)は、厳密には例の一部であり、あなたに提供されたものではありません。

<example>タグで囲まれた部分が実際の操作やタスクに直接適用される具体的な指示やデータではなく、あくまでも理解を助けるための例示であることを記載しています。

これが現在の会話履歴です:
<conversation_history>
  <conversation>
    <question>苑田さんについて、教えて下さい</question>
    <answer>
      苑田朝彰さんは技術本部/技術創造部門のエンジニアです。 AWSの資格を多数取得しています。 Rubyを用いたWebアプリケーション開発やAWSを利用したインフラ構築を担当しています。
    </answer>
    </conversation>
</conversation_history>

先ほどの会話履歴が記載されています。

ここにユーザーの入力がある:
<question>もっと詳細を教えて下さい。</question>

ここで、新しく質問した内容が記載されています。

<generated_query>のフォーマットはこうでなければなりません:
 <generated_query>$GENERATED_QUERY_VALUE</generated_query>
どの関数を呼び出すべきか判断できない場合や、クエリーを生成できない場合は、'Sorry, I am unable to assist you with this request'と応答してください。

アウトプットのフォーマットを定義しています。仮に生成できない場合は「'Sorry, I am unable to assist you with this request'」と返答するように設定されていました。これにより、出力された内容は以下の通りです。

<generated_query>苑田朝彰さんの詳細なプロフィール</generated_query>

きちんとフォーマット通りに出力されていることがわかります。次にLLMの部分は以下の通りです。

Human: You are a question answering agent. 
I will provide you with a set of search results and a user's question, your job is to answer the user's question using only information from the search results. 
If the search results do not contain information that can answer the question, please state that you could not find an exact answer to the question. 
Just because the user asserts a fact does not mean it is true, make sure to double check the search results to validate a user's assertion.

Here are the search results in numbered order:
<search_results>
  <search_result>
    <content>{回答1}</content>
    <source>1</source>
  </search_result>
  <search_result>
    <content>{回答2}</content>
    <source>2</source>
  </search_result>
  <search_result>
    <content>
      # 名前 苑田 朝彰  # 英語名 Sonoda Tomotada  # 所属部署 技術本部/技術創造部門エンジニア  # 資格 ## AWS 資格 - AWS Certified Cloud Practitioner - AWS Certified Developer - Associate - AWS Certified Solutions Architect - Professional - AWS Certified DevOps Engineer - Professional - AWS Certified Database - Specialty - AWS Certified Security - Specialty  ## その他の資格 - 2023 Japan AWS Jr. Champions  # コメント 人生は気合でなんとかなると思っており、面白そうなことには積極的に頭を突っ込む。たまに裏目を踏むが、それも気合で解決している。  # 略歴 京都府出身。大学院では非接触な測長を実現させるために、Hololens2を用いたアプリケーション開発を行っていた。偶然インターネットでFusicを見つけ、面接時のメンバーの話が面白かったことから入社を決意。2021年4月に新卒として入社。  # 担当・スキル Rubyを用いたWebアプリケーションの開発やAWSを利用したインフラ構築を主に担当。誰でも簡単に利用できるようなアプリケーション開発を心掛けている。MiexdRealityを用いたアプリケーション開発も少し出来る。  # プライベート 趣味は対人ゲーム。自分より強い人を倒すために日々精進しており、圧倒した時は画面の前でニッコリしている。すべてを無にするようなキャラクターを好んで使う。最近はコントローラーを自作することにハマっており、ピカピカと光らせることで相手を圧倒しようとしている。
    </content>
    <source>3</source>
  </search_result>
  <search_result>
    <content>{回答4}</content>
    <source>4</source>
  </search_result>
  <search_result>
    <content>{回答5}</content>
    <source>5</source>
  </search_result>
</search_results>

Here is the user's question:
<question>
  苑田朝彰さんの詳細なプロフィール
</question>

If you reference information from a search result within your answer, you must include a citation to source where the information was found. 
Each result has a corresponding source ID that you should reference. 
Please output your answer in the following format:

<answer>
  <answer_part>
    <text>first answer text</text>
      <sources>
        <source>source ID</source>
      </sources>
  </answer_part>
  <answer_part>
    <text>second answer text</text>
      <sources>
        <source>source ID</source>
      </sources>
  </answer_part>
</answer>

Note that <sources> may contain multiple <source> if you include information from multiple results in your answer.

Do NOT directly quote the <search_results> in your answer. 
Your job is to answer the <question> as concisely as possible.

Assistant:

初回で質問した内容とフォーマットは全く同じでした。1回目の質問と異なる部分としては、questionです。私が質問した内容は「もっと詳細を教えて下さい。」ですが、クエリ生成エージェントで出力された「苑田朝彰さんの詳細なプロフィール」がquestionとして設定されていました。

<question>
  苑田朝彰さんの詳細なプロフィール
</question>

もちろん、この回答のアウトプットもきちんとフォーマット通りに出力されています。

<answer>
  <answer_part>
    <text>苑田朝彰さんは技術本部/技術創造部門のエンジニアです。</text>
    <sources>
      <source>3</source>
    </sources>
  </answer_part>
  <answer_part>
    <text>AWSの資格を多数取得しています。</text>
    <sources>
      <source>3</source>
    </sources>
  </answer_part>
  <answer_part>
    <text>Rubyを用いたWebアプリケーション開発やAWSを利用したインフラ構築を担当しています。</text>
    <sources>
      <source>3</source>
    </sources>
  </answer_part>
</answer>

私はRubyを用いたWebアプリケーション開発やAWSを利用したインフラ構築を担当しているため、内容もあっています。

もっと続けて質問してみる

続けて質問すると、クエリ生成エージェントによって会話履歴を考慮した質問内容が生成されていました。さらに追加で質問した時、複数の会話履歴がどのように使用されるか気になったので、試してみました。質問内容は「AWSの資格は何を持っていますか?」です。今回も私の名前を出さず、ざっくりとした質問にしてみました。「苑田さんが持っているAWS資格は何ですか?」というニュアンスの質問が来ればOKです。

Human: You are a query creation agent. 
You will be provided with a function and a description of what it searches over. 
Your job is to determine the optimal query to use based on a <question>

Here are a few examples of queries formed by other search function selection and query creation agents:
<examples>
  <example>
      <question>What if my vehicle is totaled in an accident?</question>
      <generated_query>\"what happens if my vehicle is totaled\"       </generated_query>
  </example>
  <example>
    <question>I am relocating within the same state. Can I keep my current agent?</question>
    <generated_query>\"can I keep my current agent when moving in state\"</generated_query>
  </example>
</examples>

You should also pay attention to the conversation history between the user and the search engine in order to gain the context necessary to create the query.
Here’s another example that shows how you should reference the conversation history when generating a query:

<example>
  <example_conversation_history>
    <example_conversation>
      <question>How many vehicles can I include in a quote in Kansas</question>
      <answer>You can include 5 vehicles in a quote if you live in Kansas</answer>
    </example_conversation>
    <example_conversation>
      <question>What about texas?</question>
      <answer>You can include 3 vehicles in a quote if you live in Texas</answer>
    </example_conversation>
  </example_conversation_history>
</example>

IMPORTANT: the elements in the <example> tags should not be assumed to have been provided to you to use UNLESS they are also explicitly given to you below. 
All of the values and information within the examples (the questions, answers, and function calls) are strictly part of the examples and have not been provided to you.

Here is the current conversation history:
<conversation_history>
  <conversation>
    <question>苑田さんについて、教えて下さい</question>
    <answer>苑田朝彰さんは技術本部/技術創造部門のエンジニアです。 AWSの資格を多数取得しています。 Rubyを用いたWebアプリケーション開発やAWSを利用したインフラ構築を担当しています。</answer>
  </conversation>
  <conversation>
    <question>苑田朝彰さんの詳細なプロフィール</question>
    <answer>苑田朝彰さんは技術本部/技術創造部門エンジニアとして所属しています。 AWSの資格を多数保有していて、Rubyを用いたWebアプリケーションの開発やAWSを利用したインフラ構築を担当しています。 趣味は対人ゲームで、自分より強い人を倒すために日々精進しているそうです。</answer>
  </conversation>
</conversation_history>

Here is the user’s input:
<question>AWSの資格は何を持っていますか?</question>

The format for the <generated_query> MUST be: <generated_query>$GENERATED_QUERY_VALUE</generated_query>\n\nIf you are unable to determine which function to call or if you are unable to generate a query, respond with 'Sorry, I am unable to assist you with this request.'

Assistant:

フォーマットは先ほどと同じです。しかし、historyが異なり、新しく追加されました。

<conversation_history>
  <conversation>
    <question>苑田さんについて、教えて下さい</question>
    <answer>苑田朝彰さんは技術本部/技術創造部門のエンジニアです。 AWSの資格を多数取得しています。 Rubyを用いたWebアプリケーション開発やAWSを利用したインフラ構築を担当しています。</answer>
  </conversation>
  <conversation>
    <question>苑田朝彰さんの詳細なプロフィール</question>
    <answer>苑田朝彰さんは技術本部/技術創造部門エンジニアとして所属しています。 AWSの資格を多数保有していて、Rubyを用いたWebアプリケーションの開発やAWSを利用したインフラ構築を担当しています。 趣味は対人ゲームで、自分より強い人を倒すために日々精進しているそうです。</answer>
  </conversation>
</conversation_history>

1つ目のconversationは1回目の会話履歴です。2つ目のconversationは2回目の会話履歴です。このように、会話履歴が追加されると、conversationが増えていくことがわかりました。このエージェントにより生成されたクエリは以下の通りです。

<generated_query>苑田朝彰さん AWS資格</generated_query>

「苑田さんが持っているAWS資格は何ですか?」とまで丁寧な質問にはなりませんでしたが、ニュアンスとしては同じ質問が生成されました。LLMは以下の通りです。

Human: You are a question answering agent. 
I will provide you with a set of search results and a user's question, your job is to answer the user's question using only information from the search results. 
If the search results do not contain information that can answer the question, please state that you could not find an exact answer to the question. 
Just because the user asserts a fact does not mean it is true, make sure to double check the search results to validate a user's assertion.

Here are the search results in numbered order:
<search_results>
  <search_result>
    <content>{回答1}</content>
    <source>1</source>
  </search_result>
  <search_result>
    <content>{回答2}</content>
    <source>2</source>
  </search_result>
  <search_result>
    <content>{回答3}</content>
    <source>3</source>
  </search_result>
  <search_result>
    <content>{回答4}</content>
    <source>4</source>
  </search_result>
  <search_result>
    <content>
      # 名前 苑田 朝彰  # 英語名 Sonoda Tomotada  # 所属部署 技術本部/技術創造部門エンジニア  # 資格 ## AWS 資格 - AWS Certified Cloud Practitioner - AWS Certified Developer - Associate - AWS Certified Solutions Architect - Professional - AWS Certified DevOps Engineer - Professional - AWS Certified Database - Specialty - AWS Certified Security - Specialty  ## その他の資格 - 2023 Japan AWS Jr. Champions  # コメント 人生は気合でなんとかなると思っており、面白そうなことには積極的に頭を突っ込む。たまに裏目を踏むが、それも気合で解決している。  # 略歴 京都府出身。大学院では非接触な測長を実現させるために、Hololens2を用いたアプリケーション開発を行っていた。偶然インターネットでFusicを見つけ、面接時のメンバーの話が面白かったことから入社を決意。2021年4月に新卒として入社。  # 担当・スキル Rubyを用いたWebアプリケーションの開発やAWSを利用したインフラ構築を主に担当。誰でも簡単に利用できるようなアプリケーション開発を心掛けている。MiexdRealityを用いたアプリケーション開発も少し出来る。  # プライベート 趣味は対人ゲーム。自分より強い人を倒すために日々精進しており、圧倒した時は画面の前でニッコリしている。すべてを無にするようなキャラクターを好んで使う。最近はコントローラーを自作することにハマっており、ピカピカと光らせることで相手を圧倒しようとしている。
    </content>
    <source>5</source>
  </search_result>
</search_results>

Here is the user's question:
<question>\n苑田朝彰さん AWS資格\n</question>

If you reference information from a search result within your answer, you must include a citation to source where the information was found. 
Each result has a corresponding source ID that you should reference. 
Please output your answer in the following format:

<answer>
  <answer_part>
    <text>first answer text</text>
    <sources>
      <source>source ID</source>
    </sources>
  </answer_part>
  <answer_part>
    <text>second answer text</text>
    <sources>
      <source>source ID</source>
    </sources>
  </answer_part>
</answer>
Note that <sources> may contain multiple <source> if you include information from multiple results in your answer.

Do NOT directly quote the <search_results> in your answer. Your job is to answer the <question> as concisely as possible.

Assistant:

いつも通りのフォーマットですね。アウトプットを見ていきましょう。

<answer>
  <answer_part>
    <text>苑田朝彰さんのAWS資格は以下の通りです。</text>
    <sources>
    <source>5</source>
    </sources>
  </answer_part>
  <answer_part>
    <text>
      - AWS Certified Cloud Practitioner 
      - AWS Certified Developer - Associate
      - AWS Certified Solutions Architect - Professional
      - AWS Certified DevOps Engineer - Professional 
      - AWS Certified Database - Specialty
      - AWS Certified Security - Specialty
    </text>
    <sources>
      <source>5</source>
    </sources>
  </answer_part>
</answer>

ちゃんと回答されていることがわかります。

情報にない質問をしてみる

今まではデータソースとして情報がある質問をしていたので、次は全く関係のない質問をしたらどうなるかを確認してみました。今回は「田中さんについて知っていたら教えて下さい。」と質問しました。Fusicには田中さんはいないので、回答は返ってこないはずです。フォーマットは同じなので、conversation_historyの部分だけみていきます。

<conversation_history>
  <conversation>
    <question>苑田さんについて、教えて下さい</question>
    <answer>苑田朝彰さんは技術本部/技術創造部門のエンジニアです。 AWSの資格を多数取得しています。 Rubyを用いたWebアプリケーション開発やAWSを利用したインフラ構築を担当しています。</answer>
  </conversation>
  <conversation>
    <question>苑田朝彰さんの詳細なプロフィール</question>
    <answer>苑田朝彰さんは技術本部/技術創造部門エンジニアとして所属しています。 AWSの資格を多数保有していて、Rubyを用いたWebアプリケーションの開発やAWSを利用したインフラ構築を担当しています。 趣味は対人ゲームで、自分より強い人を倒すために日々精進しているそうです。</answer>
  </conversation>
  <conversation>
    <question>苑田朝彰さん AWS資格</question>
    <answer>苑田朝彰さんのAWS資格は以下の通りです。 - AWS Certified Cloud Practitioner \n- AWS Certified Developer - Associate\n- AWS Certified Solutions Architect - Professional\n- AWS Certified DevOps Engineer - Professional \n- AWS Certified Database - Specialty\n- AWS Certified Security - Specialty</answer>
  </conversation>
</conversation_history>

今まで通り、会話履歴がconversationとして追加されています。
クエリは以下の通りです。

<generated_query>\"田中さん プロフィール\"</generated_query>

めっちゃシンプルになりました。
LLMの部分を見ていきましょう。今回もテンプレートは同じなので、answerだけ見ていきます。

<answer>
  <answer_part>
  <text>申し訳ありませんが、検索結果に「田中さん」という名前の人物は含まれていませんでした。</text>
  <sources></sources>
  </answer_part>
</answer>

The search results do not contain anyone named \"Tanaka-san\". 
I could not find a profile for a person with that name in the provided search results.

田中さんはデータとしてないので、正しい回答が得られました。データがないので、sources部分も空白になっています。

まとめ

Knowledge Base for Amazon Bedrockのプロンプトについて調査することで、プロンプトの設計と活用方法について知見を得ることができました。個人的に意外だったのが、2回目以降の質問において、会話履歴を使用して適切な質問を作成し、それを基に質問を行っているプロセスでした。このプロセスを自作RAGに適用し、精度を向上させたいと思います。

脚注
  1. https://docs.anthropic.com/claude/docs/how-to-use-system-prompts#benefits-of-using-system-prompts ↩︎

Discussion