🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

這篇文章是人工撰寫的。

這是一份為活動準備的操作手冊,閱讀本文後,任何人都可以在大約一小時內進行嘗試!

使用 Claude Code 等 AI 代理人「的人」數量顯著增加。

如今,使用 AI 已經是每個人的常態。
我們更應該邁出一步,學習「製作」AI 代理人,這樣會更加有趣🙌

事前準備

創建 AWS 帳戶
建議新建帳戶。如果使用現有帳戶,請自行負責。

※最近出現了功能受限的完全免費方案,但請選擇「付費(Paid)」的選項。

此次的收費預計在幾十日圓的範圍內。(無法百分之百保證,請自行負責)

創建 GitHub 帳戶
如果已經擁有帳戶,請使用現有帳戶。

前言

構建 AI 代理人時,使用雲端服務會非常方便。

スクリーンショット 2025-10-04 18.47.25.png

使用 Strands,我們可以輕鬆地用 Python 編寫 AI 代理人。

スクリーンショット 2025-10-04 18.27.44.png

開發的 AI 代理人可以使用 AgentCore 以無伺服器的方式廉價部署。

スクリーンショット 2025-10-04 18.29.20.png

0. 環境構建

0-1. 開發環境的設置

創建 GitHub 倉庫

  • 登入後,在首頁左上角點擊「New」來創建新倉庫
    • 倉庫名稱: tokyo-ai2025
    • 選擇可見性: 私有
    • 添加 README: 開啟

啟動 GitHub Codespaces

  • 創建倉庫後,點擊畫面右上角的綠色按鈕「Code > Create codespace on main」

創建所需的文件

  • 在碼流窗口底部的終端運行以下命令
touch .env
  • 在創建的文件中填寫以下內容
# AWS 認證資訊
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-west-2

在碼流中,輸入後會自動保存文件。
第一行和第二行的值將在接下來的步驟中填入。

0-2. 設置 AWS 帳戶

創建 IAM 用戶

本次實作將全部在美國(俄勒岡)地區進行。
請先在畫面右上方切換到該地區。

  • 搜索「IAM」並訪問
  • 從側邊欄的「用戶」創建新用戶
    • 步驟 1
    • 用戶名稱: codespaces
    • 步驟 2
    • 許可選項: 直接附加策略
    • 許可策略: 勾選 AdministratorAccess
    • 之後保持不變繼續

創建 IAM 訪問密鑰

  • 創建 IAM 用戶後,點擊剛才創建的用戶名稱以開啟
  • 在概覽部分,點擊「創建訪問密鑰」
    • 步驟 1
    • 使用案例: 本地代碼
    • 勾選「我理解以上建議並創建訪問密鑰。」
    • 之後保持不變繼續
  • 創建後,將在碼流的 .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 起,該步驟可能會有部分不必要的情況。

  • 在 AWS 管理控制台中搜索「Amazon Bedrock」並訪問
  • 從側邊欄「模型訪問」選擇「更改模型訪問」
    • 步驟 1:勾選以下模型
    • Claude Sonnet 4
    • Claude 3.7 Sonnet
    • 步驟 2:為 Anthropic 添加使用案例細節
    • 目標用戶是誰?: 內部員工
    • 請輸入使用案例的詳細信息: hands-on
    • 之後保持不變繼續

1. Strands Agents 入門

  • 在碼流中使用畫面底部的終端
  • 運行以下命令創建新目錄並移動到該目錄
mkdir 1_strands
cd 1_strands

1-1. 三行代理人

  • 創建新文件
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 的模型!

1-2. 增加工具功能

我們可以為其添加網頁搜索功能,讓其能夠回答最新資訊。

首先,請註冊網頁搜索服務 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)

  • us.anthropic.claude-3-7-sonnet-20250219-v1:0
  • us.amazon.nova-premier-v1:0 ※需要啟用模型訪問

1-3. 從其他人創建的 MCP 伺服器借用工具

讓我們使用可以查詢 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 大型負載處理能力
- 基於使用量的計費體系
- 內建認證功能
- 針對代理人的特定可觀察性

