這篇文章是人工撰寫的。
這是一份為活動準備的操作手冊,閱讀本文後,任何人都可以在大約一小時內進行嘗試!
使用 Claude Code 等 AI 代理人「的人」數量顯著增加。
如今,使用 AI 已經是每個人的常態。
我們更應該邁出一步,學習「製作」AI 代理人,這樣會更加有趣🙌
創建 AWS 帳戶
建議新建帳戶。如果使用現有帳戶,請自行負責。
※最近出現了功能受限的完全免費方案,但請選擇「付費(Paid)」的選項。
此次的收費預計在幾十日圓的範圍內。(無法百分之百保證,請自行負責)
創建 GitHub 帳戶
如果已經擁有帳戶,請使用現有帳戶。
構建 AI 代理人時,使用雲端服務會非常方便。
使用 Strands,我們可以輕鬆地用 Python 編寫 AI 代理人。
開發的 AI 代理人可以使用 AgentCore 以無伺服器的方式廉價部署。
創建 GitHub 倉庫
tokyo-ai2025
啟動 GitHub Codespaces
創建所需的文件
touch .env
# AWS 認證資訊
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-west-2
在碼流中,輸入後會自動保存文件。
第一行和第二行的值將在接下來的步驟中填入。
創建 IAM 用戶
本次實作將全部在美國(俄勒岡)地區進行。
請先在畫面右上方切換到該地區。
codespaces
AdministratorAccess
創建 IAM 訪問密鑰
.env
中的第一行粘貼訪問密鑰,第二行粘貼秘密訪問密鑰# AWS 認證資訊
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE #範例
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY #範例
AWS_DEFAULT_REGION=us-west-2
由於此認證資訊具有管理員權限,請謹慎處理。
如果不小心推送到公共 GitHub 倉庫,將會快速被壞人檢測到,可能導致你的 AWS 帳戶被濫用。
啟用 Bedrock 模型
※根據 AWS 的公告,從 2025/10/8 起,該步驟可能會有部分不必要的情況。
hands-on
mkdir 1_strands
cd 1_strands
touch 1_agent.py
# 導入所需的庫
from dotenv import load_dotenv
from strands import Agent
# 從 .env 文件中讀取環境變數
load_dotenv()
# 創建代理人並啟動
agent = Agent()
agent("東京AI祭って何?")
抱歉,我有些誇張了。 如果沒有 .env
文件,實際上只需三行。
如果不指定模型,默認將使用 Bedrock 的 Claude Sonnet 4。
pip install strands-agents python-dotenv
python 1_agent.py
它會回答您,但似乎對東京 AI 祭的事情並不了解。
很抱歉,我沒有「東京 AI 祭」的具體信息。
如果您想詳細了解此活動,建議您通過以下方式查找最新信息:
1. **網絡搜尋**「東京 AI 祭」
2. **尋找官方網站**或社交媒體帳號
3. **查詢 AI 相關機構**或 **東京都的官方網站**
4. **查看技術類媒體**或新聞網站
如果這是一個關於 AI 技術的活動,通常這樣的節慶會包含以下內容:
- AI 技術的展示和演示
- 專家發表的講座和小組討論
- 工作坊和體驗區
- 企業或研究機構的最新 AI 研究發表
具體細節請查閱官方信息源以獲取最新信息。
參考:除了 Bedrock 的其他模型,當然還可以調用 OpenAI 的模型!
我們可以為其添加網頁搜索功能,讓其能夠回答最新資訊。
首先,請註冊網頁搜索服務 Tavily(創建帳戶)。
如果連結您的 GitHub 帳戶,幾秒鐘內即可完成。
複製顯示的 API 金鑰並將其添加到 .env
文件中。
# AWS 認證資訊
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE #這是範例
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY #這是範例
AWS_DEFAULT_REGION=us-west-2
# Tavily 認證資訊
TAVILY_API_KEY=tvly-oWHrOGmzokwl123drrXNlFBHL2EXAMPLE #這是範例
touch 2_tool.py
# 導入所需的庫
import os
from dotenv import load_dotenv
from strands import Agent, tool
from tavily import TavilyClient
# 從 .env 文件中讀取環境變數
load_dotenv()
# 定義網頁搜索函數作為工具
@tool
def search(query):
tavily = TavilyClient(api_key=os.getenv("TAVILY_API_KEY"))
return tavily.search(query)
# 創建設置了工具的代理人
agent = Agent(tools=[search])
# 啟動代理人
agent("東京AI祭って何?")
pip install tavily-python
python 2_tool.py
它會使用搜索工具來回答。
我將調查關於東京 AI 祭的信息。
Tool #1: search
東京 AI 祭是**日本最大規模的 AI 技術會議**,主要特點如下:
## 基本信息
- **舉辦日期**: 2025年10月4日(星期六)至10月5日(星期日)
- **會場**: Abema Towers(東京都渋谷區)
- **主辦方**: 東京 AI 祭執行委員會
- **參加費用**: 免費
## 概念
這是一個匯集國內外 AI 企業和專家的活動,創造最新的認知和人脈交流的場合。對於所有從事人工智慧工作的工程師、創作者、學生及業務發言人來說,這是吸收最新趨勢和拓展創新的一個重要的兩天。
## 主要內容
1. **駭客馬拉松** - 日本最大規模的 AI 駭客馬拉松(Weights & Biases 全力支持)
2. **生成 AI 競賽** - 日本最大規模的生成 AI 作品競賽
3. **演講會** - 由國內外的 AI 公司和專家發表演講
4. **展位展示** - 約20家國內外 AI 企業的展覽
5. **前期活動** - 每月多次的相關活動
## 成就
去年總參加人數和當日的參加人數均取得了良好的成果,並被認知為 AI 業界的重要活動。
以「創造・競爭・學習」為主題,對於想知道 AI 領域最新動向或擴展業界人脈的參加者來說,這是一個珍貴的機會。
如果 AI 代理人的回答中途停止,可能是因為 Bedrock 的 Claude 模型調用次數達到上限,Strands 在背後一直在嘗試重試。
這時候可以考慮切換到其他模型。
(備選模型 ID)
讓我們使用可以查詢 AWS 文檔的「AWS Knowledge MCP 伺服器」。
touch 3_mcp.py
# 導入所需庫
from dotenv import load_dotenv
from strands import Agent
from strands.tools.mcp import MCPClient
from mcp.client.streamable_http import streamablehttp_client
# 從 .env 文件中讀取環境變數
load_dotenv()
# 創建 MCP 客戶端
mcp = MCPClient(
lambda: streamablehttp_client("https://knowledge-mcp.global.api.aws")
)
# 在啟動 MCP 客戶端的同時創建和呼叫代理人
with mcp:
agent = Agent(
model="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
tools=mcp.list_tools_sync()
)
agent("Bedrock Agentcore 的執行環境有什麼功能?一句話解釋。")
由於搜索 AWS 文檔會增加推論次數,因此我們選擇使用 Bedrock 的初始配額相對寬鬆的 Sonnet 3.7。
pip install uv strands-agents-tools
python 3_mcp.py
將輸出類似以下的響應。
我想要調查有關 AWS Bedrock AgentCore 的運行時資訊。
Tool #1: aws___search_documentation
關於 AWS Bedrock AgentCore 運行時的信息已經找到了,我將閱讀主要頁面以獲取詳情。
Tool #2: aws___read_documentation
簡而言之,AWS Bedrock AgentCore 運行時是一個安全且可擴展的特定於任務的執行環境,用於運行任何框架或模型的 AI 代理人。
主要特點如下:
- 設計不依賴於框架(支持 LangGraph、Strands、CrewAI 等)
- 支持最長 8 小時的長時間運行
- 通過會話隔離來確保安全性
- 100MB 大型負載處理能力
- 基於使用量的計費體系
- 內建認證功能
- 針對代理人的特定可觀察性
使用「代理人作為工具」模式,監督者像調用工具一樣調用子代理人(這是最為典型且易於實現的模式)。
touch 4_multi_agent.py
# 導入所需的庫
from dotenv import load_dotenv
from strands import Agent, tool
from strands_tools import calculator
# 從 .env 文件中讀取環境變數
load_dotenv()
# 定義子代理人 1
@tool
def math_agent(query: str):
agent = Agent(
model="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
system_prompt="請使用工具進行計算",
tools=[calculator]
)
return str(agent(query))
# 定義子代理人 2
@tool
def haiku_agent(query: str):
agent = Agent(
model="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
system_prompt="根據給定的題材作五七五的俳句"
)
return str(agent(query))
# 創建和執行監督者代理人
orchestrator = Agent(
model="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
system_prompt="請計算給定問題並作為俳句詠出答案",
tools=[math_agent, haiku_agent]
)
orchestrator("太郎擁有十元,然後得到了二十元。現在他有多少錢?")
pip install strands-agents-tools
python 4_multi_agent.py
多代理人將共同合作地給予回答。
我將先用數學解此問題,然後以俳句給出結果。
讓我們先計算一下:
Tool #1: math_agent
我們來計算一下太郎現在的所持金額。
太郎最初持有 10 元,再加上 20 元,他將獲得的金額為:
Tool #1: calculator
太郎現在持有 30 元。接下來,讓我們把這個答案(30 元)寫成俳句:
Tool #2: haiku_agent
## 太郎的三十元
三十元
夢揚起
駄菓子店
問題的答案是 30 元,並已經以俳句形式寫出:
三十元
夢揚起
駄菓子店
在之前的步驟中,當我們希望部署所創建的代理人時,總是面臨一些困擾,例如基礎設施要選擇 Lambda 還是 ECS、認證和流媒體怎麼處理、監控等等,但 AgentCore 可以徹底解決這些問題,是我們的救世主!
它提供了便捷的 SDK 和 CLI 工具。
cd /workspaces/tokyo-ai2025
mkdir 2_agentcore
cd 2_agentcore
本次實作將全部在俄勒岡地區進行。
請首先在畫面右上方切換到該地區。
使用 AgentCore 的 SDK 封裝用 Strands 編寫的代理人並設置成 API 伺服器。
創建 AgentCore 構建用的目錄並新建文件
mkdir backend
cd backend
touch tavily_agent.py
# 導入所需的庫
from strands import Agent
from strands.tools.mcp.mcp_client import MCPClient
from mcp.client.streamable_http import streamablehttp_client
from bedrock_agentcore.runtime import BedrockAgentCoreApp
# 創建 AgentCore 運行時用的 API 伺服器
app = BedrockAgentCoreApp()
# 將代理人調用函數設置為 API 伺服器的入口點
@app.entrypoint
async def invoke_agent(payload, context):
# 獲取前端輸入的提示和 API 金鑰
prompt = payload.get("prompt")
tavily_api_key = payload.get("tavily_api_key")
### 這邊是正常的 Strands 代碼 ----------------------------------
# 設置 Tavily MCP 伺服器
mcp = MCPClient(lambda: streamablehttp_client(
f"https://mcp.tavily.com/mcp/?tavilyApiKey={tavily_api_key}"
))
# 在啟動 MCP 客戶端的同時呼叫代理人
with mcp:
agent = Agent(
model="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
tools=mcp.list_tools_sync()
)
# 以流式方式獲取代理人的回應
stream = agent.stream_async(prompt)
async for event in stream:
yield event
### ------------------------------------------------------------
# 啟動 API 伺服器
app.run()
使用「啟動工具包」輕鬆將 AI 代理人部署到 AgentCore 運行時中。
touch requirements.txt
strands-agents
bedrock-agentcore
# 將 .env 的內容設置為終端環境變數
export $(cat /workspaces/tokyo-ai2025/.env | grep -v ^# | xargs)
# 安裝 AgentCore 的啟動工具包
pip install bedrock-agentcore-starter-toolkit
# 準備部署
agentcore configure --entrypoint tavily_agent.py
向導中全部按 Enter
確認即可
🔐 執行角色
按 Enter 自動創建執行角色,或提供已有角色 ARN/名稱以使用現有角色
執行角色 ARN/名稱(或按 Enter 自動創建):
✓ 將自動創建執行角色
🏗️ ECR 倉庫
按 Enter 自動創建 ECR 倉庫,或提供已有 ECR 倉庫 URI 以使用現有的
ECR 倉庫 URI(或按 Enter 自動創建):
✓ 將自動創建 ECR 倉庫
🔍 檢測到依賴文件: requirements.txt
按 Enter 使用此文件,或輸入其他路徑(使用 Tab 自動完成):
路徑或按 Enter 使用檢測的依賴文件:
✓ 使用檢測到的文件: requirements.txt
🔐 認證配置
默認情況下,Bedrock AgentCore 使用 IAM 認證。
是否改為配置 OAuth 證書?(yes/no)[no]:
✓ 使用默認的 IAM 認證
🔒 請求標頭白名單
配置哪些請求標頭允許通過代理人。
常見標頭: Authorization, X-Amzn-Bedrock-AgentCore-Runtime-Custom-*
是否配置請求標頭白名單?(yes/no)[no]:
✓ 使用默認的請求標頭配置
正在配置 BedrockAgentCore 代理: tavily_agent
🧠 記憶配置
✓ 默認啟用短期記憶
• 在會話內存儲對話
• 提供即時上下文回憶
可選:長期記憶
• 提取用戶偏好設定
• 記住事實和模式
• 創建會話摘要
• 注意:處理時間為60-90秒
是否啟用長期記憶提取?(yes/no)[no]:
✓ 僅使用短期記憶
# 部署
agentcore launch
等待約一分鐘,您的 AI 代理人將部署到 AgentCore 運行時上。
由於自動創建 IAM 角色和 ECR 倉庫等,使得整個過程非常便利!
僅憑這一點,您便能在無伺服器架構上托管 AI 代理人。
部署完成後,請記得將顯示的 Agent ARN
複製到備忘錄等地方。
在本地使用 Python 库「Streamlit」創建前端界面,並嘗試呼叫 AgentCore 上的 Strands Agents。
cd /workspaces/tokyo-ai2025/2_agentcore
touch frontend.py
# 導入所需的庫
import os, boto3, json
import streamlit as st
from dotenv import load_dotenv
# 從 .env 文件中載入環境變數
load_dotenv(override=True)
# 在側邊欄中輸入設置
with st.sidebar:
agent_runtime_arn = st.text_input("AgentCore 運行時的 ARN")
tavily_api_key = st.text_input("Tavily API 金鑰", type="password")
# 畫出標題
st.title("全能搜索代理人")
st.write("Strands Agents 將使用 MCP 伺服器收集信息!")
# 畫出聊天框
if prompt := st.chat_input("請輸入訊息"):
# 顯示用戶的提示
with st.chat_message("user"):
st.markdown(prompt)
# 顯示代理人的回答
with st.chat_message("assistant"):
# 調用 AgentCore 運行時
agentcore = boto3.client('bedrock-agentcore')
payload = json.dumps({
"prompt": prompt,
"tavily_api_key": tavily_api_key
})
response = agentcore.invoke_agent_runtime(
agentRuntimeArn=agent_runtime_arn,
payload=payload.encode()
)
# 處理流式響應
container = st.container()
text_holder = container.empty()
buffer = ""
# 檢查響應逐行
for line in response["response"].iter_lines():
if line and line.decode("utf-8").startswith("data: "):
data = line.decode("utf-8")[6:]
# 若是字串內容則忽略
if data.startswith('"') or data.startswith("'"):
continue
# 將讀取的行轉換為 JSON
event = json.loads(data)
# 檢測是否使用工具
if "event" in event and "contentBlockStart" in event["event"]:
if "toolUse" in event["event"]["contentBlockStart"].get("start", {}):
# 確定當前文本
if buffer:
text_holder.markdown(buffer)
buffer = ""
# 顯示工具狀態
container.info("🔍 正在使用 Tavily 搜索工具")
text_holder = container.empty()
# 檢測文本內容
if "data" in event and isinstance(event["data"], str):
buffer += event["data"]
text_holder.markdown(buffer)
elif "event" in event and "contentBlockDelta" in event["event"]:
buffer += event["event"]["contentBlockDelta"]["delta"].get("text", "")
text_holder.markdown(buffer)
# 顯示最後剩下的文本
text_holder.markdown(buffer)
pip install streamlit
streamlit run frontend.py
點擊右下方出現的快顯「在瀏覽器中打開」按鈕
如果關閉了,則可以點擊終端中的 http://localhost:8501
來打開。
在側邊欄中輸入之前記錄的 ARN 及 Tavily 的 API 金鑰(可從 .env
中複製),然後嘗試詢問。
自動附帶簡易的 Langfuse 類功能(類似 LLM 版的 Datadog),非常方便。
透過 AgentCore 可觀察性檢查追蹤
tavily_agent
檢查 CloudWatch 日誌
如果啟動不順利,甚至無法查看追蹤,請檢查伺服器日誌。
/aws/bedrock-agentcore/runtimes/tavily_agent-<隨機字串>-DEFAULT
這次前端是在本地電腦上運行的,但使用 Streamlit Community Cloud 可以免費托管並公開給其他人。如果有時間的朋友可以試試。
請注意,公開的應用程序將允許任何知道網址的人訪問,因此可能會導致你的 AWS 費用增加。需注意成本與安全。
在參加後,務必回答問卷!
建議使用 AWS 帳戶進行一次性運用。
在實作結束後,可以解約不需要的 AWS 帳戶。
(解約後會無法再次使用同一電子郵件地址,因此使用非一次性電子郵件地址的朋友,請在解約前變更郵件地址。)
資料來源如下:
近日出版了一本可以輕鬆學習如同本文般的 AI 代理人構建的圖解全彩入門書!
除了 Strands,還學習到經典框架如 LangGraph 和可以使用 TypeScript 編寫代理人的 Mastra 等!
書中也介紹了使用 Next.js 開發前端的方式,及使用 Amplify Gen2 部署到 AWS 的方法。同時還有用 Langfuse 和 Ragas 實現 LLMOps 的講解。
原文出處:https://qiita.com/minorun365/items/deb10c8e7a6b1219e595