こちらの投稿は2025 Japan AWS Jr.Championsの有志メンバーで作成した『30日間で主要AWSサービスを構築できるようになる』をテーマにした初学者向けのハンズオン問題集のDAY28になります!
問題集の趣旨や作成に至るまでの経緯は以下の記事をご覧いただければと思います。
📘 Day28:Bedrock Agents で簡潔な検索エージェントを作ろう
📝 概要
| 項目 | 内容 |
|---|---|
| 所要時間 | 約1時間 |
| メインサービス | Amazon Bedrock Agents, AWS Lambda |
| 学べること | Bedrock Agents の基礎知識, Bedrockを使用したエージェントの構築方法 |
| 想定費用 | 約10円(※モデル、実行回数により変動します) |
⚠️ 注意:以下のリソースを削除し忘れると課金が継続します。
- CloudWatch Logs
🎯 課題内容
検索機能に特化した簡潔な検索エージェントを作成します。
例えば、特定の情報検索やFAQ応答などを自然言語で行えるようにします。
📊 アーキテクチャ図
🔧 実装機能
- マネージメントコンソールで、作成したAgent を介した情報検索やFAQ応答ができます。
- 検索APIから情報を取得し、Lambda 経由でBedrock Agentに返却します。
💡 実装のヒント
Bedrock Agentsの実装方法
Amazon Bedrock の Agents 機能を使用すると、Lambda関数をエージェントから呼び出せます。
開発中は、以下に留意するといいでしょう。
- エージェントのプロンプトは、別画面(アクショングループ編集画面など)に移動する前に必ず保存する。
- Lambda関数が受け取るイベント(
event)やBedrock Agentsへの返却形式の定義は、以下を参照する: - Lambda関数には、Bedrockが呼び出すためのリソースベースポリシーが必要(上記開発者ガイド参考)。
- Bedrock Agentsには、Lambda関数を呼び出すためのポリシーが必要(上記開発者ガイド参考)。
- 検索エンジンには、Tavily Searchなどを想定します。Google検索でも、好みの検索エンジンでもOKですが、サンプルコードはTavily Searchで提供します。サンプルコードの実行には、API Keyを取得しておいてください。
- Bedrockでのモデル利用には、モデルアクセスでの事前承認が必要です。Claude 3などの基本的なモデルは、リクエスト後、数分以内で利用できます。
AIエージェントの概念
上記「Bedrock Agentsの実装方法」の用語がわからない場合、以下の記事を一通り学習すると、AIエージェントの実装が理解でき、いいと思います。
基本的な概念を簡単に知りたい方には、以下で簡潔に説明します。
- LLMは、テキストを生成できるディープラーニング技術を使用した機械学習の言語生成モデルです。
- LLMは、モデルサイズが大きく、数十GB ~ 数百GB、それ以上の容量があります。これを動かす(ホストする)ために、AWSのようなGPUリソースが豊富なクラウドサービスを使用し、ユーザは、他のクラウドサービス同様、APIで呼び出します。
- チャットモデルのLLMをAPIで呼び出す場合、ユーザのメッセージとAI(LLM)のメッセージを会話履歴としてまとめて送信します。初回はユーザのメッセージだけです。
- 現在のLLMは、エージェントとして呼び出す事もできます。すなわち、ユーザの依頼内容(テキスト、画像、…)と、LLMが使用を決定できる関数(ツール)と、ツールの説明文を与えれば、LLMは、ユーザの依頼に応えるために、使用すべきツールを決定し、決めた引数で関数を実行し、その結果を評価します。十分な情報が集まったら、LLMはツール利用を止めて、ユーザに回答を返却します。
- 正確には、上のプロセスのツール利用は、A. LLMが各ツールの説明文を読む B. LLMがツールとパラメータ(引数)を決定する C. LLMがツール実行結果を評価し、終了またはツール実行を決定する
✅ 完成後のチェックポイント
- マネージメントコンソールのテストチャットから情報検索ができる
🧰 使用資材(早く実装したい人向け)
サンプルコード
このLambda関数には、以下を設定してください
-
環境変数
TAVILY_API_KEYでtvly-****という形式のAPIキー -
Layer
AWSSDKPandas-Python313(arn:aws:lambda:ap-northeast-1:336392948345:layer:AWSSDKPandas-Python313:4) -
リソースベースポリシー
- Principalが
bedrock.amazonaws.com - ソースARNが
arn:aws:bedrock:{リージョン}:{アカウントID}:agent/*" - Actionが
lambda:InvokeFunction - を
Allowしてください
# lambda_function.py
import json
import datetime
from tavily_search import tavily_search
def lambda_handler(event, context):
# 1.パラメータの取得
agent = event['agent']
actionGroup = event['actionGroup']
function = event['function']
parameters = event.get('parameters', [])
query = parameters.get('query', None)
session_attributes = event['sessionAttributes']
prompt_session_attributes = event['promptSessionAttributes']
# 2.検索クエリが無い場合はエージェントに再入力を求める
if not query:
return {
'messageVersion': '1.0',
'response': {
'actionGroup': actionGroup,
'function': function,
"functionResponse": {
"responseState": "REPROMPT",
"responseBody": {
"<functionContentType>": {
"body": "JSON-formatted string"
}
}
},
'sessionAttributes': session_attributes,
'promptSessionAttributes': prompt_session_attributes
}
}
# 3.検索クエリがある場合は、Tavilyで検索する
results = tavily_search(query)
response_body = {
'TEXT': {
'body': results
}
}
# Lambda関数を使用するBedrock Agents 向けのアウトプットに整形
function_response = {
'actionGroup': event['actionGroup'],
'function': event['function'],
'functionResponse': {
'responseBody': response_body
}
}
action_response = {
'messageVersion': '1.0',
'response': function_response,
'sessionAttributes': session_attributes,
'promptSessionAttributes': prompt_session_attributes
}
return action_response
# tavily_search.py
import os
import json
import requests
def tavily_search(query):
url = "https://api.tavily.com/search"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['TAVILY_API_KEY']}",
}
data = {"query": query}
response = requests.post(url, headers=headers, data=json.dumps(data))
return response.json()
🔗 リファレンスリンク
🛠️ 解答・構築手順(クリックで開く)
解答と構築手順を見る
✅ ステップ0:モデルアクセスの付与
※ 将来的にモデルアクセスは廃止予定です。この手順を開いたときにはもう不要かもしれません...
BedrockでLLMを使用するには、各モデルプロバイダーごとに申請をする必要があります。
手順:
- Amazon Bedrockのコンソールへ
-
Model Accessへ
オレンジのボタン:Modify Model Accessをクリック - 必要なモデル(Claude 3, Claude 3.5, Claude 3.5 v2, ... , Nova Proなど)をチェックして申請。
- 数分後にAmazon Marketplaceからメールが届き、承認されます!
✅ ステップ1:AWS Lambda の作成
- Lambda関数のコンソールへ
- 「Lambda」→「関数の作成」を選択
- ランタイムは Python 3.13 (または Node.js 22.x を推奨, サンプルコードはPythonのみです)
- 任意の関数名を入力し、作成。
- Lambda 関数コードを「サンプルコード」の通りに記述し、各種関数の設定を行う。
✅ ステップ2:Bedrock Agents の作成
- Bedrockエージェントのコンソールへ
- 「エージェントを作成」を押し、名前を入力、作成。エージェントビルダーの画面が開きます。
- モデルを選択で、「Claude 3 Haiku」などを選択。高性能で最新のモデルを選択すると、コストが上昇します。
-
エージェント向けの指示で、以下のプロンプトを入力。
あなたは標準語を話すエージェントです。ツールを使用して、ユーザが意図した検索対象を検索し、詳細な検索結果を日本語で伝えます。 - 「保存」をクリックして、ここまでの設定を保存。
- アクショングループのセクションで、「追加」をクリック。
-
アクショングループタイプで、「関数の詳細で定義」を選択。
※ここの選択で、Lambda関数のBedrock Agentsへの戻り値の形式が決まります。 - アクショングループの呼び出しで、「既存の Lambda 関数を選択してください」を選択し、ステップ1で作成したLambda関数を選択。
- アクショングループ関数1のセクションで、パラメータに以下の情報を入力。それ以外は任意の内容。
| 項目 | 値 |
|---|---|
| 名前 | query |
| 説明 | 検索したい内容 |
| タイプ | string |
| 必須 | True |
- 「保存して終了」をクリック。
- エージェントビルダーの画面で、保存。
- 準備をクリックし、「保存して終了」
- エージェントの概要のセクションで「許可」のURLをクリック。IAMの画面へ。
- 許可ポリシーで、インラインポリシーを追加。ポリシーエディタをJSONモードで開き、以下ポリシーを追加。ポリシー名を記入して終了。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "arn:aws:lambda:{リージョン}:{アカウントID}:function:*"
}
]
}
- Bedrock Agentsの画面に戻り、作成したエージェントを開く。
右側のペイン「テスト」で、任意の検索を行う。例:明日の新宿の天気は?
🧹 片付け(リソース削除)
- Lambda 関数を削除
- IAM ポリシー・IAMロールを削除
- CloudWatch Logs ロググループを削除
- Bedrock Agent を削除
🏁 おつかれさまでした!
この課題では Bedrock Agents と AWS Lambda、Tavily Searchの連携を通して、サーバレスAIエージェント開発スキルが身につきます。興味がある方は、マルチエージェントシステムの構築や、Lambda関数のカスタマイズ、今回は扱わなかったBedrock Agentsに関連する多くの機能を組み込むと面白いでしょう!