在 Amazon EKS 上建構生產環境就緒的信用與收益質押 AI 智能體
EKS 自動模式(Auto Mode)與 Karpenter 能為生產環境 AI 智能體提供彈性運算。配合 MCP、Strands SDK 與 A2A 協定,可建立可擴展、可協作、可部署的金融多智能體系統。
此文章現在已發布於 AWS 官方 Builder Center。你可以前往官方文章,或關閉此視窗並留在此頁繼續閱讀。
EKS 自動模式(Auto Mode)與 Karpenter 能為生產環境 AI 智能體提供彈性運算。配合 MCP、Strands SDK 與 A2A 協定,可建立可擴展、可協作、可部署的金融多智能體系統。
.png)
EKS 自動模式(Auto Mode)與 Karpenter 能為生產環境的 AI 智能體提供彈性運算資源,而模型上下文協定(MCP)則實現了動態工具發現與外部數據存取。Strands SDK 負責協調 A2A(智能體對智能體)智能體、智能體集群(swarms)、工作流(workflows)以及基於圖(graph-based)的委派機制。信用與金融智能體以容器化 Kubernetes 服務的形式運行,使用 ECR 映像檔、智能體卡片(agent-card)發現機制、HTTP/JSON 端點,並具備涵蓋收益質押、總體經濟波動、利率、流動性、回撤(drawdowns)、避險(hedging)和執行紀律的多智能體風險分析能力。
重要聲明:本內容僅供工程教學工作坊使用。信用與收益質押領域僅用於教學智能體工具架構與生產部署模式。此內容不構成任何財務或投資建議。
市場目前的狂熱依舊由 AI 主導,但嫉妒的債券殖利率正緊盯著這一切。全球股市受到科技/半導體財報與 AI 資本支出(capex)的推動而走高,然而債券波動性與過高的估值仍是主要的潛在風險。
原油是誘人的總體經濟觸發點:每一次飆升都伴隨著通膨的耳語。中東局勢動盪推高了能源風險溢價,迫使市場重新評估通膨壓力、中央銀行的耐心以及經濟增長風險。
利率則是隨時能讓派對結束的冷酷玩家。更高的主權債券殖利率和期限溢價(term premiums)可能會壓縮本益比(P/E multiples),特別是對於長天期的成長股。
.png)
開發者將在 Amazon EKS 上建構生產環境就緒的信用與收益質押 AI 智能體。本工作坊將從 EKS 自動模式(Auto Mode)與節點池(NodePools)開始,接著加入 MCP 工具存取、Strands 智能體、A2A 伺服器對外曝光、Docker 打包、ECR 映像檔發佈、Kubernetes 部署,最後建立一個多智能體信用審查系統。
.png)
交易員 (Trader)
└─ 詢問信用與收益質押的洞察問題
AWS 區域 (AWS Region)
├─ VPC
│ └─ 啟用自動模式與 Karpenter 的 Amazon EKS
│ ├─ agents 命名空間 (namespace)
│ │ ├─ financial-agent 服務 (Service)
│ │ ├─ financial-agent 部署 (Deployment)
│ │ ├─ 信用多智能體伺服器 (Credit multi-agent server)
│ │ └─ Strands 信用智能體 (Strands Credit Agent)
│ ├─ mcp-servers 命名空間
│ │ └─ 金融 MCP 伺服器 (financial MCP server)
│ ├─ MCP 用戶端 (MCP Client)
│ ├─ 智能體對智能體 (A2A) 伺服器
│ └─ Strands 金融智能體 (Strands financial agent)
├─ Amazon Elastic Container Registry (ECR)
│ └─ 智能體與 MCP 伺服器映像檔
└─ Amazon Bedrock
└─ AI/LLM 功能
AWS 區域外部 (External)
└─ 供 MCP 用戶端存取金融策略的外部 MCP 伺服器
介紹如何在 Amazon EKS 上建立生產環境就緒的 AI 智能體,涵蓋工作坊資源、預先佈署的 EKS 自動模式、Karpenter 驅動的資源配置、節點池(NodePools)、可擴展運算、ECR、Bedrock、VPC、命名空間,以及用於外部工具存取的 MCP。
深入解析 MCP、A2A 協定與 Strands SDK,包括遠端工具發現、智能體互通性、智能體即工具(agents-as-tools)、智能體集群(swarms)、圖(graphs)、工作流(workflows)、裝飾器(decorators)、由 Bedrock 支援的智能體、current_time 工具,以及市場趨勢執行的實際範例。
涵蓋如何透過 A2A 伺服器公開智能體、FastAPI 掛載、HTTP/JSON 功能發現、agent-card.json 端點、本地測試、Docker 容器化、uv 相依性快取、生產環境映像檔、ECR 推送指令以及利率驅動的輸出。
詳細說明金融智能體的 Kubernetes 部署流程,包括 Service 和 Deployment YAML、標籤(labels)、選擇器(selectors)、連接埠(ports)、環境變數、存活探針(liveness probes)、命名空間建立、滾動更新檢查、Pod 驗證、內部 DNS、curl 測試以及智能體卡片(agent-card)發現。
描述多智能體系統協同運作,信用與金融智能體如何透過 A2A 工具提供者進行協作、動態發現、任務委派、整合多方來源、風險審查、交易對手分析、流動性檢查、合規性考量以及多智能體伺服器測試。
.png)
建立一個預先佈署且啟用了自動模式(Auto Mode)的 EKS 集群。
EKS 自動模式利用 Karpenter 來實現:
節點池定義了:
當 Pod 需要被排程時,Karpenter 會選擇最合適的節點池設定來配置節點。這能將基本的對話式 AI 轉化為具備彈性擴展、工具賦能的智慧智能體。
模型上下文協定(MCP)賦予了智能體存取外部服務的能力。
.png)
智能體對智能體(Agent-to-Agent, A2A)協定允許有多個應用程式與同一個智能體進行互動。
模型上下文協定(Model Context Protocol, MCP)使 AI 智能體能夠安全地存取外部工具與服務。
MCP 用戶端利用遠端 MCP 伺服器的 URL 來動態發現並使用工具。
def get_mcp_tools():
mcp_url = os.getenv("FINANCIAL_MCP_URL", "http://localhost:8080/mcp")
mcp_client = MCPClient(lambda: streamablehttp_client(mcp_url))
mcp_client.start()
return mcp_client.list_tools_sync()
Strands 是一個開源 SDK,透過模型驅動的編排(model-driven orchestration)簡化自主 AI 智能體的建構。它減少了複雜的編碼工作、處理多智能體工作流,並自動化雲端資源管理等任務。
只需加上簡單的 @tool 裝飾器(decorator),就能將 Python 函數轉換為智能體工具。
@tool(name="get_todays_date", description="擷取今天的日期以確保準確性")
def get_todays_date() -> str:
return datetime.today().strftime('%Y-%m-%d')
智能體具備採取行動的能力。
def financial_agent():
agent = Agent(
description="協助處理固定收益指數的實用智能體",
model=BEDROCK_MODEL_ID,
system_prompt="""
你是一位擁有 40 年經驗的專業交易員。
請解讀最近 3 個月的美國金融市場趨勢。
並給出風險中立的市場觀察與情境提醒。
""",
tools=[get_mcp_tools(), current_time] # 整合 Strands 社群的 current_time 工具功能
)
return agent
def main():
agent = financial_agent()
agent("根據最近 3 個月的金融市場趨勢給出市場觀察與風險提醒")
在 Bash 終端機中執行智能體:
uv run --project ~/environment/agents/a2a/agent agent
echo -e "\n\n***** 智能體回應結束 *****"
Tool #1: current_time
Tool #2: get_forecast
市場目前的狂熱依舊由 AI 主導,但外頭嫉妒的債券殖利率正緊盯著這一切。全球股市受到科技/半導體財報與 AI 資本支出的推動而走高,然而債券波動性與過高的估值仍是主要的潛在風險。請僅在關鍵移動平均線上方順勢操作;嚴格執行停損、做好部位控制,並避免盲目追高跳空缺口。
.png)
A2A 伺服器可以讓其他應用程式與服務進行存取。利用 Strands SDK 將您的智能體公開為網路服務。
def run_a2a_server():
host = os.getenv("A2A_HOST", "0.0.0.0")
port = int(os.getenv("A2A_PORT", "9000"))
http_url = os.getenv("A2A_URL", os.getenv("AGENTCORE_RUNTIME_URL", f"http://localhost:{port}"))
agent = financial_agent() # 我們剛才建立的智能體
app = FastAPI() # 網頁服務
a2a_server = A2AServer(agent=agent, port=port, host=host, http_url=http_url, serve_at_root=True)
# 將 A2A 伺服器掛載到網頁應用程式
app.mount("/", a2a_server.to_fastapi_app())
# 啟動伺服器
uvicorn.run(app, host=host, port=port)
run_in_background 9000 uv run --project ~/environment/agents/a2a/agent agent-a2a-server
a2a_client_local http://localhost:9000 "能否提供收益質押的風險觀察與監控重點?"
原油是誘人的總體經濟觸發點:每一次飆升都伴隨著通膨的耳語。中東局勢動盪推高了能源風險溢價,迫使市場重新評估通膨壓力、中央銀行的耐心以及經濟增長風險。請密切監控布蘭特原油(Brent)、損益平衡通膨率和 10 年期國債殖利率;當原油波動加劇時,利用能源部位進行避險,或為股票多頭部位設定更緊密的移動停損。
客戶端會自動發現 agent-card.json 端點。
0.0.0.0:9000 以便在 Kubernetes 中部署。將 A2A 伺服器打包成 Docker 容器。Amazon EKS 提供完善的彈性調整、監控與服務發現。
ARG RUNTAG=latest
FROM cgr.dev/chainguard/python:latest-dev AS uv
WORKDIR /app
# 安全的生產環境環境變數設定
# 預先編譯 Python 位元組碼,縮短啟動與匯入時間
ENV UV_COMPILE_BYTECODE=1
# 在 Docker 環境中通常使用 copy 較為安全
ENV UV_LINK_MODE=copy
# 強制使用系統內建的 Python 直譯器
ENV UV_PYTHON_PREFERENCE=only-system
# 不允許更新 lockfile
ENV UV_FROZEN=true
.png)
# 建立相依性快取層
COPY pyproject.toml uv.lock ./
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --no-install-project --no-dev --no-editable
# 建立程式碼快取層
COPY *.py .
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --no-dev --no-editable
--mount=type=cache:建立快取機制以加速建構。--no-dev --no-editable:僅安裝生產環境所需的相依項目。FROM cgr.dev/chainguard/python:${RUNTAG}
WORKDIR /app
ENV PATH="/app/.venv/bin:$PATH"
COPY --from=uv /app/.venv .venv
ENV PATH:允許直接執行 python 和 pip 等指令。--from=uv:從名為 uv 的 Docker 建構階段複製檔案。將編譯好的容器映像檔推送到 Amazon ECR:
docker build ~/environment/agents/a2a/agent/ -t ${ECR_REPO_FINANCIAL_AGENT_URI}:latest
docker push ${ECR_REPO_FINANCIAL_AGENT_URI}:latest
.png)
k8s.yamlapiVersion: v1
kind: Service
metadata:
name: financial-agent
namespace: agents
labels:
app.kubernetes.io/name: financial-agent
spec:
selector:
app.kubernetes.io/name: financial-agent
ports:
- port: 9000
targetPort: a2a
name: a2a
透過標籤選擇器(Label selector)與內部 DNS 進行對接:
app.kubernetes.io/name: financial-agenthttp://financial-agent.agents/.png)
apiVersion: apps/v1
kind: Deployment
metadata:
name: financial-agent
namespace: agents
labels:
app.kubernetes.io/name: financial-agent
spec:
selector:
matchLabels:
app.kubernetes.io/name: financial-agent
template:
metadata:
labels:
app.kubernetes.io/name: financial-agent
spec:
serviceAccountName: financial-agent
containers:
- name: financial-agent
image: ${ECR_REPO_FINANCIAL_AGENT_URI}:latest
ports:
- containerPort: 9000
name: a2a
env:
- name: FINANCIAL_MCP_URL
value: "http://financial-mcp.mcp-servers:8080/mcp"
- name: A2A_URL
value: "http://financial-agent.agents:9000"
command: ["agent-a2a-server"]
livenessProbe:
tcpSocket:
port: 9000
建立 Kubernetes 命名空間並部署:
# 建立命名空間
kubectl create namespace agents
# 替換環境變數並部署到 Kubernetes
envsubst < ~/environment/agents/a2a/agent/k8s.yaml | kubectl apply -f -
# 等待 Pod 進入運行狀態
kubectl rollout status --namespace agents deployment financial-agent
# 驗證部署結果
kubectl get pods -n agents -l app.kubernetes.io/name=financial-agent
kubectl run curl-test --image=curlimages/curl \
--rm -it --restart=Never -- \
curl -s -X GET http://financial-agent.agents:9000/.well-known/agent-card.json \
| sed 's/pod "curl-test" deleted//' | jq -r .
A2A 智能體卡片詳細描述了智能體的功能,讓其他用戶端能動態探索並了解該智能體可以執行的任務。
a2a_client_in_k8s http://financial-agent.agents:9000 "Provide risk monitoring insights"
.png)
.png)
多個智能體分工合作來解決複雜的問題。
當用戶提出請求時,信用智能體會分析該請求,並判定其需要更多即時的金融數據才能提供高品質的收益質押風險評估輸出。
def financial_agent_as_tool(request: str) -> str:
remote_agent_a2a_url = os.getenv("FINANCIAL_A2A_SERVER_URL", "http://localhost:9000")
a2a_tool_provider = A2AClientToolProvider(known_agent_urls=[remote_agent_a2a_url])
tools = a2a_tool_provider.tools
agent = Agent(
model=BEDROCK_MODEL_ID,
tools=tools,
system_prompt="你是一個智能體介面。負責發現你可以使用的智能體與工具",
callback_handler=None
)
try:
response = agent(request)
return str(response)
except Exception as e:
raise Exception(f"無法處理遠端 A2A 智能體請求: {str(e)}")
建立一個專門評估收益質押投資風險的信用智能體。利用 A2A 客戶端提供者工具來動態發現 A2A 智能體、委派任務並整合資訊。
def credit_agent() -> Agent:
agent = Agent(
model=BEDROCK_MODEL_ID,
description="""
信用審查智能體,負責從信用、交易對手、流動性、營運和風險控制的角度評估收益質押投資機會。
""",
system_prompt="""
你是收益質押投資機會的信用審查智能體。
你的職責是評估擬議收益質押投資的信用與風險狀況。
你**不提供**財務建議、投資推薦或收益保證。
你提供結構化的風險分析以支援人類決策。
請務必評估以下領域:
- 交易對手風險 (Counterparty risk)
- 協定或平台風險 (Protocol or platform risk)
- 資產質量與波動性風險
- 收益永續性 (Yield sustainability)
- 流動性與贖回風險
- 智慧合約與營運風險
- 託管與結算風險
- 法規與合規性考量
- 歷史表現(若有)
- 集中度與風險敞口限制
- 上行/下行情境與壓力測試風險
如果用戶提供資訊不足,請主動詢問:
- 質押平台或協定名稱
- 質押的資產
- 預期收益或 APY
- 鎖定期限 (Lock-up period)
- 投資金額
- 司法管轄區
- 交易對手或託管機構詳情
- 可用的文件、評級、審計或財務披露
請以清晰的信用審查格式輸出:
- 執行摘要 (Executive summary)
- 核心優勢
- 關鍵風險
- 必要盡職調查 (Required due diligence)
- 風險評級
- 信用隱憂
- 緩釋因素 (Mitigating factors)
- 最終審查結論
適時使用可用工具或智能體來收集支持資訊。清楚說明假設與限制。
切勿直接指示用戶投資或不投資。
""",
tools=[current_time, financial_agent_as_tool]
)
return agent
def run_a2a_server():
host = os.getenv("A2A_HOST", "0.0.0.0")
port = int(os.getenv("A2A_PORT", "9000"))
http_url = os.getenv("A2A_URL", os.getenv("CREDIT_AGENT_RUNTIME_URL", f"http://localhost:{port}"))
agent = credit_agent()
app = FastAPI()
a2a_server = A2AServer(agent=agent, port=port, host=host, http_url=http_url, serve_at_root=True)
app.mount("/", a2a_server.to_fastapi_app())
uvicorn.run(app, host=host, port=port)
run_in_background 9000 uv run --project ~/environment/agents/a2a/multi-agent multi-agent-a2a-server
a2a_client_local http://localhost:9000 "能否針對未來 3 個月的收益質押投資提供信用審查?"
利率則是能讓派對隨時結束的冷酷玩家。更高的主權債券殖利率和期限溢價可能會壓縮本益比,特別是對於長天期的成長股。請在殖利率向上突破時降低槓桿;資產配置上更傾向於擁有優質資產負債表、自由現金流充裕的標的,並持有短天期固定收益產品以保留閒置資金。