RetrieveAndGenerate の sessionId パラメーターはセッション保持以外にクエリ書き換えも行ってくれる

ログを眺めていると RetrieveAndGenerate の sessionId パラメーターはセッション保持以外に、クエリを書き換える効果があることがわかりました。小ネタなのかもしれないですが、少し嬉しかったためブログにしてみました。
2024.05.06

こんにちは! AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。

本記事では、Knowledge bases for Amazon Bedrock の RetrieveAndGenerate API で使用する sessionId パラメーターが、セッション保持だけでなくクエリ書き換えも行っていることについて解説します。

RetrieveAndGenerate API について

RetrieveAndGenerate API は、主に Claud3 Sonnet などのテキストモデル、ナレッジベースを指定し、検索された結果に基づいて回答を生成する API です。ベクトル検索だけしたい場合は、 Retrieve API 、回答を含めて生成したい場合は RetrieveAndGenerate API といった使い分けができます。

RetrieveAndGenerate - Amazon Bedrock

Session ID について

RetrieveAndGenerate では sessionId パラメーターが用意されており、セッションを引き継いだ回答を行いたい場合に利用します。

The unique identifier of the session. Reuse the same value to continue the same session with the knowledge base.

RetrieveAndGenerate - Amazon Bedrock

セッション ID の利用イメージは以下の図の通りで、 1 回目のレスポンスで生成された ID を、 2 回目以降のリクエストパラメーターに渡してあげることで、セッションを引き継いだ回答が可能になります。

クエリ書き換えについて

クエリ書き換えとは、ユーザーからのそのまま LLM に渡すのではなく、 RAG として検索しやすい質問文にクエリを書き換える手法です。例えば以下の質問文があったとします。

始業は朝何時からですか?おじちゃっと風に回答してください。

この質問文でそのまま RAG に質問すると、「おじちゃっと風」も含めて検索をかけてしまいます。おじちゃっと風と始業時間は関係ありませんよね。おじちゃっと風はあくまで検索よりも回答する時にお願いしたいことなので、検索のノイズになってしまいます。

このような問題を解決する方法の1つとして、クエリ書き換えが存在します。

RetrieveAndGenerate API のクエリ書き換え

RetrieveAndGenerate API のクエリ書き換えは、 sessionId をリクエストパラメーターに含めた時に発生します。図にすると以下の通りです。

2 回目以降の質問に対して、クエリの書き換えが行われていくイメージだと思っていただけるといいかと思います。

やってみる

それでは、実際にコードを書いて sessionId を使った RetrieveAndGenerate API の動作を確認してみましょう。 次のコードを利用して、セッション ID を保持しながらナレッジベースへ検索してみます。

import os
import boto3
import streamlit as st

kb_id = os.environ.get("KNOWLEDGE_BASE_ID")
model_arn = "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0"
kb = boto3.client("bedrock-agent-runtime", region_name="us-east-1")

st.title("Knowledge bases for Amazon Bedrock chat")

# チャット履歴の初期化
if "messages" not in st.session_state:
    st.session_state.messages = []

# セッション ID の初期化
if "session_id" not in st.session_state:
    st.session_state.session_id = None

# 過去の会話履歴の表示
for message in st.session_state.messages:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])
        if message["role"] == "assistant":
            st.write(f"Session ID: {st.session_state.session_id}")

# ユーザーの入力受け口
if prompt := st.chat_input("聞きたいことを入力してね"):
    # チャット履歴に保管(ユーザー)
    st.session_state.messages.append({"role": "user", "content": prompt})
    # ユーザーの入力内容を記載
    with st.chat_message("user"):
        st.markdown(prompt)
    # アシスタンスの回答内容を記載
    with st.chat_message("assistant"):
        params = {
            "input": {"text": prompt},
            "retrieveAndGenerateConfiguration": {
                "type": "KNOWLEDGE_BASE",
                "knowledgeBaseConfiguration": {
                    "knowledgeBaseId": kb_id,
                    "modelArn": model_arn,
                },
            },
        }
        # セッション管理
        if st.session_state.session_id is not None:
            params["sessionId"] = st.session_state.session_id
        response = kb.retrieve_and_generate(**params)
        st.markdown(response["output"]["text"])
        with st.expander("引用"):
            st.json(response["citations"])
        st.session_state.session_id = response["sessionId"]
        st.write(f"Session ID: {st.session_state.session_id}")
    # チャット履歴に保管(アシスタント)
    st.session_state.messages.append(
        {"role": "assistant", "content": response["output"]["text"]}
    )

if st.button(
    "チャット履歴の削除",
    on_click=lambda: exec(
        "st.session_state.messages = []; st.session_state.session_id = None"
    ),
):
    pass

AWS アカウントのセットアップ方法について質問し、 1 から 14 番まで回答をもらいました。画面の sessionId は 初回のレスポンスに含まれていたセッション ID が出力されている(初回はリクエストにセッション ID を含めていない)点に注意です。

それでは、 2 回目の質問をしてみます。

15 番目以降を教えてもらいました。同一ドキュメントの話だと認識して、同一ドキュメントの 15 番目を回答してもらいました。

ログを確認してみます。

ログをみてみる

ログをみてみます。すると、ログのレコード数が 5 つであることがわかります。 2 ターンの会話なのに 5 つのレコード出力されているため割り切れませんね。また、順当に行けば、エンべディングとテキスト生成の合計 4 回モデルが実行されるはずですが 1 つ多いようです。各ログのレコードを見てみましょう。

1 つ目

古い順からログを見てみます。初回の質問文をエンべディングしたモデル実行ログであることがわかります。 ※ embedding 部分は行数が多いため省略しました。

{
	"schemaType": "ModelInvocationLog",
	"schemaVersion": "1.0",
	"timestamp": "2024-05-06T09:11:35Z",
	"accountId": "XXXXXXXXXXXX",
	"identity": {
		"arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/pinecone-serverless-dev-kb-role/BedrockQueryKnowledgeBaseSession-XXXXXXXX"
	},
	"region": "us-east-1",
	"requestId": "a72eb546-4a19-47af-aac1-ce64c37ff6b5",
	"operation": "InvokeModel",
	"modelId": "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v1",
	"input": {
		"inputContentType": "application/json",
		"inputBodyJson": {
			"inputText": "AWS アカウントのセットアップ方法を教えてください。"
		},
		"inputTokenCount": 9
	},
	"output": {
		"outputContentType": "application/json",
		"outputBodyJson": {
			"embedding": [
				0.98046875, -0.19042969, 0.76171875, 0.019897461, 0.013427734
			],
			"inputTextTokenCount": 9
		}
	}
}

