Agent架构
Agent 架构设计:从单轮到自主循环
·约 9 分钟阅读
AI Agent 不是简单的"多轮对话"。它是一个自主决策的循环系统——感知环境、选择行动、执行工具、观察结果、决定下一步。本文深入讲解 Agent 的核心架构,从最简单的 ReAct 模式到 Claude 的四层架构。
你将学到什么
- Agent 与 Chatbot 的本质区别
- ReAct(Reasoning + Acting)架构模式
- Claude Agent 的四层架构设计
- 从零实现一个自主决策的 Agent Loop
Agent 与 Chatbot 的区别
Chatbot 是被动的——用户发消息,AI 回复,一问一答。Agent 是主动的——它会自主决定"接下来该做什么",直到任务完成。
| 对比项 | Chatbot | Agent |
|---|---|---|
| 交互方式 | 一问一答 | 自主循环 |
| 工具使用 | 无或固定 | 动态选择 |
| 任务范围 | 单轮回答 | 多步骤复杂任务 |
| 终止条件 | 用户停止 | 任务完成 |
ReAct 架构模式
ReAct 是 Agent 最经典的设计模式。核心思想:先推理(Reason),再行动(Act)。
用户: "帮我查一下北京今天的天气,然后发给张三"
Agent 思考: 用户要查天气并发送,我需要:
1. 先调用天气 API 查北京天气
2. 再调用消息 API 发送给张三
Agent 行动 1: 调用 get_weather(city="北京")
观察结果: 晴,25°C,东风3级
Agent 思考: 已获取天气信息,现在发送给张三
Agent 行动 2: 调用 send_message(to="张三", content="北京今天晴,25°C")
观察结果: 发送成功
Agent 思考: 两步都完成了,任务结束
Agent 回复: "已查到北京今天晴,25°C,东风3级,已发送给张三。"
Claude Agent 四层架构
Claude 的 Agent 系统采用四层设计:
第一层:Agent Loop(决策循环) 核心循环——接收输入 → 推理 → 选择工具 → 执行 → 观察结果 → 继续或停止。
第二层:Runtime(运行时) 管理 Agent 的执行环境:对话历史、token 计数、上下文压缩、权限控制。
第三层:MCP(模型上下文协议) 标准化的工具接口层。Agent 通过 MCP 连接各种外部服务,无需为每个工具写专门的集成代码。
第四层:Skills(能力模块) 高级能力包——PDF 处理、代码执行、网页抓取等。每个 Skill 可以包含多个工具和专门的 prompt。
实现一个 Agent Loop
import anthropic
client = anthropic.Anthropic()
tools = [
{
"name": "search_web",
"description": "搜索互联网获取最新信息",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"}
},
"required": ["query"]
}
},
{
"name": "calculate",
"description": "执行数学计算",
"input_schema": {
"type": "object",
"properties": {
"expression": {"type": "string", "description": "数学表达式"}
},
"required": ["expression"]
}
}
]
def execute_tool(name, input_data):
"""模拟工具执行"""
if name == "search_web":
return f"搜索结果: 关于'{input_data['query']}'的信息..."
elif name == "calculate":
return str(eval(input_data["expression"]))
return "未知工具"
def agent_loop(user_message, max_iterations=10):
messages = [{"role": "user", "content": user_message}]
for i in range(max_iterations):
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
tools=tools,
messages=messages,
)
# 检查是否需要调用工具
if response.stop_reason == "tool_use":
# 收集所有工具调用
tool_results = []
for block in response.content:
if block.type == "tool_use":
result = execute_tool(block.name, block.input)
print(f" 工具调用: {block.name} → {result[:50]}")
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result
})
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": tool_results})
else:
# Agent 决定停止,返回最终回复
final_text = ""
for block in response.content:
if hasattr(block, "text"):
final_text += block.text
return final_text
return "达到最大迭代次数"
# 运行
result = agent_loop("搜索一下 Claude 4.6 的最新定价,然后帮我算一下处理 100 万个 token 的输入输出总费用")
print(result)
关键设计决策
何时停止循环?
- Claude 返回
stop_reason: "end_turn"时自然停止 - 设置最大迭代次数(防止无限循环)
- 检测重复行为(Agent 在做同样的事情)
错误处理策略:
- 工具失败时,将错误信息返回给 Agent,让它决定是否重试或换方案
- 设置超时机制
- 记录每一步的日志
实战练习
Tip: 动手构建你的第一个 Agent。
- 复制上面的 Agent Loop 代码,添加一个新工具(如
get_time) - 让 Agent 处理一个需要多步推理的任务
- 添加日志记录,观察 Agent 的决策过程
关键要点
Note: 本文核心总结
- Agent = 自主决策循环,不是简单的多轮对话
- ReAct 模式:先推理再行动,循环执行直到任务完成
- Claude 四层架构:Agent Loop → Runtime → MCP → Skills
stop_reason是判断 Agent 是否继续循环的关键
延伸阅读
- 下一篇:多工具编排——当 Agent 有很多工具时如何管理
- Anthropic 官方 Agent 设计指南