1-4. 嘗試使用多代理人

使用「代理人作為工具」模式,監督者像調用工具一樣調用子代理人(這是最為典型且易於實現的模式)。

  • 創建新文件
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 元,並已經以俳句形式寫出:
三十元
夢揚起
駄菓子店

2. AgentCore 入門

在之前的步驟中,當我們希望部署所創建的代理人時,總是面臨一些困擾,例如基礎設施要選擇 Lambda 還是 ECS、認證和流媒體怎麼處理、監控等等,但 AgentCore 可以徹底解決這些問題,是我們的救世主!

它提供了便捷的 SDK 和 CLI 工具。

  • 創建新目錄並移動到該目錄
cd /workspaces/tokyo-ai2025
mkdir 2_agentcore
cd 2_agentcore

2-1. 啟用追蹤功能

本次實作將全部在俄勒岡地區進行。
請首先在畫面右上方切換到該地區。

  • 在 AWS 管理控制台中搜索「CloudWatch」並訪問
  • 從側邊欄的「交易搜尋」中點擊「Enable Transaction Search」
  • 勾選「Check this option to ingest spans as structured logs」,然後點擊「Save」

2-2. 使用 AgentCore SDK 進行代碼封裝

使用 AgentCore 的 SDK 封裝用 Strands 編寫的代理人並設置成 API 伺服器。

スクリーンショット 2025-10-04 20.27.18.png

創建 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()

2-3. 部署到 AgentCore 運行時

使用「啟動工具包」輕鬆將 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 複製到備忘錄等地方。

2-4. 驗證運作

在本地使用 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 中複製),然後嘗試詢問。

2-5. 運行監控

自動附帶簡易的 Langfuse 類功能(類似 LLM 版的 Datadog),非常方便。

透過 AgentCore 可觀察性檢查追蹤

  • 在控制台中搜索「Bedrock AgentCore」,從側邊欄的「代理人運行時」中點擊 tavily_agent
  • 展開上方的「代理人詳細信息」,然後點擊「顯示可觀察性」
  • 從「Traces view」標籤中點擊追蹤 ID,可以檢查代理人的運作記錄

檢查 CloudWatch 日誌
如果啟動不順利,甚至無法查看追蹤,請檢查伺服器日誌。

  • 在管理控制台中搜索「CloudWatch」並訪問
  • 從側邊欄的「日誌群組」中點擊 /aws/bedrock-agentcore/runtimes/tavily_agent-<隨機字串>-DEFAULT
  • 從「搜索所有日誌串流」中,可以檢查最近的伺服器日誌

下一步:前端的部署

這次前端是在本地電腦上運行的,但使用 Streamlit Community Cloud 可以免費托管並公開給其他人。如果有時間的朋友可以試試。

請注意,公開的應用程序將允許任何知道網址的人訪問,因此可能會導致你的 AWS 費用增加。需注意成本與安全。

整理

在參加後,務必回答問卷!

建議使用 AWS 帳戶進行一次性運用。
在實作結束後,可以解約不需要的 AWS 帳戶。
(解約後會無法再次使用同一電子郵件地址,因此使用非一次性電子郵件地址的朋友,請在解約前變更郵件地址。)

資料來源如下:

  • 依據實際使用計費的項目
    • AgentCore 運行時
  • 幾乎不計費的項目
    • IAM 用戶
    • IAM 角色
    • ECR 倉庫
    • CodeBuild 專案

附錄

近日出版了一本可以輕鬆學習如同本文般的 AI 代理人構建的圖解全彩入門書!

除了 Strands,還學習到經典框架如 LangGraph 和可以使用 TypeScript 編寫代理人的 Mastra 等!

書中也介紹了使用 Next.js 開發前端的方式,及使用 Amplify Gen2 部署到 AWS 的方法。同時還有用 Langfuse 和 Ragas 實現 LLMOps 的講解。


原文出處:https://qiita.com/minorun365/items/deb10c8e7a6b1219e595


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝19   💬9   ❤️5
728
🥈
我愛JS
📝4   💬14   ❤️7
250
🥉
御魂
💬1  
3
#5
2
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付