2 つ目

つづいて、 2 つ目は回答生成のモデル実行です。 28 行目をみると、ベクトルデータベースからの検索結果を元に、回答を生成していることがわかります。

{
	"schemaType": "ModelInvocationLog",
	"schemaVersion": "1.0",
	"timestamp": "2024-05-06T09:11:36Z",
	"accountId": "XXXXXXXXXXXX",
	"identity": {
		"arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/takakuni"
	},
	"region": "us-east-1",
	"requestId": "277d9962-d6f1-4483-8466-02d73eea409a",
	"operation": "InvokeModel",
	"modelId": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0",
	"input": {
		"inputContentType": "application/json",
		"inputBodyJson": {
			"anthropic_version": "bedrock-2023-05-31",
			"messages": [
				{
					"role": "user",
					"content": [
						{
							"type": "text",
							"text": "AWS アカウントのセットアップ方法を教えてください。"
						}
					]
				}
			],
			"system": "You are a question answering agent. I will provide you with a set of search results. The user will provide you with a 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.\n\nHere are the search results in numbered order:\n<search_results>\n<search_result>\n<content>\n# 会議室利用マニュアル  ## 1. 会議室の予約  - 会議室の利用を希望する場合は、事前に予約システムを通じて予約を行ってください。 - 予約の際は、会議の目的、予定人数、必要な機材などを明記してください。 - 予約が確定したら、参加者に会議の日時と会議室の場所を通知してください。  ## 2. 会議室の利用  - 会議室は予約した時間内に利用し、終了時刻を厳守してください。 - 会議室内は常に整理整頓し、清潔に保つようにしてください。 - 飲食は可能ですが、ゴミは各自で持ち帰り、会議室内に残さないでください。 - 会議室内の機材は丁寧に取り扱い、使用後は元の状態に戻してください。  ## 3. 機材の利用  - 会議室内のプロジェクター、スクリーン、ホワイトボードなどの機材は自由に利用できます。 - 機材の利用方法がわからない場合は、事前に管理者に確認してください。 - 機材に不具合がある場合は、速やかに管理者に報告してください。  ## 4. 会議室の退室  - 会議終了後は、使用した機材の電源を切り、元の位置に戻してください。 - テーブルや椅子は元の位置に戻し、ホワイトボードは消去してください。 - 窓や扉は施錠し、照明は消灯してください。  ## 5. 注意事項  - 会議室内は禁煙です。 - 会議室内での大声での会話や電話は控えてください。 - 会議室内の備品や機材を会議室外に持ち出さないでください。 - 会議室の利用に関して不明な点がある場合は、管理者に確認してください。\n</content>\n<source>\n1\n</source>\n</search_result>\n<search_result>\n<content>\n# オフィスの利用方法マニュアル  ## 1. 入退室について  - オフィスの利用可能時間は、平日の 9:00 から 18:00 までです。 - 入室の際は、受付で名前と所属をお伝えください。 - 退室時は、必ず施錠し、鍵を受付に返却してください。  ## 2. 設備の利用について  ### 2.1 会議室  - 会議室の利用は、事前に予約が必要です。 - 利用後は、机や椅子を元の位置に戻し、清掃をお願いします。 - 会議室内での飲食は可能ですが、ゴミは必ず持ち帰ってください。  ### 2.2 コピー機・プリンター  - コピー機とプリンターは、オフィス内の共有スペースに設置されています。 - 利用後は、用紙の補充や簡単な清掃をお願いします。 - 大量の印刷が必要な場合は、事前に管理者へ相談してください。  ### 2.3 キッチン  - キッチンは、自由に利用できます。 - 食器や調理器具は、使用後に洗浄し、元の位置に戻してください。 - 冷蔵庫内の食品は、自分の名前を明記し、長期保存は避けてください。  ## 3. セキュリティについて  - オフィス内では、名札の着用をお願いします。 - 来客がある場合は、事前に管理者へ連絡し、受付で手続きを行ってください。 - 機密情報を含む書類は、施錠できるキャビネットで管理してください。  ## 4. 緊急時の対応  - 火災や地震などの緊急時は、落ち着いて行動し、指示に従ってください。 - 避難経路や消火器の位置は、事前に確認しておいてください。 - 怪我や体調不良の場合は、すぐに管理者へ連絡してください。  本マニュアルを遵守し、快適なオフィス環境の維持にご協力ください。\n</content>\n<source>\n2\n</source>\n</search_result>\n<search_result>\n<content>\n## 23. 定期的なセキュリティトレーニング  - チーム全体を対象に、定期的なセキュリティトレーニングを実施します。 - AWS のセキュリティベストプラクティスや新機能について学び、セキュリティ意識を高めます。 - フィッシング攻撃やソーシャルエンジニアリングに対する対策を徹底します。  ## 24. コミュニティとの交流  - AWS のユーザーコミュニティや forums に参加し、ベストプラクティスや経験を共有します。 - AWS のイベントやウェビナーに参加し、最新の情報を入手します。 - AWS ブログや公式ドキュメントを定期的にチェックし、新機能やアップデートを把握します。  ## 25. AWS CloudTrail の詳細な設定  - CloudTrail の証跡に対して、暗号化とログファイルの整合性検証を有効にします。 - CloudTrail ログを Amazon CloudWatch Logs に送信し、リアルタイムな監視とアラートを設定します。 - AWS Lambda を使用して、CloudTrail イベントに基づいてカスタムアクションを実行します。  ## 26. Amazon GuardDuty の有効化  - Amazon GuardDuty を有効にして、インテリジェントな脅威検出と継続的なモニタリングを実現します。 - GuardDuty が生成する調査結果を確認し、適切な対応策を講じます。 - GuardDuty の調査結果を AWS Security Hub や他のセキュリティツールと統合します。  ## 27. AWS Config Rules の拡張  - AWS Config Rules を使用して、リソースの設定が組織のポリシーや業界の規制に準拠していることを確認します。 - カスタム Config Rules を作成し、組織固有の要件に対応します。 - Config Rules の評価結果を定期的にレビューし、違反があった場合は速やかに修正します。  ## 28. AWS Trusted Advisor の活用  - AWS Trusted Advisor を使用して、ベストプラクティスに基づいた推奨事項を受け取ります。 - コスト最適化、セキュリティ、信頼性、パフォーマンス、サービス制限の 5 つのカテゴリーで、改善の機会を特定します。 - Trusted Advisor の推奨事項を定期的にレビューし、必要なアクションを実行します。  ## 29. AWS Personal Health Dashboard の活用  - AWS Personal Health Dashboard を使用して、AWS サービスの状態と予定されたメンテナンスを追跡します。 - 個人的な AWS アカウントに影響を与える可能性のあるイベントについて、通知を受け取ります。 - イベントの詳細を確認し、必要な対策を講じて、ビジネスへの影響を最小限に抑えます。  ## 30. AWS Partner Network (APN) の活用  - AWS Partner Network (APN) を通じて、信頼できるサードパーティのソリューションやサービスを見つけます。 - APN パートナーのエキスパティーズを活用して、ワークロードの設計、移行、最適化を支援してもらいます。 - APN テクノロジーパートナーのソリューションを活用して、AWS 環境の機能を拡張します。  ## 31. 継続的な学習と改善  - AWS のドキュメント、ホワイトペーパー、ケーススタディを読んで、ベストプラクティスと新しい機能について学びます。 - AWS の認定プログラムを活用して、チームのスキルを向上させます。 - 定期的に AWS アーキテクチャとプロセスを見直し、継続的な改善の機会を特定します。\n</content>\n<source>\n3\n</source>\n</search_result>\n<search_result>\n<content>\nタグ付けの戦略  - リソースの管理と追跡を容易にするために、一貫したタグ付けの戦略を策定します。 - タグ付けの命名規則を決定し、すべてのリソースにタグを適用します。 - タグを使用して、コストの配分、セキュリティ管理、リソースのグループ化などを行います。  ## 13. AWS Config の設定  - AWS Config を有効にして、リソースの設定変更を追跡し、コンプライアンスを確保します。 - 必要なルールを設定し、リソースの設定が定義された基準に準拠していることを確認します。 - 設定の変更履歴を確認し、問題が発生した場合に迅速に対応できるようにします。  ## 14. AWS CloudFormation の活用  - インフラストラクチャをコードとして管理するために、AWS CloudFormation を使用します。 - テンプレートを作成し、リソースのプロビジョニングと設定を自動化します。 - スタックの更新や削除を管理し、インフラストラクチャの変更を追跡します。  ## 15. ディザスタリカバリ計画の策定  - ビジネスの継続性を確保するために、ディザスタリカバリ計画を策定します。 - 重要なデータとアプリケーションを特定し、バックアップと復元の手順を文書化します。 - AWS のマルチリージョン機能を活用し、障害発生時にもサービスを継続できるようにします。  ## 16. 定期的なアカウントレビュー  - 四半期ごとまたは半年ごとに、AWS アカウントの全体的なレビューを実施します。 - 未使用のリソースを特定し、コストを最適化します。 - セキュリティ設定、アクセス権限、コンプライアンス要件を確認し、必要に応じて更新します。  ## 17. AWS サポートプランの検討  - ビジネスニーズに応じて、適切な AWS サポートプランを選択します。 - 技術的な問題やアーキテクチャの相談に対して、AWS の専門家からサポートを受けることができます。 - サポートプランに含まれるツールや機能を活用し、運用効率を向上させます。  ## 18. AWS Well-Architected フレームワークの活用  - AWS Well-Architected フレームワークを使用して、ワークロードの設計と運用を最適化します。 - 5 つの柱(運用上の優秀性、セキュリティ、信頼性、パフォーマンス効率、コスト最適化)に基づいて、アーキテクチャをレビューします。 - Well-Architected ツールを使用して、改善点を特定し、ベストプラクティスに沿ってワークロードを進化させます。  ## 19. AWS Identity and Access Management (IAM) のベストプラクティス  - 最小権限の原則に従い、ユーザーとロールに必要最小限のアクセス権限を付与します。 - IAM ポリシーを定期的にレビューし、未使用または過剰な権限を削除します。 - IAM Access Analyzer を使用して、リソースへの外部アクセスを特定し、セキュリティを強化します。  ## 20. AWS Security Hub の活用  - AWS Security Hub を有効にして、セキュリティ状態を一元的に可視化および管理します。 - AWS のサービスやサードパーティ製ツールからのセキュリティ警告を統合し、優先順位付けします。 - 自動化されたコンプライアンスチェックを実行し、セキュリティ基準への準拠を確保します。  ## 21. AWS Cost Explorer の活用  - AWS Cost Explorer を使用して、コストの内訳と傾向を分析します。 - コストの異常や予期しない増加を特定し、適切な対策を講じます。 - コスト配分タグを使用して、部門、プロジェクト、または環境ごとにコストを追跡します。  ## 22. AWS Systems Manager の活用  - AWS Systems Manager を使用して、EC2 インスタンスやオンプレミスサーバーを一元的に管理します。 - パッチ適用、ソフトウェアのインストール、設定管理などのタスクを自動化します。 - Systems Manager Automation を使用して、運用タスクを標準化し、人的エラーを減らします。  ## 23. 定期的なセキュリティトレーニング  - チーム全体を対象に、定期的なセキュリティトレーニングを実施します。 - AWS のセキュリティベストプラクティスや新機能について学び、セキュリティ意識を高めます。 - フィッシング攻撃やソーシャルエンジニアリングに対する対策を徹底します。  ## 24. コミュニティとの交流  - AWS のユーザーコミュニティや forums に参加し、ベストプラクティスや経験を共有します。 - AWS のイベントやウェビナーに参加し、最新の情報を入手します。 - AWS ブログや公式ドキュメントを定期的にチェックし、新機能やアップデートを把握します。  ## 25. AWS CloudTrail の詳細な設定  - CloudTrail の証跡に対して、暗号化とログファイルの整合性検証を有効にします。\n</content>\n<source>\n4\n</source>\n</search_result>\n<search_result>\n<content>\n# AWS アカウントの初期セットアップ方法  ## 1. AWS アカウントの作成  - [AWS 公式サイト](https://aws.amazon.com/)にアクセスし、「アカウントを作成」をクリックします。 - 必要な情報(メールアドレス、パスワード、支払い情報など)を入力し、アカウントを作成します。  ## 2. ルートユーザーのセキュリティ対策  - ルートユーザーの長く複雑なパスワードを設定します。 - 多要素認証(MFA)を有効にします。 - アクセスキーを削除または無効化します。  ## 3. IAM ユーザーの作成  - IAM(Identity and Access Management)ダッシュボードにアクセスします。 - 「ユーザー」を選択し、「ユーザーを追加」をクリックします。 - ユーザー名を入力し、アクセスタイプ(プログラムによるアクセス、AWS マネジメントコンソールへのアクセス)を選択します。 - 必要な権限を付与するか、既存のグループに追加します。  ## 4. 請求アラートの設定  - 「請求」ダッシュボードにアクセスします。 - 「請求アラートの管理」をクリックし、アラートを設定します。 - 予期しない高額な請求を防ぐために、適切な閾値を設定します。  ## 5. CloudTrail の有効化  - CloudTrail ダッシュボードにアクセスします。 - 「証跡の作成」をクリックし、証跡名を入力します。 - 必要に応じて、データイベントやマネジメントイベントを記録するように設定します。 - S3 バケットを指定して、ログファイルを保存します。  ## 6. 仮想プライベートクラウド(VPC)の作成  - VPC ダッシュボードにアクセスします。 - 「VPC の作成」をクリックし、必要な設定(IP アドレス範囲、サブネット、ルートテーブルなど)を行います。 - セキュリティグループを作成し、適切なインバウンドおよびアウトバウンドルールを設定します。  ## 7. 必要な AWS サービスの設定  - 使用予定の AWS サービス(EC2、RDS、S3、Lambda など)を特定します。 - 各サービスのダッシュボードにアクセスし、必要な設定を行います。 - 適切なセキュリティ設定、スケーリング設定、バックアップ設定などを行います。  ## 8. 予算の設定  - 「予算」ダッシュボードにアクセスします。 - 「予算の作成」をクリックし、予算名、予算額、アラート設定などを入力します。 - 予算に応じて、コストを管理し、予期しない高額な請求を防ぎます。  ## 9. AWS 組織の設定(オプション)  - 複数の AWS アカウントを管理する場合は、AWS 組織を設定することを検討します。 - 「AWS Organizations」ダッシュボードにアクセスし、組織を作成します。 - メンバーアカウントを招待し、組織内でポリシーを設定して、アカウント間のリソース共有とセキュリティを管理します。  ## 10. モニタリングとアラートの設定  - CloudWatch ダッシュボードにアクセスします。 - 各 AWS サービスのメトリクスを確認し、必要に応じてアラームを設定します。 - アラームが発生した場合に通知を受け取るように、SNS トピックを設定します。  ## 11. 定期的なセキュリティ監査  - IAM ユーザー、ロール、ポリシーを定期的に見直し、不要なアクセス権限を削除します。 - セキュリティグループとネットワーク ACL の設定を確認し、適切なルールが設定されていることを確認します。 - AWS Trusted Advisor を使用して、セキュリティ、パフォーマンス、コスト最適化に関する推奨事項を確認します。  ## 12. タグ付けの戦略  - リソースの管理と追跡を容易にするために、一貫したタグ付けの戦略を策定します。 - タグ付けの命名規則を決定し、すべてのリソースにタグを適用します。 - タグを使用して、コストの配分、セキュリティ管理、リソースのグループ化などを行います。  ## 13. AWS Config の設定  - AWS Config を有効にして、リソースの設定変更を追跡し、コンプライアンスを確保します。 - 必要なルールを設定し、リソースの設定が定義された基準に準拠していることを確認します。 - 設定の変更履歴を確認し、問題が発生した場合に迅速に対応できるようにします。  ## 14. AWS CloudFormation の活用  - インフラストラクチャをコードとして管理するために、AWS CloudFormation を使用します。 - テンプレートを作成し、リソースのプロビジョニングと設定を自動化します。 - スタックの更新や削除を管理し、インフラストラクチャの変更を追跡します。\n</content>\n<source>\n5\n</source>\n</search_result>\n\n</search_results>\n\nIf 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.\n\nNote that <sources> may contain multiple <source> if you include information from multiple results in your answer.\n\nDo NOT directly quote the <search_results> in your answer. Your job is to answer the user's question as concisely as possible.\n\nYou must output your answer in the following format. Pay attention and follow the formatting and spacing exactly:\n<answer>\n<answer_part>\n<text>\nfirst answer text\n</text>\n<sources>\n<source>source ID</source>\n</sources>\n</answer_part>\n<answer_part>\n<text>\nsecond answer text\n</text>\n<sources>\n<source>source ID</source>\n</sources>\n</answer_part>\n</answer>",
			"max_tokens": 2048,
			"temperature": 0,
			"top_k": 50,
			"top_p": 1,
			"stop_sequences": ["\nObservation"]
		},
		"inputTokenCount": 6116
	},
	"output": {
		"outputContentType": "application/json",
		"outputBodyJson": {
			"id": "msg_01UBvwFk6n5gpL7R5eVgtcZZ",
			"type": "message",
			"role": "assistant",
			"content": [
				{
					"type": "text",
					"text": "<answer>\n<answer_part>\n<text>\nAWS アカウントのセットアップには以下の手順が含まれます:\n\n1. AWS アカウントを作成する\n2. ルートユーザーのセキュリティ対策を行う (長いパスワード、多要素認証の有効化、アクセスキーの削除など)\n3. IAM ユーザーを作成し、適切な権限を付与する\n4. 請求アラートを設定して予期しない高額請求を防ぐ\n5. CloudTrail を有効にしてログを記録する\n6. VPC を作成し、セキュリティグループを設定する\n7. 必要な AWS サービスを設定する (EC2、RDS、S3など)\n8. 予算を設定してコストを管理する\n</text>\n<sources>\n<source>5</source>\n</sources>\n</answer_part>\n\n<answer_part>\n<text>\nその他の重要なセットアップ手順には以下が含まれます:\n\n9. 複数アカウントを管理する場合は AWS 組織を設定する\n10. CloudWatch でモニタリングとアラートを設定する\n11. 定期的にセキュリティ監査を行い、不要なアクセス権限を削除する\n12. リソースの管理のためにタグ付け戦略を策定する\n13. AWS Config を設定してリソースの変更を追跡する\n14. CloudFormation を使ってインフラをコード化する\n</text>\n<sources>\n<source>4</source>\n<source>5</source>\n</sources>\n</answer_part>\n</answer>"
				}
			],
			"model": "claude-3-sonnet-28k-20240229",
			"stop_reason": "end_turn",
			"stop_sequence": null,
			"usage": {
				"input_tokens": 6116,
				"output_tokens": 469
			}
		},
		"outputTokenCount": 469
	}
}

