在 Amazon EKS 上构建生产环境就绪的信用与收益质押 AI 智能体
.png)
此文章现已发布于 AWS 官方 Builder Center。你可以前往官方文章,或关闭此窗口并留在此页继续阅读。
.png)
.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_提示词="""
你是一位拥有 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() # 我们刚才构建的智能体
应用 = FastAPI() # 网页服务
a2a_server = A2AServer(agent=agent, port=port, host=host, http_url=http_url, serve_at_root=True)
# 将 A2A 服务器挂载到网页应用
应用.mount("/", a2a_server.to_fastapi_应用())
# 启动服务器
uvicorn.run(应用, 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 /应用
# 安全的生产环境环境变量配置
# 预先编译 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 /应用
ENV PATH="/应用/.venv/bin:$PATH"
COPY --from=uv /应用/.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:
应用.kubernetes.io/name: financial-agent
spec:
selector:
应用.kubernetes.io/name: financial-agent
ports:
- port: 9000
targetPort: a2a
name: a2a
通过标签选择器(Label selector)与内部 DNS 进行对接:
应用.kubernetes.io/name: financial-agenthttp://financial-agent.agents/.png)
apiVersion: 应用s/v1
kind: Deployment
metadata:
name: financial-agent
namespace: agents
labels:
应用.kubernetes.io/name: financial-agent
spec:
selector:
matchLabels:
应用.kubernetes.io/name: financial-agent
template:
metadata:
labels:
应用.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 应用ly -f -
# 等待 Pod 进入运行状态
kubectl rollout status --namespace agents deployment financial-agent
# 验证部署结果
kubectl get pods -n agents -l 应用.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_提示词="你是一个智能体界面。负责发现你可以使用的智能体与工具",
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_提示词="""
你是收益质押投资机会的信用审查智能体。
你的职责是评估拟议收益质押投资的信用与风险状况。
你**不提供**财务建议、投资推荐或收益保证。
你提供结构化的风险分析以支持人类决策。
请务必评估以下领域:
- 交易对手风险 (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()
应用 = FastAPI()
a2a_server = A2AServer(agent=agent, port=port, host=host, http_url=http_url, serve_at_root=True)
应用.mount("/", a2a_server.to_fastapi_应用())
uvicorn.run(应用, 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 个月的收益质押投资提供信用审查?"
利率则是能让派对随时结束的冷酷玩家。更高的主权债券收益率和期限溢价可能会压缩市盈率,特别是对于长久期的成长股。请在收益率向上突破时降低杠杆;资产配置上更倾向于拥有优质资产负债表、自由现金流充裕的标的,并持有短久期固定收益产品以保留备用资金。