[Amazon Bedrock AgentCore] RuntimeにLangGraphで実装したAIエージェントをデプロイしてみる
データ事業本部の鈴木です。
現在パブリックプレビューで提供されているAmazon Bedrock AgentCoreにLangGraphによるAIエージェントをデプロイできるのか気になっていたので試してみました。
さらっとにはなりますがご共有します。
概要
Strands Agentsをデプロイする例は、スーパーマーケットのラ・ムーが大好きなコンサル部の神野さんが書いてくれているため、デプロイ対象となるPythonプログラムの中身をLangGraphによる実装に変更してデプロイしてみました。
▼自動生成されるファイル
▼デプロイの全体像
(上記ブログより引用)
やってみた
1. ローカルの環境構築
以下のように、ローカル環境にBedrockAgentCore Starter ToolkitのCLI実行環境を用意しました。
まずは必用なライブラリをインストールするためのrequirements.txt
を用意しました。
langgraph
langchain[aws]
bedrock-agentcore
bedrock-agentcore-starter-toolkit
続いて環境を作成しました。
python3 -m venv agentcore-env
source agentcore-env/bin/activate
# 必要なパッケージをインストール
pip install -r requirements.txt
2. エージェントの実装
このブログの一番大事なところですが、LangGraphによる実装は以下のようにしました。
ReActエージェントの簡単な実装になります。
ツールはとりあえず固定の天気情報を返す関数を作りました。
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from langchain_aws import ChatBedrock
from langgraph.prebuilt import create_react_agent
app = BedrockAgentCoreApp()
def weather() -> str:
"""現在の天気を回答する"""
return "ひどい雨です"
@app.entrypoint
async def entrypoint(payload):
message = payload.get("prompt", "")
model = payload.get("model", {})
model_id = model.get("modelId","anthropic.claude-3-5-haiku-20241022-v1:0")
llm = ChatBedrock(
region_name="us-west-2",
model_id=model_id,
model_kwargs={
"max_tokens": 1000,
"temperature": 0.1
},
)
agent = create_react_agent(
llm,
tools = [weather]
)
stream_messages = agent.stream(
{"messages": [{"role": "user", "content": message}]},
stream_mode="updates"
)
for message in stream_messages:
yield message
if __name__ == "__main__":
app.run()
3. デプロイ
CLIからエージェントをAgentCoreにデプロイしました。
# 設定、とりあえず全てEnterキー連打で進める
agentcore configure -e agent.py
# デプロイ実行
agentcore launch
agentcore configure
は作成されるyamlファイルとDockerfileにデフォルトリージョンを記載するようでしたので、デフォルトリージョンがAgentCoreのサポートリージョンと異なる場合は書き換える必要がありました。
以下のようにランタイムエージェントがデプロイできました。
4. 動作確認
以下のようにリクエストを送り、ツールを使って回答してくれるか確認しました。
agentcore invoke '{"prompt":"天気はどうですか?"}'
レスポンスは例えば以下のようになり、エージェント側でツールを使って回答してくれていることを確認できました。
{"agent": {"messages": [{"content": "現在の天気を確認するために、weatherツールを使用します。", "additional_kwargs": {"usage": {"prompt_tokens":
317, "completion_tokens": 55, "cache_read_input_tokens": 0, "cache_write_input_tokens": 0, "total_tokens": 372}, "stop_reason": "tool_use",
"thinking": {}, "model_id": "anthropic.claude-3-5-haiku-20241022-v1:0", "model_name": "anthropic.claude-3-5-haiku-20241022-v1:0"},
"response_metadata": {"usage": {"prompt_tokens": 317, "completion_tokens": 55, "cache_read_input_tokens": 0, "cache_write_input_tokens": 0,
"total_tokens": 372}, "stop_reason": "tool_use", "thinking": {}, "model_id": "anthropic.claude-3-5-haiku-20241022-v1:0", "model_name":
"anthropic.claude-3-5-haiku-20241022-v1:0"}, "type": "ai", "name": null, "id": "run--1b7a726c-6d42-4940-b837-c9e16d0340e5-0", "example": false,
"tool_calls": [{"name": "weather", "args": {}, "id": "toolu_bdrk_01AKm1viLKYSQVRceW1wtzia", "type": "tool_call"}], "invalid_tool_calls": [],
"usage_metadata": {"input_tokens": 317, "output_tokens": 55, "total_tokens": 372, "input_token_details": {"cache_creation": 0, "cache_read":
0}}}]}}
{"tools": {"messages": [{"content": "ひどい雨です", "additional_kwargs": {}, "response_metadata": {}, "type": "tool", "name": "weather", "id":
"604fb148-bb2b-47fd-b446-54b382257189", "tool_call_id": "toolu_bdrk_01AKm1viLKYSQVRceW1wtzia", "artifact": null, "status": "success"}]}}
{"agent": {"messages": [{"content":
"現在、ひどい雨が降っているようです。外出する際は、傘や雨具を忘れずに持ち歩いてください。雨天時は交通機関の遅延や道路の状況にも注意が必要です。
できれば、屋内で過ごすことをおすすめします。", "additional_kwargs": {"usage": {"prompt_tokens": 390, "completion_tokens": 95,
"cache_read_input_tokens": 0, "cache_write_input_tokens": 0, "total_tokens": 485}, "stop_reason": "end_turn", "thinking": {}, "model_id":
"anthropic.claude-3-5-haiku-20241022-v1:0", "model_name": "anthropic.claude-3-5-haiku-20241022-v1:0"}, "response_metadata": {"usage":
{"prompt_tokens": 390, "completion_tokens": 95, "cache_read_input_tokens": 0, "cache_write_input_tokens": 0, "total_tokens": 485},
"stop_reason": "end_turn", "thinking": {}, "model_id": "anthropic.claude-3-5-haiku-20241022-v1:0", "model_name":
"anthropic.claude-3-5-haiku-20241022-v1:0"}, "type": "ai", "name": null, "id": "run--7676fcdc-2084-465d-ae2a-0b8ffaded816-0", "example": false,
"tool_calls": [], "invalid_tool_calls": [], "usage_metadata": {"input_tokens": 390, "output_tokens": 95, "total_tokens": 485,
"input_token_details": {"cache_creation": 0, "cache_read": 0}}}]}}
同様にエージェントサンドボックスからも実行可能でした。
GenAI Observabilityダッシュボードでもトレースが確認可能でした。
最後に
LangGraphによるAIエージェントもAgentCoreランタイムでホスト可能そうでした。
GenAI Observabilityダッシュボードでも監視やロギングができていたのも良い点でした。
GatewayやMemoryなどの機能も利用できるかは別途試してみたいと思います。