ちなみにですが、今回(デフォルト)のシステムプロンプトの中身は次のような内容です。

You are a question answering agent. I will provide you with a set of search results. The user will provide you with a 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$

$output_format_instructions$

3 つ目

今日の本題です。 sessionId を含めたリクエストの実行です。

23 行目の質問文をもとに、 46 行目で書き換えられたクエリがアウトプットされています。

{
	"schemaType": "ModelInvocationLog",
	"schemaVersion": "1.0",
	"timestamp": "2024-05-06T09:11:54Z",
	"accountId": "XXXXXXXXXXXX",
	"identity": {
		"arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/takakuni"
	},
	"region": "us-east-1",
	"requestId": "ed959217-5f20-4572-aac7-2264fc46cdcf",
	"operation": "InvokeModel",
	"modelId": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0",
	"input": {
		"inputContentType": "application/json",
		"inputBodyJson": {
			"anthropic_version": "bedrock-2023-05-31",
			"messages": [
				{
					"role": "user",
					"content": [
						{
							"type": "text",
							"text": "15 番以降を教えてください。"
						}
					]
				}
			],
			"system": "You are a query creation agent. You will be provided with a function and a description of what it searches over. The user will provide you a question, and your job is to determine the optimal query to use based on the user's question.\n\nHere are a few examples of queries formed by other search function selection and query creation agents:\n<examples>\n<example>\n<question>What if my vehicle is totaled in an accident?</question>\n<generated_query>\"what happens if my vehicle is totaled\"</generated_query>\n</example>\n<example>\n<question>I am relocating within the same state. Can I keep my current agent?</question>\n<generated_query>\"can I keep my current agent when moving in state\"</generated_query>\n</example>\n</examples>\n\nYou 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.\nHere’s another example that shows how you should reference the conversation history when generating a query:\n\n<example>\n<example_conversation_history>\n<example_conversation>\n<question>How many vehicles can I include in a quote in Kansas</question>\n<answer>You can include 5 vehicles in a quote if you live in Kansas</answer>\n</example_conversation>\n<example_conversation>\n<question>What about texas?</question>\n<answer>You can include 3 vehicles in a quote if you live in Texas</answer>\n</example_conversation>\n</example_conversation_history>\n</example>\n\nIMPORTANT: 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.\n\nHere is the current conversation history:\n<conversation_history>\n<conversation>\n<question>AWS アカウントのセットアップ方法を教えてください。</question>\n<answer>AWS アカウントのセットアップには以下の手順が含まれます:\n\n1. AWS アカウントを作成する\n2. ルートユーザーのセキュリティ対策を行う (長いパスワード、多要素認証の有効化、アクセスキーの削除など)\n3. IAM ユーザーを作成し、適切な権限を付与する\n4. 請求アラートを設定して予期しない高額請求を防ぐ\n5. CloudTrail を有効にしてログを記録する\n6. VPC を作成し、セキュリティグループを設定する\n7. 必要な AWS サービスを設定する (EC2、RDS、S3など)\n8. 予算を設定してコストを管理する その他の重要なセットアップ手順には以下が含まれます:\n\n9. 複数アカウントを管理する場合は AWS 組織を設定する\n10. CloudWatch でモニタリングとアラートを設定する\n11. 定期的にセキュリティ監査を行い、不要なアクセス権限を削除する\n12. リソースの管理のためにタグ付け戦略を策定する\n13. AWS Config を設定してリソースの変更を追跡する\n14. CloudFormation を使ってインフラをコード化する</answer>\n</conversation>\n\n</conversation_history>\n\nThe 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.'",
			"max_tokens": 2048,
			"temperature": 0,
			"top_k": 50,
			"top_p": 1,
			"stop_sequences": ["\nObservation"]
		},
		"inputTokenCount": 938
	},
	"output": {
		"outputContentType": "application/json",
		"outputBodyJson": {
			"id": "msg_018Nr7VKE1CgpwGfqRS9PVwn",
			"type": "message",
			"role": "assistant",
			"content": [
				{
					"type": "text",
					"text": "<generated_query>\"aws アカウントのセットアップ 15番以降の手順\"</generated_query>"
				}
			],
			"model": "claude-3-sonnet-28k-20240229",
			"stop_reason": "end_turn",
			"stop_sequence": null,
			"usage": {
				"input_tokens": 938,
				"output_tokens": 33
			}
		},
		"outputTokenCount": 33
	}
}

なぜ書き換わった?

なぜ、クエリの書き換えが起こったのでしょうか。それは、次の内容が sessionId を保持した場合、次の命令が実行されるためです。(3 番目のログの 28 行目の内容です。)

よく読むとクエリ最適化するよう、質問文の書き換えが命令されています。合わせて、会話履歴も含めて質問文を作成するよう命令されていますね。

You are a query creation agent. You will be provided with a function and a description of what it searches over. The user will provide you a question, and your job is to determine the optimal query to use based on the user's 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>AWS アカウントのセットアップ方法を教えてください。</question>
<answer>AWS アカウントのセットアップには以下の手順が含まれます:

1. AWS アカウントを作成する
2. ルートユーザーのセキュリティ対策を行う (長いパスワード、多要素認証の有効化、アクセスキーの削除など)
3. IAM ユーザーを作成し、適切な権限を付与する
4. 請求アラートを設定して予期しない高額請求を防ぐ
5. CloudTrail を有効にしてログを記録する
6. VPC を作成し、セキュリティグループを設定する
7. 必要な AWS サービスを設定する (EC2、RDS、S3など)
8. 予算を設定してコストを管理する その他の重要なセットアップ手順には以下が含まれます:

9. 複数アカウントを管理する場合は AWS 組織を設定する
10. CloudWatch でモニタリングとアラートを設定する
11. 定期的にセキュリティ監査を行い、不要なアクセス権限を削除する
12. リソースの管理のためにタグ付け戦略を策定する
13. AWS Config を設定してリソースの変更を追跡する
14. CloudFormation を使ってインフラをコード化する</answer>
</conversation>

</conversation_history>

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.'

4 つ目

4つ目のログになります。

ここからは、いつも通りのエンべディングフェーズに入ります。 16 行目の inputText に書き換えられたクエリの内容が入力されていますね。

{
	"schemaType": "ModelInvocationLog",
	"schemaVersion": "1.0",
	"timestamp": "2024-05-06T09:11:55Z",
	"accountId": "XXXXXXXXXXXX",
	"identity": {
		"arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/pinecone-serverless-dev-kb-role/BedrockQueryKnowledgeBaseSession-XXXXXXXXXXX"
	},
	"region": "us-east-1",
	"requestId": "9be6bb0b-9bff-4f54-b4c6-232746339aa9",
	"operation": "InvokeModel",
	"modelId": "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v1",
	"input": {
		"inputContentType": "application/json",
		"inputBodyJson": {
			"inputText": "aws アカウントのセットアップ 15番以降の手順"
		},
		"inputTokenCount": 12
	},
	"output": {
		"outputContentType": "application/json",
		"outputBodyJson": {
			"embedding": [
				1.28125, -0.34179688, 0.73046875, -0.10498047, 0.15917969, 0.030639648
			],
			"inputTextTokenCount": 12
		}
	}
}

5 つ目

最後に回答の生成です。

こちらも 23 行目のユーザーメッセージの内容が、書き換えられたクエリに対する内容に置き換わっていますね。3 番目に出力された書き換えられたクエリと 4 番目に実行されたベクトル検索の結果をもとに、回答が生成されていることがわかります。

{
	"schemaType": "ModelInvocationLog",
	"schemaVersion": "1.0",
	"timestamp": "2024-05-06T09:11:55Z",
	"accountId": "XXXXXXXXXXXX",
	"identity": {
		"arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/takakuni"
	},
	"region": "us-east-1",
	"requestId": "415ba553-ea10-4dd1-a86a-14baf64cf138",
	"operation": "InvokeModel",
	"modelId": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0",
	"input": {
		"inputContentType": "application/json",
		"inputBodyJson": {
			"anthropic_version": "bedrock-2023-05-31",
			"messages": [
				{
					"role": "user",
					"content": [
						{
							"type": "text",
							"text": "aws アカウントのセットアップ 15番以降の手順"
						}
					]
				}
			],
			"system": "You are a question answering agent. I will provide you with a set of search results. The user will provide you with a 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.\n\nHere are the search results in numbered order:\n<search_results>\n<search_result>\n<content>\n# エンジニア向け目標設定の方法  ## 1. 全体目標の設定  - 会社の技術戦略を確認し、開発部門の目標を設定する   - プロジェクト完遂率、品質目標、技術的負債の削減目標など  ## 2. 個人目標の設定  - エンジニアのスキルと適性を把握し、個人の目標を設定する   - 担当プロジェクト数、スキルアップ目標、コードレビュー実施率、ドキュメント作成率など  ## 3. 目標達成のためのアクションプラン  - アジャイル開発手法の導入、コードの品質向上施策、技術的負債の可視化と削減 - 定期的な進捗確認と調整、問題点の洗い出しと対策の実施  ## 4. 目標達成のためのサポート  - CI/CD パイプラインの構築、開発ツールの充実 - 技術研修の実施、カンファレンス・勉強会への参加奨励  ## 5. 評価とフィードバック  - 個人とチーム全体の目標達成度の評価 - 良かった点・改善点の共有、次期目標設定への反映  明確な目標設定と組織的なサポートが重要。\n</content>\n<source>\n1\n</source>\n</search_result>\n<search_result>\n<content>\n# オフィスの利用方法マニュアル  ## 1. 入退室について  - オフィスの利用可能時間は、平日の 9:00 から 18:00 までです。 - 入室の際は、受付で名前と所属をお伝えください。 - 退室時は、必ず施錠し、鍵を受付に返却してください。  ## 2. 設備の利用について  ### 2.1 会議室  - 会議室の利用は、事前に予約が必要です。 - 利用後は、机や椅子を元の位置に戻し、清掃をお願いします。 - 会議室内での飲食は可能ですが、ゴミは必ず持ち帰ってください。  ### 2.2 コピー機・プリンター  - コピー機とプリンターは、オフィス内の共有スペースに設置されています。 - 利用後は、用紙の補充や簡単な清掃をお願いします。 - 大量の印刷が必要な場合は、事前に管理者へ相談してください。  ### 2.3 キッチン  - キッチンは、自由に利用できます。 - 食器や調理器具は、使用後に洗浄し、元の位置に戻してください。 - 冷蔵庫内の食品は、自分の名前を明記し、長期保存は避けてください。  ## 3. セキュリティについて  - オフィス内では、名札の着用をお願いします。 - 来客がある場合は、事前に管理者へ連絡し、受付で手続きを行ってください。 - 機密情報を含む書類は、施錠できるキャビネットで管理してください。  ## 4. 緊急時の対応  - 火災や地震などの緊急時は、落ち着いて行動し、指示に従ってください。 - 避難経路や消火器の位置は、事前に確認しておいてください。 - 怪我や体調不良の場合は、すぐに管理者へ連絡してください。  本マニュアルを遵守し、快適なオフィス環境の維持にご協力ください。\n</content>\n<source>\n2\n</source>\n</search_result>\n<search_result>\n<content>\n## 23. 定期的なセキュリティトレーニング  - チーム全体を対象に、定期的なセキュリティトレーニングを実施します。 - AWS のセキュリティベストプラクティスや新機能について学び、セキュリティ意識を高めます。 - フィッシング攻撃やソーシャルエンジニアリングに対する対策を徹底します。  ## 24. コミュニティとの交流  - AWS のユーザーコミュニティや forums に参加し、ベストプラクティスや経験を共有します。 - AWS のイベントやウェビナーに参加し、最新の情報を入手します。 - AWS ブログや公式ドキュメントを定期的にチェックし、新機能やアップデートを把握します。  ## 25. AWS CloudTrail の詳細な設定  - CloudTrail の証跡に対して、暗号化とログファイルの整合性検証を有効にします。 - CloudTrail ログを Amazon CloudWatch Logs に送信し、リアルタイムな監視とアラートを設定します。 - AWS Lambda を使用して、CloudTrail イベントに基づいてカスタムアクションを実行します。  ## 26. Amazon GuardDuty の有効化  - Amazon GuardDuty を有効にして、インテリジェントな脅威検出と継続的なモニタリングを実現します。 - GuardDuty が生成する調査結果を確認し、適切な対応策を講じます。 - GuardDuty の調査結果を AWS Security Hub や他のセキュリティツールと統合します。  ## 27. AWS Config Rules の拡張  - AWS Config Rules を使用して、リソースの設定が組織のポリシーや業界の規制に準拠していることを確認します。 - カスタム Config Rules を作成し、組織固有の要件に対応します。 - Config Rules の評価結果を定期的にレビューし、違反があった場合は速やかに修正します。  ## 28. AWS Trusted Advisor の活用  - AWS Trusted Advisor を使用して、ベストプラクティスに基づいた推奨事項を受け取ります。 - コスト最適化、セキュリティ、信頼性、パフォーマンス、サービス制限の 5 つのカテゴリーで、改善の機会を特定します。 - Trusted Advisor の推奨事項を定期的にレビューし、必要なアクションを実行します。  ## 29. AWS Personal Health Dashboard の活用  - AWS Personal Health Dashboard を使用して、AWS サービスの状態と予定されたメンテナンスを追跡します。 - 個人的な AWS アカウントに影響を与える可能性のあるイベントについて、通知を受け取ります。 - イベントの詳細を確認し、必要な対策を講じて、ビジネスへの影響を最小限に抑えます。  ## 30. AWS Partner Network (APN) の活用  - AWS Partner Network (APN) を通じて、信頼できるサードパーティのソリューションやサービスを見つけます。 - APN パートナーのエキスパティーズを活用して、ワークロードの設計、移行、最適化を支援してもらいます。 - APN テクノロジーパートナーのソリューションを活用して、AWS 環境の機能を拡張します。  ## 31. 継続的な学習と改善  - AWS のドキュメント、ホワイトペーパー、ケーススタディを読んで、ベストプラクティスと新しい機能について学びます。 - AWS の認定プログラムを活用して、チームのスキルを向上させます。 - 定期的に AWS アーキテクチャとプロセスを見直し、継続的な改善の機会を特定します。\n</content>\n<source>\n3\n</source>\n</search_result>\n<search_result>\n<content>\nタグ付けの戦略  - リソースの管理と追跡を容易にするために、一貫したタグ付けの戦略を策定します。 - タグ付けの命名規則を決定し、すべてのリソースにタグを適用します。 - タグを使用して、コストの配分、セキュリティ管理、リソースのグループ化などを行います。  ## 13. AWS Config の設定  - AWS Config を有効にして、リソースの設定変更を追跡し、コンプライアンスを確保します。 - 必要なルールを設定し、リソースの設定が定義された基準に準拠していることを確認します。 - 設定の変更履歴を確認し、問題が発生した場合に迅速に対応できるようにします。  ## 14. AWS CloudFormation の活用  - インフラストラクチャをコードとして管理するために、AWS CloudFormation を使用します。 - テンプレートを作成し、リソースのプロビジョニングと設定を自動化します。 - スタックの更新や削除を管理し、インフラストラクチャの変更を追跡します。  ## 15. ディザスタリカバリ計画の策定  - ビジネスの継続性を確保するために、ディザスタリカバリ計画を策定します。 - 重要なデータとアプリケーションを特定し、バックアップと復元の手順を文書化します。 - AWS のマルチリージョン機能を活用し、障害発生時にもサービスを継続できるようにします。  ## 16. 定期的なアカウントレビュー  - 四半期ごとまたは半年ごとに、AWS アカウントの全体的なレビューを実施します。 - 未使用のリソースを特定し、コストを最適化します。 - セキュリティ設定、アクセス権限、コンプライアンス要件を確認し、必要に応じて更新します。  ## 17. AWS サポートプランの検討  - ビジネスニーズに応じて、適切な AWS サポートプランを選択します。 - 技術的な問題やアーキテクチャの相談に対して、AWS の専門家からサポートを受けることができます。 - サポートプランに含まれるツールや機能を活用し、運用効率を向上させます。  ## 18. AWS Well-Architected フレームワークの活用  - AWS Well-Architected フレームワークを使用して、ワークロードの設計と運用を最適化します。 - 5 つの柱(運用上の優秀性、セキュリティ、信頼性、パフォーマンス効率、コスト最適化)に基づいて、アーキテクチャをレビューします。 - Well-Architected ツールを使用して、改善点を特定し、ベストプラクティスに沿ってワークロードを進化させます。  ## 19. AWS Identity and Access Management (IAM) のベストプラクティス  - 最小権限の原則に従い、ユーザーとロールに必要最小限のアクセス権限を付与します。 - IAM ポリシーを定期的にレビューし、未使用または過剰な権限を削除します。 - IAM Access Analyzer を使用して、リソースへの外部アクセスを特定し、セキュリティを強化します。  ## 20. AWS Security Hub の活用  - AWS Security Hub を有効にして、セキュリティ状態を一元的に可視化および管理します。 - AWS のサービスやサードパーティ製ツールからのセキュリティ警告を統合し、優先順位付けします。 - 自動化されたコンプライアンスチェックを実行し、セキュリティ基準への準拠を確保します。  ## 21. AWS Cost Explorer の活用  - AWS Cost Explorer を使用して、コストの内訳と傾向を分析します。 - コストの異常や予期しない増加を特定し、適切な対策を講じます。 - コスト配分タグを使用して、部門、プロジェクト、または環境ごとにコストを追跡します。  ## 22. AWS Systems Manager の活用  - AWS Systems Manager を使用して、EC2 インスタンスやオンプレミスサーバーを一元的に管理します。 - パッチ適用、ソフトウェアのインストール、設定管理などのタスクを自動化します。 - Systems Manager Automation を使用して、運用タスクを標準化し、人的エラーを減らします。  ## 23. 定期的なセキュリティトレーニング  - チーム全体を対象に、定期的なセキュリティトレーニングを実施します。 - AWS のセキュリティベストプラクティスや新機能について学び、セキュリティ意識を高めます。 - フィッシング攻撃やソーシャルエンジニアリングに対する対策を徹底します。  ## 24. コミュニティとの交流  - AWS のユーザーコミュニティや forums に参加し、ベストプラクティスや経験を共有します。 - AWS のイベントやウェビナーに参加し、最新の情報を入手します。 - AWS ブログや公式ドキュメントを定期的にチェックし、新機能やアップデートを把握します。  ## 25. AWS CloudTrail の詳細な設定  - CloudTrail の証跡に対して、暗号化とログファイルの整合性検証を有効にします。\n</content>\n<source>\n4\n</source>\n</search_result>\n<search_result>\n<content>\n# AWS アカウントの初期セットアップ方法  ## 1. AWS アカウントの作成  - [AWS 公式サイト](https://aws.amazon.com/)にアクセスし、「アカウントを作成」をクリックします。 - 必要な情報(メールアドレス、パスワード、支払い情報など)を入力し、アカウントを作成します。  ## 2. ルートユーザーのセキュリティ対策  - ルートユーザーの長く複雑なパスワードを設定します。 - 多要素認証(MFA)を有効にします。 - アクセスキーを削除または無効化します。  ## 3. IAM ユーザーの作成  - IAM(Identity and Access Management)ダッシュボードにアクセスします。 - 「ユーザー」を選択し、「ユーザーを追加」をクリックします。 - ユーザー名を入力し、アクセスタイプ(プログラムによるアクセス、AWS マネジメントコンソールへのアクセス)を選択します。 - 必要な権限を付与するか、既存のグループに追加します。  ## 4. 請求アラートの設定  - 「請求」ダッシュボードにアクセスします。 - 「請求アラートの管理」をクリックし、アラートを設定します。 - 予期しない高額な請求を防ぐために、適切な閾値を設定します。  ## 5. CloudTrail の有効化  - CloudTrail ダッシュボードにアクセスします。 - 「証跡の作成」をクリックし、証跡名を入力します。 - 必要に応じて、データイベントやマネジメントイベントを記録するように設定します。 - S3 バケットを指定して、ログファイルを保存します。  ## 6. 仮想プライベートクラウド(VPC)の作成  - VPC ダッシュボードにアクセスします。 - 「VPC の作成」をクリックし、必要な設定(IP アドレス範囲、サブネット、ルートテーブルなど)を行います。 - セキュリティグループを作成し、適切なインバウンドおよびアウトバウンドルールを設定します。  ## 7. 必要な AWS サービスの設定  - 使用予定の AWS サービス(EC2、RDS、S3、Lambda など)を特定します。 - 各サービスのダッシュボードにアクセスし、必要な設定を行います。 - 適切なセキュリティ設定、スケーリング設定、バックアップ設定などを行います。  ## 8. 予算の設定  - 「予算」ダッシュボードにアクセスします。 - 「予算の作成」をクリックし、予算名、予算額、アラート設定などを入力します。 - 予算に応じて、コストを管理し、予期しない高額な請求を防ぎます。  ## 9. AWS 組織の設定(オプション)  - 複数の AWS アカウントを管理する場合は、AWS 組織を設定することを検討します。 - 「AWS Organizations」ダッシュボードにアクセスし、組織を作成します。 - メンバーアカウントを招待し、組織内でポリシーを設定して、アカウント間のリソース共有とセキュリティを管理します。  ## 10. モニタリングとアラートの設定  - CloudWatch ダッシュボードにアクセスします。 - 各 AWS サービスのメトリクスを確認し、必要に応じてアラームを設定します。 - アラームが発生した場合に通知を受け取るように、SNS トピックを設定します。  ## 11. 定期的なセキュリティ監査  - IAM ユーザー、ロール、ポリシーを定期的に見直し、不要なアクセス権限を削除します。 - セキュリティグループとネットワーク ACL の設定を確認し、適切なルールが設定されていることを確認します。 - AWS Trusted Advisor を使用して、セキュリティ、パフォーマンス、コスト最適化に関する推奨事項を確認します。  ## 12. タグ付けの戦略  - リソースの管理と追跡を容易にするために、一貫したタグ付けの戦略を策定します。 - タグ付けの命名規則を決定し、すべてのリソースにタグを適用します。 - タグを使用して、コストの配分、セキュリティ管理、リソースのグループ化などを行います。  ## 13. AWS Config の設定  - AWS Config を有効にして、リソースの設定変更を追跡し、コンプライアンスを確保します。 - 必要なルールを設定し、リソースの設定が定義された基準に準拠していることを確認します。 - 設定の変更履歴を確認し、問題が発生した場合に迅速に対応できるようにします。  ## 14. AWS CloudFormation の活用  - インフラストラクチャをコードとして管理するために、AWS CloudFormation を使用します。 - テンプレートを作成し、リソースのプロビジョニングと設定を自動化します。 - スタックの更新や削除を管理し、インフラストラクチャの変更を追跡します。\n</content>\n<source>\n5\n</source>\n</search_result>\n\n</search_results>\n\nIf 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.\n\nNote that <sources> may contain multiple <source> if you include information from multiple results in your answer.\n\nDo NOT directly quote the <search_results> in your answer. Your job is to answer the user's question as concisely as possible.\n\nYou must output your answer in the following format. Pay attention and follow the formatting and spacing exactly:\n<answer>\n<answer_part>\n<text>\nfirst answer text\n</text>\n<sources>\n<source>source ID</source>\n</sources>\n</answer_part>\n<answer_part>\n<text>\nsecond answer text\n</text>\n<sources>\n<source>source ID</source>\n</sources>\n</answer_part>\n</answer>",
			"max_tokens": 2048,
			"temperature": 0,
			"top_k": 50,
			"top_p": 1,
			"stop_sequences": ["\nObservation"]
		},
		"inputTokenCount": 5927
	},
	"output": {
		"outputContentType": "application/json",
		"outputBodyJson": {
			"id": "msg_01PEuAbJQBjqdnnr3HnifcQU",
			"type": "message",
			"role": "assistant",
			"content": [
				{
					"type": "text",
					"text": "<answer>\n<answer_part>\n<text>\n15. ディザスタリカバリ計画の策定\n- ビジネスの継続性を確保するために、ディザスタリカバリ計画を策定します。\n- 重要なデータとアプリケーションを特定し、バックアップと復元の手順を文書化します。\n- AWS のマルチリージョン機能を活用し、障害発生時にもサービスを継続できるようにします。\n</text>\n<sources>\n<source>4</source>\n</sources>\n</answer_part>\n\n<answer_part>\n<text>\n16. 定期的なアカウントレビュー\n- 四半期ごとまたは半年ごとに、AWS アカウントの全体的なレビューを実施します。\n- 未使用のリソースを特定し、コストを最適化します。\n- セキュリティ設定、アクセス権限、コンプライアンス要件を確認し、必要に応じて更新します。\n</text>\n<sources>\n<source>4</source>\n</sources>\n</answer_part>\n\n<answer_part>\n<text>\n17. AWS サポートプランの検討\n- ビジネスニーズに応じて、適切な AWS サポートプランを選択します。\n- 技術的な問題やアーキテクチャの相談に対して、AWS の専門家からサポートを受けることができます。\n- サポートプランに含まれるツールや機能を活用し、運用効率を向上させます。\n</text>\n<sources>\n<source>4</source>\n</sources>\n</answer_part>\n</answer>"
				}
			],
			"model": "claude-3-sonnet-28k-20240229",
			"stop_reason": "end_turn",
			"stop_sequence": null,
			"usage": {
				"input_tokens": 5927,
				"output_tokens": 474
			}
		},
		"outputTokenCount": 474
	}
}

まとめ

以上のことから、 Knowledge bases for Amazon Bedrock の RetrieveAndGenerate API で使用する sessionId パラメーターは、セッション保持に加えてクエリの書き換えも行ってくれることがわかりました。ログを確認することで、その動作をより深く理解することができます。ログは良い収集源ですね。またこのような小ネタがあれば、ご紹介できればと思います。

このブログがどなたかの参考になれば幸いです。

AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!