Agentic AI 实战指南 --- 从 ReAct 到多智能体协作的完整落地路径
从"只会聊天"到"能干活",Agentic AI 正在重新定义人与AI的协作方式。本文从核心概念到架构模式,从纯Python手写Agent到六大框架实战,带你走完从理解到落地的完整路径。
文章目录
- [Agentic AI 实战指南 --- 从 ReAct 到多智能体协作的完整落地路径](#Agentic AI 实战指南 — 从 ReAct 到多智能体协作的完整落地路径)
-
- [前言:从对话到行动------Agentic AI 的范式之变](#前言:从对话到行动——Agentic AI 的范式之变)
- [一、核心概念解析:什么是 Agentic AI](#一、核心概念解析:什么是 Agentic AI)
-
- [1.1 定义与核心理念](#1.1 定义与核心理念)
- [1.2 与传统对话式AI的本质区别](#1.2 与传统对话式AI的本质区别)
- [1.3 Agentic AI 的三大驱动力](#1.3 Agentic AI 的三大驱动力)
- [1.4 Agentic AI 演进全景图](#1.4 Agentic AI 演进全景图)
- 二、Agent架构模式详解
-
- [2.1 ReAct(推理+行动)------ Agent的基石](#2.1 ReAct(推理+行动)—— Agent的基石)
- [2.2 Plan-and-Execute(先想后做)](#2.2 Plan-and-Execute(先想后做))
- [2.3 Reflect(自我复盘)](#2.3 Reflect(自我复盘))
- [2.4 Tree of Thoughts(深思熟虑)](#2.4 Tree of Thoughts(深思熟虑))
- [2.5 Multi-Agent(多智能体协作)](#2.5 Multi-Agent(多智能体协作))
- [2.6 四种架构模式横向对比](#2.6 四种架构模式横向对比)
- [三、Agent 三层架构模型](#三、Agent 三层架构模型)
-
- [3.1 三层架构详解](#3.1 三层架构详解)
- [3.2 记忆系统------ Agent的脑](#3.2 记忆系统—— Agent的脑)
- [3.3 Agent三层架构与动态循环图](#3.3 Agent三层架构与动态循环图)
- [四、技术基础设施:MCP 与 A2A](#四、技术基础设施:MCP 与 A2A)
-
- [4.1 MCP 协议(Model Context Protocol)](#4.1 MCP 协议(Model Context Protocol))
- [4.2 A2A 协议(Agent-to-Agent)](#4.2 A2A 协议(Agent-to-Agent))
- [4.3 MCP + A2A 的生态效应](#4.3 MCP + A2A 的生态效应)
- [五、实战一:纯Python最小ReAct Agent](#五、实战一:纯Python最小ReAct Agent)
-
- [5.1 环境准备与安装](#5.1 环境准备与安装)
- [5.2 完整可运行代码](#5.2 完整可运行代码)
- [5.3 运行演示与预期输出](#5.3 运行演示与预期输出)
- [5.4 核心循环机制解析](#5.4 核心循环机制解析)
- 六、实战二:基于LangGraph的状态化工作流
-
- [6.1 LangGraph 安装与配置](#6.1 LangGraph 安装与配置)
- [6.2 核心概念速览](#6.2 核心概念速览)
- [6.3 完整代码示例------代码审查Agent工作流](#6.3 完整代码示例——代码审查Agent工作流)
- [6.4 检查点与人机协作机制](#6.4 检查点与人机协作机制)
- [6.5 LangGraph状态图示例](#6.5 LangGraph状态图示例)
- 七、实战三:基于CrewAI的多角色协作
-
- [7.1 CrewAI 安装与配置](#7.1 CrewAI 安装与配置)
- [7.2 核心概念速览](#7.2 核心概念速览)
- [7.3 完整代码示例------研究+写作团队](#7.3 完整代码示例——研究+写作团队)
- [7.4 执行流程解析](#7.4 执行流程解析)
- 八、实战四:混合架构生产Agent
-
- [8.1 混合模式设计策略](#8.1 混合模式设计策略)
- [8.2 完整Python代码](#8.2 完整Python代码)
- [8.3 代码详解](#8.3 代码详解)
- [8.4 混合架构Agent工作流图](#8.4 混合架构Agent工作流图)
- 九、六大框架横向对比与选型指南
-
- [9.1 框架核心特性对比表](#9.1 框架核心特性对比表)
- [9.2 性能基准数据对比](#9.2 性能基准数据对比)
- [9.3 学习曲线与开发效率对比](#9.3 学习曲线与开发效率对比)
- [9.4 MCP集成能力对比](#9.4 MCP集成能力对比)
- [9.5 选型决策指南](#9.5 选型决策指南)
- [9.6 选型决策树](#9.6 选型决策树)
- 十、踩坑记录与最佳实践
-
- [10.1 8大常见误区澄清](#10.1 8大常见误区澄清)
- [10.2 ReAct循环死循环防范](#10.2 ReAct循环死循环防范)
- [10.3 Prompt工程最佳实践](#10.3 Prompt工程最佳实践)
- [10.4 工具调用错误处理](#10.4 工具调用错误处理)
- [10.5 成本控制策略](#10.5 成本控制策略)
- [10.6 生产化部署建议](#10.6 生产化部署建议)
- 十一、总结与展望
前言:从对话到行动------Agentic AI 的范式之变
2026年,AI行业正在经历一场静默但深刻的范式转移。
过去两年,我们见证了 Chatbot 的爆发------ChatGPT、Claude、Gemini 让所有人体验到了"与AI对话"的魅力。但对话只是起点,不是终点。当用户问"帮我查一下北京明天的天气",传统Chatbot只能回答"你可以去气象网站查询",而 Agentic AI 会直接调用天气API,把结果整理好交给你。
这就是从"对话"到"行动"的质变。
整个演进路径清晰可见:
Chatbot(对话式AI) → Copilot(辅助式AI) → Agent(自主式AI) → Multi-Agent(协作式AI)
- Chatbot:你问,它答。交互结束于回答生成的那一刻。
- Copilot:你问,它答,还能帮你操作(如Copilot帮你写代码)。但它仍是"你指令,它执行"的模式。
- Agent:你给目标,它自主规划、调用工具、观察结果、迭代调整,直到目标完成。
- Multi-Agent:多个专职Agent协作,像团队一样分工完成复杂任务。
为什么2026是Agentic AI落地元年? 三大驱动力已经交汇:
- 用户需求升级:用户不需要更会聊天的AI,需要能干活的AI。"帮我做"比"帮我查"有价值10倍。
- 企业落地诉求:企业的核心诉求是自动化------让AI把流程跑通,而不是让AI写更多的邮件模板。
- 模型能力溢出:GPT-5、Gemini Ultra、Claude Opus 4的推理能力远超"对话"场景所需。这些模型能规划、能判断、能纠错,却被困在"一问一答"的交互模式里,是对算力的浪费。
本文的价值定位:不是泛泛而谈的科普,而是面向开发者的实战指南。从理解核心概念,到选择架构模式,到手写最小Agent,到用框架构建生产级工作流------帮你走完从"知道"到"做到"的完整路径。
一、核心概念解析:什么是 Agentic AI
1.1 定义与核心理念
一句话理解:Agentic AI 就是让大模型从"只会聊天"进化为"能干活"------不再只是回答问题,而是自主规划、调用工具、执行任务,直到目标完成。
更精确地说:
Agentic AI = LLM推理能力 + 自主决策循环 + 工具调用能力 + 记忆系统
这四个组件缺一不可。没有推理能力,Agent无法判断下一步该做什么;没有决策循环,Agent只是一次性输出;没有工具调用,Agent只能"纸上谈兵";没有记忆系统,Agent无法积累经验。
1.2 与传统对话式AI的本质区别
| 对比维度 | 传统对话式AI | Agentic AI |
|---|---|---|
| 交互模式 | 用户提问→模型生成回答→结束 | 用户提问→思考→行动→观察→思考→...→最终回答 |
| 信息来源 | 基于训练数据"猜测" | 通过工具调用"查询"后回答,从"我觉得"变成"我查了" |
| 能力边界 | 只能告诉你"你可以去搜索" | 能直接帮你完成任务 |
| 错误处理 | 出错了就出错了 | 能观察结果、自我反思、重新规划 |
| 本质差异 | 信口开河 | 有据可查的质变 |
这个区别看似简单,实则深刻。传统AI回答"北京天气怎么样"时,它是在训练数据里"猜"一个答案;Agentic AI 则是调用天气API拿到实时数据后回答。从"我觉得"到"我查了",这是可信度的质变。
1.3 Agentic AI 的三大驱动力
驱动力一:用户需求升级
用户对AI的期望已经从"知识问答"转向"任务执行"。你问"帮我写一封邮件",传统AI给你一个草稿;Agent型AI会了解你的收件人、沟通目的、语气偏好,直接写好并发送。"帮我做"比"帮我查"有价值10倍。
驱动力二:企业落地诉求
企业部署AI的核心诉求是自动化------让AI把流程跑通。客服Agent自动处理80%的常见问题,代码审查Agent自动检查PR质量,数据分析Agent自动生成日报。这些都是"做完任务"而非"回答问题"。
驱动力三:模型能力溢出
GPT-5、Claude Opus 4等顶级模型的推理能力,已经远超"对话"场景所需。它们能做规划、能做判断、能做纠错,却被困在"一问一答"的交互模式里。Agentic AI释放了这些模型的全部潜力。
1.4 Agentic AI 演进全景图
#mermaid-svg-Iu9UyG1BBPyq24W3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Iu9UyG1BBPyq24W3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Iu9UyG1BBPyq24W3 .error-icon{fill:#552222;}#mermaid-svg-Iu9UyG1BBPyq24W3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Iu9UyG1BBPyq24W3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Iu9UyG1BBPyq24W3 .marker.cross{stroke:#333333;}#mermaid-svg-Iu9UyG1BBPyq24W3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Iu9UyG1BBPyq24W3 p{margin:0;}#mermaid-svg-Iu9UyG1BBPyq24W3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Iu9UyG1BBPyq24W3 .cluster-label text{fill:#333;}#mermaid-svg-Iu9UyG1BBPyq24W3 .cluster-label span{color:#333;}#mermaid-svg-Iu9UyG1BBPyq24W3 .cluster-label span p{background-color:transparent;}#mermaid-svg-Iu9UyG1BBPyq24W3 .label text,#mermaid-svg-Iu9UyG1BBPyq24W3 span{fill:#333;color:#333;}#mermaid-svg-Iu9UyG1BBPyq24W3 .node rect,#mermaid-svg-Iu9UyG1BBPyq24W3 .node circle,#mermaid-svg-Iu9UyG1BBPyq24W3 .node ellipse,#mermaid-svg-Iu9UyG1BBPyq24W3 .node polygon,#mermaid-svg-Iu9UyG1BBPyq24W3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Iu9UyG1BBPyq24W3 .rough-node .label text,#mermaid-svg-Iu9UyG1BBPyq24W3 .node .label text,#mermaid-svg-Iu9UyG1BBPyq24W3 .image-shape .label,#mermaid-svg-Iu9UyG1BBPyq24W3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Iu9UyG1BBPyq24W3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Iu9UyG1BBPyq24W3 .rough-node .label,#mermaid-svg-Iu9UyG1BBPyq24W3 .node .label,#mermaid-svg-Iu9UyG1BBPyq24W3 .image-shape .label,#mermaid-svg-Iu9UyG1BBPyq24W3 .icon-shape .label{text-align:center;}#mermaid-svg-Iu9UyG1BBPyq24W3 .node.clickable{cursor:pointer;}#mermaid-svg-Iu9UyG1BBPyq24W3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Iu9UyG1BBPyq24W3 .arrowheadPath{fill:#333333;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Iu9UyG1BBPyq24W3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Iu9UyG1BBPyq24W3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Iu9UyG1BBPyq24W3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Iu9UyG1BBPyq24W3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Iu9UyG1BBPyq24W3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Iu9UyG1BBPyq24W3 .cluster text{fill:#333;}#mermaid-svg-Iu9UyG1BBPyq24W3 .cluster span{color:#333;}#mermaid-svg-Iu9UyG1BBPyq24W3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Iu9UyG1BBPyq24W3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Iu9UyG1BBPyq24W3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Iu9UyG1BBPyq24W3 .icon-shape,#mermaid-svg-Iu9UyG1BBPyq24W3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Iu9UyG1BBPyq24W3 .icon-shape p,#mermaid-svg-Iu9UyG1BBPyq24W3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Iu9UyG1BBPyq24W3 .icon-shape .label rect,#mermaid-svg-Iu9UyG1BBPyq24W3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Iu9UyG1BBPyq24W3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Iu9UyG1BBPyq24W3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Iu9UyG1BBPyq24W3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 关键能力跃迁
演进路径
Chatbot
对话式AI
一问一答
Copilot
辅助式AI
指令驱动操作
Agent
自主式AI
目标驱动执行
Multi-Agent
协作式AI
团队分工协作
被动响应
主动规划
自主决策
协作分工
跃迁的本质:从被动响应到主动规划,从单一操作到自主决策循环,从单兵作战到团队协作。每一步跃迁,都是能力的质变而非量变。
二、Agent架构模式详解
Agent架构模式决定了AI"怎么干活"。不同的模式适合不同的任务,选择错误的模式会让简单任务变复杂,或让复杂任务失控。
2.1 ReAct(推理+行动)------ Agent的基石
ReAct 是2022年由 Yao et al. 提出的架构模式,它是所有Agent架构的基石------理解ReAct,就理解了Agent的核心循环。
核心思想:让模型在"思考"(Reasoning)和"行动"(Acting)之间交替循环,直到收集到足够信息给出最终答案。
循环模式:
用户提问 → Thought(思考当前状况) → Action(选择并调用工具) → Observation(观察工具返回结果) → Thought(基于新信息继续思考) → ... → Answer(最终答案)
关键机制是停止条件:模型在每次Thought后判断"我有足够信息回答了吗?"如果够了,直接输出Answer;如果不够,继续Action→Observation循环。
适用场景:简单任务、助手型应用、客服Agent、调试型Agent。
最小ReAct Agent 示例(纯Python,无框架依赖):
python
"""
最小可运行 ReAct Agent
依赖:pip install openai
"""
import json
from openai import OpenAI
client = OpenAI()
TOOLS = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string", "description": "城市名称"}},
"required": ["city"],
},
},
},
{
"type": "function",
"function": {
"name": "calculate",
"description": "执行数学计算",
"parameters": {
"type": "object",
"properties": {"expression": {"type": "string", "description": "数学表达式"}},
"required": ["expression"],
},
},
},
]
def get_weather(city: str) -> str:
"""模拟天气查询(实际项目中替换为真实API调用)"""
weather_db = {
"北京": "晴天,28°C,AQI 45,空气质量优",
"上海": "多云,25°C,AQI 62,空气质量良",
}
return weather_db.get(city, f"{city}:暂无天气数据")
def calculate(expression: str) -> str:
"""安全执行数学计算"""
try:
allowed = set("0123456789+-*/().% ")
if not all(c in allowed for c in expression):
return "错误:表达式包含不允许的字符"
result = eval(expression)
return str(result)
except Exception as e:
return f"计算错误:{e}"
TOOL_MAP = {"get_weather": get_weather, "calculate": calculate}
def react_agent(user_query: str, max_steps: int = 5) -> str:
"""ReAct Agent 核心循环"""
messages = [
{"role": "system", "content": "你是一个智能助手,可以通过调用工具来回答问题。"},
{"role": "user", "content": user_query},
]
for step in range(max_steps):
print(f"\n--- Step {step + 1} ---")
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=TOOLS,
tool_choice="auto"
)
msg = response.choices[0].message
# 如果模型不再调用工具,说明它认为已经可以给出最终答案
if not msg.tool_calls:
print(f"最终答案:{msg.content}")
return msg.content
# 模型选择调用工具------这是"行动"阶段
messages.append(msg)
for tool_call in msg.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
print(f"调用工具:{func_name},参数:{func_args}")
# 执行工具并获得观察结果
result = TOOL_MAP[func_name](**func_args)
print(f"观察结果:{result}")
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": result
})
return "达到最大步数限制,任务未完成。"
if __name__ == "__main__":
answer = react_agent("北京和上海今天哪个城市更适合户外运动?")
print(f"\n最终答案:{answer}")
运行演示预期输出:
--- Step 1 ---
调用工具:get_weather,参数:{"city": "北京"}
观察结果:晴天,28°C,AQI 45,空气质量优
--- Step 2 ---
调用工具:get_weather,参数:{"city": "上海"}
观察结果:多云,25°C,AQI 62,空气质量良
--- Step 3 ---
最终答案:北京今天更适合户外运动。北京晴天且AQI 45(空气质量优),上海多云且AQI 62(空气质量良)...
这个示例展示了ReAct的核心循环:模型先思考需要查询什么信息,然后调用工具获取数据,观察结果后继续推理,最终综合所有信息给出答案。注意:模型自主决定调用哪个工具、何时停止------这就是"自主决策"的体现。
2.2 Plan-and-Execute(先想后做)
核心思想:先制定完整的执行计划,再按计划逐步执行。是ReAct的进化版本,解决ReAct"缺乏全局视野"的问题。
典型计划结构:
json
{
"plan": {
"goal": "分析2026年AI Agent市场格局",
"steps": [
{"id": 1, "action": "搜索最新AI Agent框架市场报告", "tool": "web_search"},
{"id": 2, "action": "提取各框架市场份额数据", "tool": "data_extractor"},
{"id": 3, "action": "分析技术趋势与用户偏好", "tool": "trend_analyzer"},
{"id": 4, "action": "综合数据撰写分析报告", "tool": "report_writer"}
]
}
}
优势:全局视野,避免陷入局部最优------Agent不会在第一步就走错方向然后不断纠错,而是先看清全局再出发。
适用场景:中等复杂度任务、长流程任务、多阶段内容生成。
Plan-and-Execute 实现示例:
python
"""
Plan-and-Execute Agent 实现
依赖:pip install openai
"""
import json
from openai import OpenAI
client = OpenAI()
def plan_agent(goal: str) -> list[dict]:
"""规划Agent:生成执行计划"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": """你是一个规划专家。
给定目标后,生成一个结构化的执行计划。
每个步骤包含:id、description、tool_name、expected_output。
输出JSON格式。"""},
{"role": "user", "content": f"目标:{goal}"}
],
response_format={"type": "json_object"}
)
plan = json.loads(response.choices[0].message.content)
return plan.get("steps", [])
def execute_step(step: dict, context: dict) -> str:
"""执行单个步骤"""
# 根据step.tool_name调用对应工具
# 这里简化为模拟执行
print(f" 执行步骤 {step['id']}: {step['description']}")
return f"步骤{step['id']}执行结果"
def plan_and_execute(goal: str) -> str:
"""Plan-and-Execute 主流程"""
print(f"目标:{goal}")
# Phase 1: 规划
print("\n[规划阶段]")
steps = plan_agent(goal)
for step in steps:
print(f" 步骤 {step.get('id')}: {step.get('description')}")
# Phase 2: 执行
print("\n[执行阶段]")
context = {}
for step in steps:
result = execute_step(step, context)
context[f"step_{step['id']}_result"] = result
# Phase 3: 综合
print("\n[综合阶段]")
return f"任务完成,共执行{len(steps)}个步骤"
if __name__ == "__main__":
result = plan_and_execute("分析2026年AI Agent框架市场格局,生成一份2000字的行业分析报告")
print(result)
2.3 Reflect(自我复盘)
核心思想:Agent不只会做事,还会检查自己做得对不对。执行→生成初稿→反思评估→通过则输出/不通过则修正→循环。
流程:
输入任务 → 执行生成初稿 → Reflection(自我评估:质量如何?有无错误?) →
如果通过 → 输出最终结果
如果不通过 → 根据反思意见修正 → 重新评估 → ...
适用场景:高质量写作、代码生成与审查、需要高准确率的任务。
Reflect Agent 实现示例:
python
"""
Reflect Agent 实现------带自我复盘的写作Agent
依赖:pip install openai
"""
from openai import OpenAI
client = OpenAI()
def generate_draft(topic: str, feedback: str = "") -> str:
"""生成初稿或基于反馈修正"""
prompt = f"请就以下主题撰写一段技术分析:{topic}"
if feedback:
prompt += f"\n\n请根据以下反馈修正:\n{feedback}"
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
def reflect_on_draft(draft: str, topic: str) -> dict:
"""自我复盘:评估初稿质量"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": """你是一个严格的内容质量审核员。
评估标准:准确性、完整性、逻辑性、可读性。
输出JSON:{"passed": bool, "score": float, "feedback": "改进建议"}"""),
{"role": "user", "content": f"主题:{topic}\n\n内容:\n{draft}"}
],
response_format={"type": "json_object"}
)
import json
return json.loads(response.choices[0].message.content)
def reflect_agent(topic: str, max_iterations: int = 3) -> str:
"""Reflect Agent 主循环"""
draft = ""
feedback = ""
for iteration in range(max_iterations):
print(f"\n=== 第 {iteration + 1} 次迭代 ===")
# 生成/修正初稿
draft = generate_draft(topic, feedback)
print(f"生成内容(前200字):{draft[:200]}...")
# 自我复盘
review = reflect_on_draft(draft, topic)
score = review.get("score", 0)
passed = review.get("passed", False)
feedback = review.get("feedback", "")
print(f"评估分数:{score}/10,是否通过:{passed}")
print(f"改进建议:{feedback}")
if passed or score >= 8.0:
print("\n质量达标,输出最终结果!")
return draft
print("\n达到最大迭代次数,返回最新版本")
return draft
if __name__ == "__main__":
result = reflect_agent("MCP协议对AI Agent生态的影响", max_iterations=3)
print(f"\n最终输出:\n{result}")
Reflect模式的价值:它让Agent具备了"自我纠错"能力。这不是简单的重试------Agent会分析自己的输出为什么不够好,然后针对性地改进。在生产环境中,这种能力直接提升了输出质量的稳定性。
2.4 Tree of Thoughts(深思熟虑)
核心思想:在每一步推理时,不只探索一条路径,而是同时探索多个推理路径,评估后选择最优。本质类似MCTS(蒙特卡洛树搜索)。
搜索结构:
问题 → 生成3-5个候选推理路径 → 每条路径评估得分 → 选择最高分路径 →
在最优路径上继续展开3-5个子路径 → 再评估 → ... → 选择全局最优解
代价:计算成本大幅增加(每一步要生成多个候选+评估),Token消耗是ReAct的5-10倍。
适用场景 :高难度任务------数学证明、复杂决策、创意推理、战略规划。日常任务不建议使用ToT,因为成本太高且收益有限。
python
"""
Tree of Thoughts 简化实现
依赖:pip install openai
"""
import json
from openai import OpenAI
client = OpenAI()
def generate_thoughts(problem: str, n_thoughts: int = 3) -> list[str]:
"""生成多个候选推理路径"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": f"""针对给定问题,生成{n_thoughts}个不同的推理思路。
每个思路独立且有价值。输出JSON数组:["思路1", "思路2", ...]"""),
{"role": "user", "content": problem}
],
response_format={"type": "json_object"}
)
result = json.loads(response.choices[0].message.content)
return result.get("thoughts", [])
def evaluate_thought(problem: str, thought: str) -> float:
"""评估单个推理路径的质量"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": """评估推理路径的质量。
评分标准:逻辑性、可行性、创新性。输出0-10的分数。"""),
{"role": "user", "content": f"问题:{problem}\n推理路径:{thought}"}
],
response_format={"type": "json_object"}
)
result = json.loads(response.choices[0].message.content)
return result.get("score", 0.0)
def tree_of_thoughts(problem: str, depth: int = 2, n_thoughts: int = 3) -> str:
"""Tree of Thoughts 主流程"""
best_path = []
current_problem = problem
for level in range(depth):
print(f"\n--- 探索深度 {level + 1} ---")
thoughts = generate_thoughts(current_problem, n_thoughts)
best_score = -1
best_thought = ""
for thought in thoughts:
score = evaluate_thought(problem, thought)
print(f" 思路:{thought[:50]}... → 得分:{score}")
if score > best_score:
best_score = score
best_thought = thought
best_path.append(best_thought)
print(f" 最佳思路:{best_thought[:50]}... → 得分:{best_score}")
current_problem = f"基于思路「{best_thought}」,继续深入推理"
return "最佳推理路径:\n" + "\n→ ".join(best_path)
if __name__ == "__main__":
result = tree_of_thoughts(
"如何设计一个能同时处理实时数据流和批量数据分析的混合架构?",
depth=2,
n_thoughts=3
)
print(result)
2.5 Multi-Agent(多智能体协作)
核心思想:不再是一个Agent包揽所有任务,而是多个专职Agent像团队一样分工协作。
A2A协议(Google 2025年提出)为Multi-Agent协作提供了标准化的通信协议:
- Agent Card:每个Agent发布能力卡片,描述自己擅长什么
- 任务委派:调度Agent根据任务需求,将子任务委派给最合适的专职Agent
- 并行协作:多个Agent同时执行不同子任务
- 能力发现:Agent可以动态发现其他Agent的能力
协作模式:
调度Agent(拆解任务) → 专职Agent1(执行子任务1) → 专职Agent2(执行子任务2) → ... → 汇总Agent(聚合结果)→ 最终输出
适用场景:复杂业务流程、需要多专业领域协作的任务、大型项目自动化。
A2A Agent Card 示例:
json
{
"agent_card": {
"name": "code-reviewer",
"description": "代码审查专家,擅长Python和JavaScript代码质量分析",
"capabilities": [
{"skill": "code_review", "description": "审查代码变更,检测安全漏洞和性能问题"},
{"skill": "style_check", "description": "检查代码风格是否符合规范"}
],
"endpoints": {
"invoke": "https://agent-hub.example.com/code-reviewer/invoke",
"status": "https://agent-hub.example.com/code-reviewer/status"
},
"auth": {"type": "api_key", "header": "X-Agent-Key"}
}
}
2.6 四种架构模式横向对比
#mermaid-svg-GxuoEJJioUjuWOxi{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GxuoEJJioUjuWOxi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GxuoEJJioUjuWOxi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GxuoEJJioUjuWOxi .error-icon{fill:#552222;}#mermaid-svg-GxuoEJJioUjuWOxi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GxuoEJJioUjuWOxi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GxuoEJJioUjuWOxi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GxuoEJJioUjuWOxi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GxuoEJJioUjuWOxi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GxuoEJJioUjuWOxi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GxuoEJJioUjuWOxi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GxuoEJJioUjuWOxi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GxuoEJJioUjuWOxi .marker.cross{stroke:#333333;}#mermaid-svg-GxuoEJJioUjuWOxi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GxuoEJJioUjuWOxi p{margin:0;}#mermaid-svg-GxuoEJJioUjuWOxi .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GxuoEJJioUjuWOxi .cluster-label text{fill:#333;}#mermaid-svg-GxuoEJJioUjuWOxi .cluster-label span{color:#333;}#mermaid-svg-GxuoEJJioUjuWOxi .cluster-label span p{background-color:transparent;}#mermaid-svg-GxuoEJJioUjuWOxi .label text,#mermaid-svg-GxuoEJJioUjuWOxi span{fill:#333;color:#333;}#mermaid-svg-GxuoEJJioUjuWOxi .node rect,#mermaid-svg-GxuoEJJioUjuWOxi .node circle,#mermaid-svg-GxuoEJJioUjuWOxi .node ellipse,#mermaid-svg-GxuoEJJioUjuWOxi .node polygon,#mermaid-svg-GxuoEJJioUjuWOxi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GxuoEJJioUjuWOxi .rough-node .label text,#mermaid-svg-GxuoEJJioUjuWOxi .node .label text,#mermaid-svg-GxuoEJJioUjuWOxi .image-shape .label,#mermaid-svg-GxuoEJJioUjuWOxi .icon-shape .label{text-anchor:middle;}#mermaid-svg-GxuoEJJioUjuWOxi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GxuoEJJioUjuWOxi .rough-node .label,#mermaid-svg-GxuoEJJioUjuWOxi .node .label,#mermaid-svg-GxuoEJJioUjuWOxi .image-shape .label,#mermaid-svg-GxuoEJJioUjuWOxi .icon-shape .label{text-align:center;}#mermaid-svg-GxuoEJJioUjuWOxi .node.clickable{cursor:pointer;}#mermaid-svg-GxuoEJJioUjuWOxi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GxuoEJJioUjuWOxi .arrowheadPath{fill:#333333;}#mermaid-svg-GxuoEJJioUjuWOxi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GxuoEJJioUjuWOxi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GxuoEJJioUjuWOxi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GxuoEJJioUjuWOxi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GxuoEJJioUjuWOxi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GxuoEJJioUjuWOxi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GxuoEJJioUjuWOxi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GxuoEJJioUjuWOxi .cluster text{fill:#333;}#mermaid-svg-GxuoEJJioUjuWOxi .cluster span{color:#333;}#mermaid-svg-GxuoEJJioUjuWOxi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GxuoEJJioUjuWOxi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GxuoEJJioUjuWOxi rect.text{fill:none;stroke-width:0;}#mermaid-svg-GxuoEJJioUjuWOxi .icon-shape,#mermaid-svg-GxuoEJJioUjuWOxi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GxuoEJJioUjuWOxi .icon-shape p,#mermaid-svg-GxuoEJJioUjuWOxi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GxuoEJJioUjuWOxi .icon-shape .label rect,#mermaid-svg-GxuoEJJioUjuWOxi .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GxuoEJJioUjuWOxi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GxuoEJJioUjuWOxi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GxuoEJJioUjuWOxi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} MultiAgent模式
调度Agent拆解任务
AgentA执行子任务A
AgentB执行子任务B
汇总Agent聚合
最终输出
Reflect模式
否
是
用户提问
Execute生成初稿
Reflect自我复盘
质量达标?
Output输出结果
PlanExecute模式
用户提问
Plan制定计划
Step1执行步骤1
Step2执行步骤2
StepN执行步骤N
Synthesize综合输出
ReAct模式
否
是
用户提问
Thought思考
Action调用工具
Observation观察结果
信息足够?
Answer最终答案
| 模式 | 核心思想 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|---|
| ReAct | 边思考边行动 | 实现简单、灵活、实时反馈 | 全局规划弱、可能陷入局部循环 | 工具型助手、查询类任务、客服 |
| Plan-and-Execute | 先规划再执行 | 全局结构清晰、避免走弯路 | 计划可能失真、不适应动态变化 | 长流程、多阶段生成、数据分析 |
| Reflect | 执行后自我复盘 | 质量稳定、能纠错、输出可靠 | 成本更高、迭代次数不可控 | 高质量写作、代码审查、精确任务 |
| Multi-Agent | 多角色分工协作 | 专业化、可并行、扩展性强 | 协调复杂、通信开销、调试难 | 大型业务流程、多领域协作 |
新手学习路径建议:
- 第一步:理解ReAct,手写最小Agent(本文第五节有完整代码)
- 第二步:学LangGraph,构建状态化工作流(本文第六节)
- 第三步:学CrewAI,体验多角色协作(本文第七节)
- 第四步:尝试混合架构,组合多种模式(本文第八节)
模式选择原则:
| 任务难度 | 推荐模式 | 理由 |
|---|---|---|
| 简单任务(单步工具调用) | ReAct | 实现最简单,够用就好 |
| 中等任务(3-5步流程) | Plan-and-Execute | 全局规划避免走弯路 |
| 高质量要求 | Reflect + 任意执行模式 | 自我纠错确保输出质量 |
| 高难度任务(数学证明等) | Tree of Thoughts | 多路径探索找最优解 |
| 复杂业务流程 | Multi-Agent | 专业化分工效率最高 |
三、Agent 三层架构模型
理解了架构模式,我们需要理解Agent的内部结构。所有Agent,无论用哪种模式,都可以拆解为三层:感知层、决策层、执行层。
3.1 三层架构详解
┌─────────────────────────────────┐
│ 感知层 (Perception) │
│ 用户输入 / 环境信号 / 工具反馈 │
├─────────────────────────────────┤
│ 决策层 (Decision) │
│ LLM推理 + 规划(ReAct/ToT/P&E) │
│ + 记忆检索(短期/长期/工作记忆) │
├─────────────────────────────────┤
│ 执行层 (Execution) │
│ 工具调用(MCP) + Agent协作(A2A) │
│ + 动作执行 + 结果校验 │
└─────────────────────────────────┘
感知层:Agent获取信息的入口。包括用户输入、外部环境信号(如API返回数据)、工具执行反馈。感知层决定了Agent能看到什么------看不到的信息,Agent就无法利用。
决策层:Agent的"大脑"。LLM推理能力+架构模式(ReAct/Plan-and-Execute/ToT/Reflect)+记忆检索,三者协同决定下一步做什么。决策层是Agent最核心的组件------决策质量直接决定Agent能力上限。
执行层:Agent的"手脚"。通过MCP调用外部工具,通过A2A与其他Agent协作,执行具体动作并校验结果。执行层决定了Agent能做什么------没有工具的Agent,决策再好也只能"纸上谈兵"。
3.2 记忆系统------ Agent的脑
| 记忆类型 | 类比 | 实现方式 | 生命周期 | 作用 |
|---|---|---|---|---|
| 短期记忆 | 工作记忆 | 当前对话的上下文窗口 | 单次会话 | 保持对话连贯性 |
| 长期记忆 | 经验积累 | 向量数据库/知识图谱 | 跨会话持久化 | 积累经验,跨任务复用 |
| 工作记忆 | 便签纸 | Scratchpad/中间结果缓存 | 单次任务执行期间 | 存储中间计算结果 |
一个常见误区:上下文窗口够大就不需要记忆系统了?错。上下文窗口是短期记忆,它有三个硬限制:
- 容量限制:即使128K窗口,复杂任务也会溢出
- 跨会话断裂:新会话开始,所有上下文归零
- 检索效率:大窗口里的信息,模型不一定能精准定位
长期记忆通过向量数据库解决这些问题------把关键信息持久化存储,按语义相关性检索,跨会话复用。
记忆系统配置示例:
python
"""
Agent记忆系统配置示例
依赖:pip install chromadb openai
"""
import chromadb
from openai import OpenAI
client = OpenAI()
chroma = chromadb.Client()
# 长期记忆:向量数据库存储
long_term_memory = chroma.get_or_create_collection("agent_experience")
def store_experience(task: str, solution: str, outcome: str):
"""将任务经验存入长期记忆"""
long_term_memory.add(
documents=[f"任务:{task}\n方案:{solution}\n结果:{outcome}"],
metadatas=[{"type": "experience", "task": task}],
ids=[f"exp_{hash(task)}"]
)
def retrieve_experience(task: str, top_k: int = 3):
"""从长期记忆中检索相关经验"""
results = long_term_memory.query(
query_texts=[task],
n_results=top_k
)
return results["documents"][0] if results["documents"] else []
# 工作记忆:中间结果缓存
scratchpad = {}
def update_scratchpad(key: str, value: str):
"""更新工作记忆"""
scratchpad[key] = value
def get_scratchpad(key: str) -> str:
"""读取工作记忆"""
return scratchpad.get(key, "")
# 使用示例
store_experience(
"部署FastAPI应用到AWS",
"使用Docker容器+EC2+ALB方案",
"成功,平均延迟50ms"
)
print(retrieve_experience("如何部署Web应用到云平台"))
3.3 Agent三层架构与动态循环图
#mermaid-svg-D0cK7jP7ENHjbkbn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-D0cK7jP7ENHjbkbn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-D0cK7jP7ENHjbkbn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-D0cK7jP7ENHjbkbn .error-icon{fill:#552222;}#mermaid-svg-D0cK7jP7ENHjbkbn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-D0cK7jP7ENHjbkbn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-D0cK7jP7ENHjbkbn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-D0cK7jP7ENHjbkbn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-D0cK7jP7ENHjbkbn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-D0cK7jP7ENHjbkbn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-D0cK7jP7ENHjbkbn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-D0cK7jP7ENHjbkbn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-D0cK7jP7ENHjbkbn .marker.cross{stroke:#333333;}#mermaid-svg-D0cK7jP7ENHjbkbn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-D0cK7jP7ENHjbkbn p{margin:0;}#mermaid-svg-D0cK7jP7ENHjbkbn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-D0cK7jP7ENHjbkbn .cluster-label text{fill:#333;}#mermaid-svg-D0cK7jP7ENHjbkbn .cluster-label span{color:#333;}#mermaid-svg-D0cK7jP7ENHjbkbn .cluster-label span p{background-color:transparent;}#mermaid-svg-D0cK7jP7ENHjbkbn .label text,#mermaid-svg-D0cK7jP7ENHjbkbn span{fill:#333;color:#333;}#mermaid-svg-D0cK7jP7ENHjbkbn .node rect,#mermaid-svg-D0cK7jP7ENHjbkbn .node circle,#mermaid-svg-D0cK7jP7ENHjbkbn .node ellipse,#mermaid-svg-D0cK7jP7ENHjbkbn .node polygon,#mermaid-svg-D0cK7jP7ENHjbkbn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-D0cK7jP7ENHjbkbn .rough-node .label text,#mermaid-svg-D0cK7jP7ENHjbkbn .node .label text,#mermaid-svg-D0cK7jP7ENHjbkbn .image-shape .label,#mermaid-svg-D0cK7jP7ENHjbkbn .icon-shape .label{text-anchor:middle;}#mermaid-svg-D0cK7jP7ENHjbkbn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-D0cK7jP7ENHjbkbn .rough-node .label,#mermaid-svg-D0cK7jP7ENHjbkbn .node .label,#mermaid-svg-D0cK7jP7ENHjbkbn .image-shape .label,#mermaid-svg-D0cK7jP7ENHjbkbn .icon-shape .label{text-align:center;}#mermaid-svg-D0cK7jP7ENHjbkbn .node.clickable{cursor:pointer;}#mermaid-svg-D0cK7jP7ENHjbkbn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-D0cK7jP7ENHjbkbn .arrowheadPath{fill:#333333;}#mermaid-svg-D0cK7jP7ENHjbkbn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-D0cK7jP7ENHjbkbn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-D0cK7jP7ENHjbkbn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-D0cK7jP7ENHjbkbn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-D0cK7jP7ENHjbkbn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-D0cK7jP7ENHjbkbn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-D0cK7jP7ENHjbkbn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-D0cK7jP7ENHjbkbn .cluster text{fill:#333;}#mermaid-svg-D0cK7jP7ENHjbkbn .cluster span{color:#333;}#mermaid-svg-D0cK7jP7ENHjbkbn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-D0cK7jP7ENHjbkbn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-D0cK7jP7ENHjbkbn rect.text{fill:none;stroke-width:0;}#mermaid-svg-D0cK7jP7ENHjbkbn .icon-shape,#mermaid-svg-D0cK7jP7ENHjbkbn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-D0cK7jP7ENHjbkbn .icon-shape p,#mermaid-svg-D0cK7jP7ENHjbkbn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-D0cK7jP7ENHjbkbn .icon-shape .label rect,#mermaid-svg-D0cK7jP7ENHjbkbn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-D0cK7jP7ENHjbkbn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-D0cK7jP7ENHjbkbn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-D0cK7jP7ENHjbkbn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 执行层
决策层
感知层
用户输入
环境信号
工具反馈
其他Agent消息
LLM推理引擎
架构模式选择
ReAct/Plan/Reflect/ToT
记忆检索
短期+长期+工作
决策输出
下一步行动
MCP工具调用
动作执行
A2A Agent协作
结果校验
动态循环:感知→决策→执行→反馈→感知→... 这不是单向流程,而是闭环。每次执行结果都回传到感知层,驱动下一轮决策。这个闭环让Agent具备了"自我调整"能力------执行结果不理想时,Agent不是盲目继续,而是观察反馈后重新规划。
四、技术基础设施:MCP 与 A2A
Agent的架构模式决定了"怎么想",而MCP和A2A决定了"怎么做"和"怎么协作"。它们是Agent生态的基础设施层。
4.1 MCP 协议(Model Context Protocol)
MCP是什么? Anthropic于2024年底提出,到2026年已成为事实标准。MCP解决的核心问题是:工具调用的碎片化。
之前,每个AI应用要对接不同的工具(数据库、API、文件系统),都需要单独写对接代码。MCP定义了一套标准化协议,让工具提供方只需实现一次MCP Server,所有支持MCP的Agent框架都能直接调用。
MCP Server暴露三种能力:
| 能力类型 | 说明 | 示例 |
|---|---|---|
| Resources | 静态数据资源,Agent可读取 | 文件内容、数据库记录、配置信息 |
| Tools | 可执行操作,Agent可调用 | 搜索API、代码执行、文件写入 |
| Prompts | 预设提示模板,Agent可加载 | 代码审查模板、数据分析模板 |
MCP Server 配置示例:
json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"],
"description": "文件系统操作工具"
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"description": "GitHub操作工具(PR、Issue、Repo管理)"
},
"database": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-sqlite", "data.db"],
"description": "SQLite数据库查询工具"
}
}
}
MCP vs Function Calling 对比:
| 对比维度 | Function Calling | MCP |
|---|---|---|
| 定位 | 动作层------让模型输出结构化的调用指令 | 协议层------标准化工具接入方式 |
| 类比 | 具体的插头(如USB-A插头) | 接口标准(如USB接口标准) |
| 作用范围 | 单次调用,模型→工具 | 生态级,Agent→MCP Client→MCP Server→工具 |
| 扩展性 | 每新增一个工具,需要修改代码 | 新增MCP Server即可,无需修改Agent代码 |
| 状态管理 | 无 | 支持长连接、状态保持 |
| 工具发现 | 需要硬编码工具列表 | 动态发现MCP Server提供的工具 |
关键理解:MCP不是Function Calling的替代品,而是上层协议。Function Calling定义"模型如何输出调用指令",MCP定义"工具如何统一接入"。它们是互补关系,不是竞争关系。
4.2 A2A 协议(Agent-to-Agent)
A2A是什么? Google于2025年提出,定义了Agent之间如何通信和协作的标准协议。
A2A核心能力:
- 能力发现:Agent发布Agent Card,其他Agent据此发现可用能力
- 任务委派:调度Agent将子任务委派给最合适的专职Agent
- 并行协作:多个Agent同时执行不同子任务,异步返回结果
- 状态同步:Agent之间共享任务执行状态,避免重复工作
A2A协作模式:
用户请求 → 调度Agent(分析任务,拆解子任务,委派) →
Agent A(并行执行子任务1) →
Agent B(并行执行子任务2) →
... → 汇总Agent(聚合所有结果) → 最终输出
4.3 MCP + A2A 的生态效应
MCP和A2A组合,形成了Agent生态的双层基础设施:
- MCP:解决"Agent与工具"的连接问题(一个Agent如何使用众多工具)
- A2A:解决"Agent与Agent"的协作问题(多个Agent如何分工合作)
#mermaid-svg-cgKp0fFiBqDVlPvM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cgKp0fFiBqDVlPvM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cgKp0fFiBqDVlPvM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cgKp0fFiBqDVlPvM .error-icon{fill:#552222;}#mermaid-svg-cgKp0fFiBqDVlPvM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cgKp0fFiBqDVlPvM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cgKp0fFiBqDVlPvM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cgKp0fFiBqDVlPvM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cgKp0fFiBqDVlPvM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cgKp0fFiBqDVlPvM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cgKp0fFiBqDVlPvM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cgKp0fFiBqDVlPvM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cgKp0fFiBqDVlPvM .marker.cross{stroke:#333333;}#mermaid-svg-cgKp0fFiBqDVlPvM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cgKp0fFiBqDVlPvM p{margin:0;}#mermaid-svg-cgKp0fFiBqDVlPvM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cgKp0fFiBqDVlPvM .cluster-label text{fill:#333;}#mermaid-svg-cgKp0fFiBqDVlPvM .cluster-label span{color:#333;}#mermaid-svg-cgKp0fFiBqDVlPvM .cluster-label span p{background-color:transparent;}#mermaid-svg-cgKp0fFiBqDVlPvM .label text,#mermaid-svg-cgKp0fFiBqDVlPvM span{fill:#333;color:#333;}#mermaid-svg-cgKp0fFiBqDVlPvM .node rect,#mermaid-svg-cgKp0fFiBqDVlPvM .node circle,#mermaid-svg-cgKp0fFiBqDVlPvM .node ellipse,#mermaid-svg-cgKp0fFiBqDVlPvM .node polygon,#mermaid-svg-cgKp0fFiBqDVlPvM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cgKp0fFiBqDVlPvM .rough-node .label text,#mermaid-svg-cgKp0fFiBqDVlPvM .node .label text,#mermaid-svg-cgKp0fFiBqDVlPvM .image-shape .label,#mermaid-svg-cgKp0fFiBqDVlPvM .icon-shape .label{text-anchor:middle;}#mermaid-svg-cgKp0fFiBqDVlPvM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cgKp0fFiBqDVlPvM .rough-node .label,#mermaid-svg-cgKp0fFiBqDVlPvM .node .label,#mermaid-svg-cgKp0fFiBqDVlPvM .image-shape .label,#mermaid-svg-cgKp0fFiBqDVlPvM .icon-shape .label{text-align:center;}#mermaid-svg-cgKp0fFiBqDVlPvM .node.clickable{cursor:pointer;}#mermaid-svg-cgKp0fFiBqDVlPvM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cgKp0fFiBqDVlPvM .arrowheadPath{fill:#333333;}#mermaid-svg-cgKp0fFiBqDVlPvM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cgKp0fFiBqDVlPvM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cgKp0fFiBqDVlPvM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cgKp0fFiBqDVlPvM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cgKp0fFiBqDVlPvM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cgKp0fFiBqDVlPvM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cgKp0fFiBqDVlPvM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cgKp0fFiBqDVlPvM .cluster text{fill:#333;}#mermaid-svg-cgKp0fFiBqDVlPvM .cluster span{color:#333;}#mermaid-svg-cgKp0fFiBqDVlPvM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cgKp0fFiBqDVlPvM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cgKp0fFiBqDVlPvM rect.text{fill:none;stroke-width:0;}#mermaid-svg-cgKp0fFiBqDVlPvM .icon-shape,#mermaid-svg-cgKp0fFiBqDVlPvM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cgKp0fFiBqDVlPvM .icon-shape p,#mermaid-svg-cgKp0fFiBqDVlPvM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cgKp0fFiBqDVlPvM .icon-shape .label rect,#mermaid-svg-cgKp0fFiBqDVlPvM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cgKp0fFiBqDVlPvM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cgKp0fFiBqDVlPvM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cgKp0fFiBqDVlPvM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Agent协作层_A2A
调度Agent
A2A协议
研究Agent
写作Agent
审查Agent
返回结果
汇总Agent
Agent工具层_MCP
Agent
MCP Client
MCP Server
文件系统
MCP Server
GitHub
MCP Server
数据库
MCP Server
搜索引擎
Read/Write文件
创建PR/管理Issue
SQL查询
Web搜索
生态效应:MCP让"工具接入"从N次开发变为1次接入,A2A让"Agent协作"从硬编码变为标准化通信。两者结合,Agent生态从"手工作坊"升级为"工业化流水线"。
五、实战一:纯Python最小ReAct Agent
这一节带你从零开始,手写一个最小但完整可运行的ReAct Agent。不依赖任何Agent框架,只用OpenAI SDK------理解底层原理是使用框架的前提。
5.1 环境准备与安装
bash
# 安装依赖
pip install openai
# 设置API密钥(选择其一)
# 方式一:环境变量
export OPENAI_API_KEY="sk-your-key-here"
# 方式二:创建.env文件
echo 'OPENAI_API_KEY=sk-your-key-here' > .env
5.2 完整可运行代码
python
"""
最小可运行 ReAct Agent ------ 零框架依赖
依赖:pip install openai
功能:天气查询 + 数学计算,自主决策循环
"""
import json
from openai import OpenAI
client = OpenAI()
# ===== 工具定义 =====
TOOLS = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的天气信息,包括温度、天气状况和空气质量",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"],
},
},
},
{
"type": "function",
"function": {
"name": "calculate",
"description": "执行数学计算,支持加减乘除和括号",
"parameters": {
"type": "object",
"properties": {
"expression": {"type": "string", "description": "数学表达式,如 (28-25)*2"}
},
"required": ["expression"],
},
},
},
]
# ===== 工具实现 =====
def get_weather(city: str) -> str:
"""模拟天气查询(实际项目中替换为真实天气API)"""
weather_db = {
"北京": "晴天,28°C,AQI 45,空气质量优",
"上海": "多云,25°C,AQI 62,空气质量良",
"深圳": "小雨,30°C,AQI 38,空气质量优",
"成都": "阴天,22°C,AQI 78,空气质量轻度污染",
}
return weather_db.get(city, f"{city}:暂无天气数据")
def calculate(expression: str) -> str:
"""安全执行数学计算(仅允许数字和运算符)"""
try:
allowed = set("0123456789+-*/().% ")
if not all(c in allowed for c in expression):
return "错误:表达式包含不允许的字符"
result = eval(expression)
return str(result)
except Exception as e:
return f"计算错误:{e}"
TOOL_MAP = {"get_weather": get_weather, "calculate": calculate}
# ===== ReAct Agent核心循环 =====
def react_agent(user_query: str, max_steps: int = 5) -> str:
"""
ReAct Agent 主循环
1. 模型思考是否需要调用工具
2. 如需调用→执行工具→观察结果→继续思考
3. 如不需调用→直接给出最终答案
"""
messages = [
{
"role": "system",
"content": "你是一个智能助手,可以通过调用工具来回答问题。请先思考需要哪些信息,然后调用工具获取,最后综合分析给出答案。"
},
{"role": "user", "content": user_query},
]
for step in range(max_steps):
print(f"\n{'='*40}")
print(f"Step {step + 1}")
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=TOOLS,
tool_choice="auto"
)
msg = response.choices[0].message
# 关键判断:模型是否还在调用工具?
# 如果不再调用→模型认为已有足够信息→输出最终答案
if not msg.tool_calls:
print(f"🤖 最终答案:{msg.content}")
return msg.content
# 模型选择调用工具------这是ReAct的"行动"阶段
messages.append(msg)
for tool_call in msg.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
print(f"🔧 调用工具:{func_name}")
print(f" 参数:{json.dumps(func_args, ensure_ascii=False)}")
# 执行工具并获得观察结果------这是ReAct的"观察"阶段
result = TOOL_MAP[func_name](**func_args)
print(f"👁 观察结果:{result}")
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": result
})
return "⚠ 达到最大步数限制,任务未完成。"
# ===== 运行 =====
if __name__ == "__main__":
answer = react_agent("北京和上海今天哪个城市更适合户外运动?请比较温度和空气质量。")
print(f"\n{'='*40}")
print(f"最终结果:{answer}")
5.3 运行演示与预期输出
========================================
Step 1
🔧 调用工具:get_weather
参数:{"city": "北京"}
👁 观察结果:晴天,28°C,AQI 45,空气质量优
========================================
Step 2
🔧 调用工具:get_weather
参数:{"city": "上海"}
👁 观察结果:多云,25°C,AQI 62,空气质量良
========================================
Step 3
🤖 最终答案:综合比较,北京今天更适合户外运动...
========================================
最终结果:综合比较,北京今天更适合户外运动...
5.4 核心循环机制解析
为什么这个代码是"ReAct"? 关键在于这个循环:
python
for step in range(max_steps):
# 模型自主决定:是继续调用工具,还是给出答案?
response = client.chat.completions.create(...)
if not msg.tool_calls: # 停止条件
return msg.content # 输出最终答案
# 否则:调用工具→观察结果→继续循环
messages.append(msg)
messages.append({"role": "tool", ...})
三个关键点:
- 自主决策:模型自己决定调用哪个工具、传什么参数。不是硬编码的"先查北京再查上海",而是模型根据问题自主推理出的行动序列。
- 观察驱动:每次工具调用的结果都追加到对话历史,模型基于观察结果继续推理。
- 停止条件 :模型判断"信息足够"时停止调用工具,直接输出答案。
max_steps是安全阀,防止无限循环。
六、实战二:基于LangGraph的状态化工作流
ReAct适合简单任务,但生产级Agent需要更复杂的工作流控制------状态管理、条件分支、检查点、人机协作。LangGraph是目前最成熟的状态化Agent框架。
6.1 LangGraph 安装与配置
bash
# 安装LangGraph及依赖
pip install langgraph langchain-openai python-dotenv langchain_community
# 验证安装
python -c "from langgraph.graph import StateGraph; print('LangGraph安装成功')"
6.2 核心概念速览
| 概念 | 说明 | 类比 |
|---|---|---|
| StateGraph | 状态图,定义Agent工作流 | 流程图 |
| Node | 图中的节点,每个节点是一个处理函数 | 流程步骤 |
| Edge | 节点间的连接,定义执行顺序 | 流程箭头 |
| Conditional Edge | 条件分支,根据状态决定下一步 | 条件判断 |
| Checkpoint | 检查点,持久化保存当前状态 | 游戏存档 |
| State | 共享状态对象,所有节点读写同一份状态 | 共享黑板 |
6.3 完整代码示例------代码审查Agent工作流
python
"""
LangGraph 代码审查Agent工作流
功能:自动审查代码变更,支持多轮迭代和人机协作
依赖:pip install langgraph langchain-openai
"""
from typing import TypedDict, Annotated, Literal
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.sqlite import SqliteSaver
import operator
# ===== 状态定义 =====
class ReviewState(TypedDict):
messages: Annotated[list, operator.add] # 对话历史
code_diff: str # 待审查的代码变更
review_comments: list[str] # 审查意见
approval_status: Literal["pending", "approved", "rejected"] # 审批状态
iteration: int # 迭代次数
# ===== 节点实现 =====
def analyze_node(state: ReviewState) -> dict:
"""静态分析节点:使用静态分析工具检查代码"""
# 模拟静态分析器检测问题
code = state["code_diff"]
comments = []
# 简单规则检测(实际项目中使用真实的静态分析工具)
if "eval(" in code:
comments.append("⚠ 安全风险:代码中使用了eval(),可能导致代码注入")
if "TODO" in code:
comments.append("📋 未完成标记:代码中存在TODO,请补充实现")
if len(code.split("\n")) > 50:
comments.append("📏 代码长度:单次提交超过50行,建议拆分")
print(f"[静态分析] 发现 {len(comments)} 个问题")
return {
"review_comments": comments,
"iteration": state.get("iteration", 0) + 1
}
def llm_review_node(state: ReviewState) -> dict:
"""LLM审查节点:使用LLM进行深度代码审查"""
# 实际项目中调用LLM进行审查
# 这里模拟审查结果
review = "代码逻辑正确,但建议添加异常处理和日志记录。"
print(f"[LLM审查] 意见:{review}")
return {
"review_comments": state.get("review_comments", []) + [review]
}
def decide_approval(state: ReviewState) -> str:
"""审批决策节点:根据审查意见决定是否通过"""
comments = state.get("review_comments", [])
iteration = state.get("iteration", 0)
if len(comments) == 0:
print("[决策] 无审查意见 → 通过")
return "approve"
if iteration >= 3:
print("[决策] 达到最大迭代次数 → 人工介入")
return "escalate"
print("[决策] 有审查意见 → 要求修改")
return "request_changes"
# ===== 构建状态图 =====
graph = StateGraph(ReviewState)
# 添加节点
graph.add_node("analyze", analyze_node)
graph.add_node("llm_review", llm_review_node)
# 添加边
graph.add_edge("analyze", "llm_review")
graph.add_conditional_edges(
"llm_review",
decide_approval,
{
"approve": END, # 通过→结束
"request_changes": "analyze", # 需修改→重新分析
"escalate": END # 人工介入→结束
}
)
# 设置入口
graph.set_entry_point("analyze")
# ===== 编译并运行 =====
checkpointer = SqliteSaver.from_conn_string("checkpoints.db")
app = graph.compile(checkpointer=checkpointer)
# 执行工作流
initial_state = {
"messages": [],
"code_diff": "def process(data):\n result = eval(data)\n return result\n# TODO: add error handling",
"review_comments": [],
"approval_status": "pending",
"iteration": 0
}
result = app.invoke(initial_state)
print(f"\n最终状态:{result}")
6.4 检查点与人机协作机制
Checkpoint是LangGraph最强大的特性之一------它让Agent工作流可以"暂停→保存→恢复"。
python
"""
LangGraph 检查点与人机协作示例
"""
from langgraph.checkpoint.sqlite import SqliteSaver
# 使用检查点持久化
checkpointer = SqliteSaver.from_conn_string("checkpoints.db")
app = graph.compile(
checkpointer=checkpointer,
interrupt_before=["llm_review"] # 在LLM审查前暂停,等待人工确认
)
# 启动工作流
config = {"configurable": {"thread_id": "review-001"}}
result = app.invoke(initial_state, config)
# 人工确认后继续
# 读取当前状态
state = app.get_state(config)
print(f"当前状态:{state.values}")
print(f"下一步:{state.next}")
# 人工确认,继续执行
app.update_state(config, {"human_feedback": "请重点检查安全漏洞"})
result = app.invoke(None, config) # None表示继续执行,不传入新状态
为什么检查点重要?
- 断点续传:Agent工作流可以暂停,人工确认后继续。避免Agent自行做出关键决策。
- 状态回溯:出错时可以回到之前的状态重新执行,而不是从头开始。
- 多会话协作:不同用户可以在不同时间点介入同一个工作流。
6.5 LangGraph状态图示例
#mermaid-svg-I0baGNPejD8Qbgjj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-I0baGNPejD8Qbgjj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-I0baGNPejD8Qbgjj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-I0baGNPejD8Qbgjj .error-icon{fill:#552222;}#mermaid-svg-I0baGNPejD8Qbgjj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-I0baGNPejD8Qbgjj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-I0baGNPejD8Qbgjj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-I0baGNPejD8Qbgjj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-I0baGNPejD8Qbgjj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-I0baGNPejD8Qbgjj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-I0baGNPejD8Qbgjj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-I0baGNPejD8Qbgjj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-I0baGNPejD8Qbgjj .marker.cross{stroke:#333333;}#mermaid-svg-I0baGNPejD8Qbgjj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-I0baGNPejD8Qbgjj p{margin:0;}#mermaid-svg-I0baGNPejD8Qbgjj defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-I0baGNPejD8Qbgjj g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-I0baGNPejD8Qbgjj g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-I0baGNPejD8Qbgjj g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-I0baGNPejD8Qbgjj g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-I0baGNPejD8Qbgjj g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-I0baGNPejD8Qbgjj .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-I0baGNPejD8Qbgjj .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-I0baGNPejD8Qbgjj .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-I0baGNPejD8Qbgjj .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-I0baGNPejD8Qbgjj .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-I0baGNPejD8Qbgjj .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-I0baGNPejD8Qbgjj .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-I0baGNPejD8Qbgjj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-I0baGNPejD8Qbgjj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-I0baGNPejD8Qbgjj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-I0baGNPejD8Qbgjj .edgeLabel .label text{fill:#333;}#mermaid-svg-I0baGNPejD8Qbgjj .label div .edgeLabel{color:#333;}#mermaid-svg-I0baGNPejD8Qbgjj .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-I0baGNPejD8Qbgjj .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-I0baGNPejD8Qbgjj .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-I0baGNPejD8Qbgjj .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-I0baGNPejD8Qbgjj .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-I0baGNPejD8Qbgjj .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-I0baGNPejD8Qbgjj .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-I0baGNPejD8Qbgjj #statediagram-barbEnd{fill:#333333;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-I0baGNPejD8Qbgjj .cluster-label,#mermaid-svg-I0baGNPejD8Qbgjj .nodeLabel{color:#131300;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-I0baGNPejD8Qbgjj .note-edge{stroke-dasharray:5;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-note text{fill:black;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram-note .nodeLabel{color:black;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagram .edgeLabel{color:red;}#mermaid-svg-I0baGNPejD8Qbgjj #dependencyStart,#mermaid-svg-I0baGNPejD8Qbgjj #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-I0baGNPejD8Qbgjj .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-I0baGNPejD8Qbgjj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入代码变更
静态分析完成
LLM审查完成
无审查意见
有审查意见
且迭代<3
迭代≥3
需人工介入
重新分析
输出审批结果
人工处理
analyze
llm_review
decide
approved
request_changes
escalated
七、实战三:基于CrewAI的多角色协作
当任务需要多个专业角色协作时,CrewAI是最容易上手的多Agent框架。它用"角色+任务+团队"的声明式语法,让多Agent协作变得直观。
7.1 CrewAI 安装与配置
bash
# 安装CrewAI
pip install crewai
# 安装额外工具(可选)
pip install crewai-tools
# 验证安装
python -c "from crewai import Agent, Task, Crew; print('CrewAI安装成功')"
7.2 核心概念速览
| 概念 | 说明 | 类比 |
|---|---|---|
| Agent | 专职角色,有自己的目标、背景故事和工具 | 团队成员 |
| Task | 具体任务,有预期输出和负责Agent | 工作任务 |
| Crew | 团队,包含多个Agent和多个Task | 项目团队 |
| Process | 执行流程------sequential(顺序)或hierarchical(层级) | 工作流程 |
7.3 完整代码示例------研究+写作团队
python
"""
CrewAI 多角色协作------研究+写作团队
功能:研究员收集信息,作家撰写报告
依赖:pip install crewai crewai-tools
"""
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool, ScrapeWebsiteTool
# ===== 工具配置 =====
web_search = SerperDevTool() # 搜索工具
web_scraper = ScrapeWebsiteTool() # 网页抓取工具
# ===== Agent定义 =====
researcher = Agent(
role="高级研究员",
goal="收集和分析AI Agent框架的最新动态和市场数据",
backstory="""你是一位有10年经验的市场研究专家。
你擅长从海量信息中提取关键数据,识别趋势和模式。
你总是提供有数据支撑的结论,从不空谈。""",
tools=[web_search, web_scraper],
llm="gpt-4o",
verbose=True,
max_iter=5
)
writer = Agent(
role="技术作家",
goal="将研究结果转化为结构清晰、数据丰富的分析报告",
backstory="""你擅长将复杂技术概念用简洁语言表达。
你的报告总是结构清晰、数据支撑充分、结论明确。
你不会堆砌术语,而是让每个读者都能理解。""",
llm="claude-sonnet-4-20250514",
verbose=True,
max_iter=3
)
# ===== Task定义 =====
research_task = Task(
description="""调研2026年AI Agent框架市场格局:
1. 搜索LangGraph、CrewAI、AG2等主流框架的最新版本和特性
2. 收集各框架的用户数量、市场份额数据
3. 分析技术趋势:MCP集成度、A2A支持度、多模态能力
4. 整理成结构化的研究笔记""",
expected_output="包含数据支撑的2000字研究笔记",
agent=researcher
)
write_task = Task(
description="""基于研究结果撰写分析报告:
1. 用研究笔记作为素材
2. 报告结构:市场概述→框架对比→趋势分析→选型建议
3. 每个论点必须有数据支撑
4. 语言简洁专业,适合技术决策者阅读""",
expected_output="SEO优化的技术分析报告,3000字",
agent=writer,
context=[research_task] # 关键:写作任务依赖研究任务的结果
)
# ===== Crew组建 =====
crew = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
process=Process.sequential, # 顺序执行:研究→写作
verbose=True
)
# ===== 执行 =====
result = crew.kickoff()
print(f"\n最终报告:\n{result}")
7.4 执行流程解析
CrewAI的执行流程简洁明了:
- 任务分配 :Crew按顺序分配任务。
research_task先分配给researcher。 - Agent执行:researcher使用搜索工具收集信息,输出研究笔记。
- 上下文传递 :研究笔记自动传递给
write_task的context参数。 - 接力执行:writer基于研究笔记撰写报告,输出最终结果。
关键设计点 :context=[research_task]------这让写作Agent能读取研究Agent的输出。CrewAI自动处理Agent间的上下文传递,你不需要手动编排消息。
八、实战四:混合架构生产Agent
生产级Agent不会只用一种模式。现实任务复杂多变------简单子任务用ReAct,长流程用Plan-and-Execute,关键输出用Reflect校验。混合架构是生产Agent的标配。
8.1 混合模式设计策略
任务输入 → 复杂度判断 →
简单任务:直接ReAct执行 → Reflect校验 → 输出
中等任务:Plan-and-Execute规划 → 分步执行 → Reflect校验 → 输出
复杂任务:Plan → Multi-Agent分工 → 各Agent执行 → Reflect校验 → 汇总 → 输出
8.2 完整Python代码
python
"""
混合架构生产Agent ------ ReAct + Plan-Exec + Reflect 组合
零框架依赖,纯Python实现,展示混合架构设计原理
依赖:pip install openai
"""
import json
from openai import OpenAI
client = OpenAI()
# ===== 工具定义 =====
def classify_complexity(task: str) -> str:
"""判断任务复杂度"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": """判断任务复杂度,输出JSON:
{"level": "simple" | "medium" | "complex", "reason": "判断理由"}
simple:单步工具调用即可完成
medium:需要3-5步有序执行
complex:需要多角色协作或多轮迭代""")},
{"role": "user", "content": task}
],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)["level"]
def react_execute(task: str, tools: list, tool_map: dict, max_steps: int = 5) -> str:
"""ReAct执行模式"""
messages = [
{"role": "system", "content": "你是一个智能助手,通过调用工具完成任务。"},
{"role": "user", "content": task},
]
for step in range(max_steps):
response = client.chat.completions.create(
model="gpt-4o", messages=messages, tools=tools, tool_choice="auto"
)
msg = response.choices[0].message
if not msg.tool_calls:
return msg.content
messages.append(msg)
for tc in msg.tool_calls:
result = tool_map[tc.function.name](**json.loads(tc.function.arguments))
messages.append({"role": "tool", "tool_call_id": tc.id, "content": result})
return "ReAct执行达到步数上限"
def plan_and_execute(task: str) -> str:
"""Plan-and-Execute执行模式"""
# 规划阶段
plan_response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "制定执行计划,输出JSON:{\"steps\": [{\"id\": int, \"action\": str}]}"},
{"role": "user", "content": task}
],
response_format={"type": "json_object"}
)
steps = json.loads(plan_response.choices[0].message.content).get("steps", [])
# 执行阶段
results = []
for step in steps:
exec_response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": f"执行步骤:{step['action']}。已有结果:{json.dumps(results)}"}]
)
results.append({"step": step["id"], "result": exec_response.choices[0].message.content})
# 综合阶段
final_response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": f"基于以下执行结果综合输出:\n{json.dumps(results, ensure_ascii=False)}"}]
)
return final_response.choices[0].message.content
def reflect_check(output: str, original_task: str) -> tuple[bool, str]:
"""Reflect质量校验"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": """评估输出质量,判断是否满足原始任务要求。
输出JSON:{"passed": bool, "score": float, "feedback": "改进建议"}"""),
{"role": "user", "content": f"原始任务:{original_task}\n输出内容:{output}"}
],
response_format={"type": "json_object"}
)
review = json.loads(response.choices[0].message.content)
return review.get("passed", False), review.get("feedback", "")
def hybrid_agent(task: str, max_reflect_iterations: int = 2) -> str:
"""混合架构Agent主入口"""
print(f"📋 任务:{task}")
# Phase 1: 复杂度判断
level = classify_complexity(task)
print(f"📊 复杂度:{level}")
# Phase 2: 选择执行模式
if level == "simple":
print("⚡ 使用ReAct模式执行")
output = react_execute(task, TOOLS, TOOL_MAP)
elif level == "medium":
print("📝 使用Plan-and-Execute模式执行")
output = plan_and_execute(task)
else:
print("🏗 使用Plan-and-Execute + Multi-Agent模式执行")
output = plan_and_execute(task) # 简化示例,实际应接入Multi-Agent
# Phase 3: Reflect质量校验
print("\n🔍 Reflect质量校验")
for i in range(max_reflect_iterations):
passed, feedback = reflect_check(output, task)
print(f" 第{i+1}次校验:{'✅ 通过' if passed else '❌ 需修正'}")
if passed:
break
# 根据反馈修正
revise_response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": f"请根据反馈修正:\n反馈:{feedback}\n原内容:{output}"}]
)
output = revise_response.choices[0].message.content
return output
# ===== 运行 =====
if __name__ == "__main__":
# 复用第五节的工具定义
TOOLS = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询天气",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}, "required": ["city"]},
},
},
]
def get_weather(city: str) -> str:
return {"北京": "晴天28°C", "上海": "多云25°C"}.get(city, "无数据")
TOOL_MAP = {"get_weather": get_weather}
result = hybrid_agent("对比北京和上海的天气,给出户外活动建议")
print(f"\n最终输出:{result}")
8.3 代码详解
混合架构的三个关键设计:
-
复杂度路由 :
classify_complexity在任务入口判断复杂度,动态选择执行模式。这避免了"用重型模式处理简单任务"的资源浪费,也避免了"用简单模式处理复杂任务"的风险。 -
模式组合:ReAct处理简单任务,Plan-and-Execute处理中等任务,Multi-Agent处理复杂任务。每种模式发挥各自优势。
-
Reflect兜底:无论哪种执行模式,最终输出都经过Reflect质量校验。这是生产级Agent的标配------没有质量校验的Agent,输出不可控。
8.4 混合架构Agent工作流图
#mermaid-svg-PRiJ1wNnW46iLm7t{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PRiJ1wNnW46iLm7t .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PRiJ1wNnW46iLm7t .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PRiJ1wNnW46iLm7t .error-icon{fill:#552222;}#mermaid-svg-PRiJ1wNnW46iLm7t .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PRiJ1wNnW46iLm7t .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PRiJ1wNnW46iLm7t .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PRiJ1wNnW46iLm7t .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PRiJ1wNnW46iLm7t .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PRiJ1wNnW46iLm7t .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PRiJ1wNnW46iLm7t .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PRiJ1wNnW46iLm7t .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PRiJ1wNnW46iLm7t .marker.cross{stroke:#333333;}#mermaid-svg-PRiJ1wNnW46iLm7t svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PRiJ1wNnW46iLm7t p{margin:0;}#mermaid-svg-PRiJ1wNnW46iLm7t .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PRiJ1wNnW46iLm7t .cluster-label text{fill:#333;}#mermaid-svg-PRiJ1wNnW46iLm7t .cluster-label span{color:#333;}#mermaid-svg-PRiJ1wNnW46iLm7t .cluster-label span p{background-color:transparent;}#mermaid-svg-PRiJ1wNnW46iLm7t .label text,#mermaid-svg-PRiJ1wNnW46iLm7t span{fill:#333;color:#333;}#mermaid-svg-PRiJ1wNnW46iLm7t .node rect,#mermaid-svg-PRiJ1wNnW46iLm7t .node circle,#mermaid-svg-PRiJ1wNnW46iLm7t .node ellipse,#mermaid-svg-PRiJ1wNnW46iLm7t .node polygon,#mermaid-svg-PRiJ1wNnW46iLm7t .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PRiJ1wNnW46iLm7t .rough-node .label text,#mermaid-svg-PRiJ1wNnW46iLm7t .node .label text,#mermaid-svg-PRiJ1wNnW46iLm7t .image-shape .label,#mermaid-svg-PRiJ1wNnW46iLm7t .icon-shape .label{text-anchor:middle;}#mermaid-svg-PRiJ1wNnW46iLm7t .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PRiJ1wNnW46iLm7t .rough-node .label,#mermaid-svg-PRiJ1wNnW46iLm7t .node .label,#mermaid-svg-PRiJ1wNnW46iLm7t .image-shape .label,#mermaid-svg-PRiJ1wNnW46iLm7t .icon-shape .label{text-align:center;}#mermaid-svg-PRiJ1wNnW46iLm7t .node.clickable{cursor:pointer;}#mermaid-svg-PRiJ1wNnW46iLm7t .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PRiJ1wNnW46iLm7t .arrowheadPath{fill:#333333;}#mermaid-svg-PRiJ1wNnW46iLm7t .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PRiJ1wNnW46iLm7t .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PRiJ1wNnW46iLm7t .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PRiJ1wNnW46iLm7t .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PRiJ1wNnW46iLm7t .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PRiJ1wNnW46iLm7t .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PRiJ1wNnW46iLm7t .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PRiJ1wNnW46iLm7t .cluster text{fill:#333;}#mermaid-svg-PRiJ1wNnW46iLm7t .cluster span{color:#333;}#mermaid-svg-PRiJ1wNnW46iLm7t div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PRiJ1wNnW46iLm7t .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PRiJ1wNnW46iLm7t rect.text{fill:none;stroke-width:0;}#mermaid-svg-PRiJ1wNnW46iLm7t .icon-shape,#mermaid-svg-PRiJ1wNnW46iLm7t .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PRiJ1wNnW46iLm7t .icon-shape p,#mermaid-svg-PRiJ1wNnW46iLm7t .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PRiJ1wNnW46iLm7t .icon-shape .label rect,#mermaid-svg-PRiJ1wNnW46iLm7t .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PRiJ1wNnW46iLm7t .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PRiJ1wNnW46iLm7t .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PRiJ1wNnW46iLm7t :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} simple
简单任务
medium
中等任务
complex
复杂任务
通过 ✅
不通过 ❌
任务输入
复杂度判断
ReAct模式执行
Plan-and-Execute
先规划再执行
Multi-Agent
多角色协作
Reflect
质量校验
输出最终结果
根据反馈修正
为什么混合架构是生产标配? 因为真实任务不会恰好匹配某一种模式。一个"分析市场趋势并生成报告"的任务,包含数据查询(简单)、趋势分析(中等)、报告撰写(需要质量校验)三个层次。混合架构让Agent在每个子任务上选择最优模式,而不是一刀切。
九、六大框架横向对比与选型指南
9.1 框架核心特性对比表
| 维度 | Claude Agent SDK | Strands Agents | LangGraph | OpenAI Agents SDK | CrewAI | AG2 |
|---|---|---|---|---|---|---|
| 设计哲学 | 工具驱动、MCP原生 | 模型驱动 | 图驱动、状态显式 | 指令驱动、handoff | 角色驱动、任务声明式 | 对话驱动、事件异步 |
| 编排方式 | Agent Loop+MCP | LLM自主决策 | 有向图状态机 | Harness+Handoffs | 顺序/层级编排 | 事件pub/sub |
| MCP支持 | ⭐⭐⭐ 原生 | ⭐⭐⭐ 1.0原生 | ⭐⭐ 社区适配 | ⭐⭐ 第三方桥接 | ⭐⭐ 社区适配 | ⭐⭐⭐ 原生v0.12 |
| A2A支持 | ⭐⭐ 早期支持 | ⭐⭐ 早期支持 | ⭐ 社区探索 | ⭐⭐ 早期支持 | ⭐⭐ 社区探索 | ⭐⭐⭐ 原生支持 |
| 状态管理 | 自动上下文 | 自动上下文 | 显式StateGraph | Harness内置 | 自动流转 | GroupChat状态 |
| 检查点 | ⭐⭐ SDK内置 | ⭐ 内置基础 | ⭐⭐⭐ 多后端 | ⭐ 内置基础 | ⭐ 简单内置 | ⭐⭐ 对话缓存 |
| 开源协议 | Apache 2.0 | Apache 2.0 | MIT | MIT | Apache 2.0 | Apache 2.0 |
| 生态绑定 | Claude/Anthropic | AWS/AWS Bedrock | LangChain | GPT/OpenAI | 独立/多模型 | 独立/多模型 |
9.2 性能基准数据对比
| 框架 | 多步任务准确率 | 平均延迟 | Token成本 | 适合规模 |
|---|---|---|---|---|
| LangGraph | 94% | 中等 | $0.08/任务 | 中大型复杂 |
| CrewAI | 87% | 较低 | $0.12/任务 | 中小型快速原型 |
| AG2 | 91% | 较高 | $0.45/任务 | 研究型/对话密集 |
| Claude Agent SDK | 92% | 中等 | $0.15/任务 | 工具密集型 |
| Strands Agents | 89% | 较低 | $0.10/任务 | AWS生态 |
| OpenAI Agents SDK | 90% | 较低 | $0.11/任务 | GPT生态快速落地 |
解读:LangGraph准确率最高但学习曲线陡峭;CrewAI最易上手但准确率偏低;AG2适合对话密集场景但成本最高;Claude/OpenAI SDK各自生态绑定最深。
9.3 学习曲线与开发效率对比
| 框架 | 上手时间 | 核心概念数 | 文档质量 | 首个Agent开发时间 |
|---|---|---|---|---|
| OpenAI Agents SDK | 最低(30分钟) | 4-5 | 良好 | 1-2小时 |
| CrewAI | 最低(30分钟) | 3-4 | 良好 | 1-2小时 |
| Strands Agents | 较低(1小时) | 3-4 | 良好 | 2-3小时 |
| Claude Agent SDK | 中等(2小时) | 5-6 | 优秀 | 3-4小时 |
| AG2 | 中等(2小时) | 5-6 | 良好 | 3-4小时 |
| LangGraph | 较高(4小时) | 8-10 | 优秀但量大 | 5-8小时 |
9.4 MCP集成能力对比
| 框架 | MCP支持等级 | 集成方式 | 工具发现 | 配置复杂度 |
|---|---|---|---|---|
| Claude Agent SDK | ⭐⭐⭐ 原生 | 配置文件直连 | 自动发现 | 低(JSON配置) |
| Strands Agents | ⭐⭐⭐ 原生 | 装饰器注册 | 自动发现 | 低(装饰器) |
| AG2 | ⭐⭐⭐ 原生 | v0.12+内置 | 自动发现 | 低 |
| LangGraph | ⭐⭐ 社区 | LangChain适配 | 手动注册 | 中(需写适配器) |
| OpenAI Agents SDK | ⭐⭐ 桥接 | 第三方适配 | 手动注册 | 中 |
| CrewAI | ⭐⭐ 社区 | crewai-tools适配 | 手动注册 | 中 |
9.5 选型决策指南
按团队技术栈选择:
- 你的团队深度使用 LangChain → 选 LangGraph(生态一致,无缝衔接)
- 你的团队深度使用 AWS → 选 Strands Agents(Bedrock原生集成)
- 你的团队深度使用 Claude → 选 Claude Agent SDK(MCP原生,体验最佳)
- 你的团队深度使用 GPT → 选 OpenAI Agents SDK(最简单的GPT Agent方案)
- 你的团队需要 独立/灵活 → 选 CrewAI 或 AG2(多模型支持)
按工作流复杂度选择:
- 简单Agent(1-3步任务)→ OpenAI Agents SDK / CrewAI(上手最快)
- 中等Agent(5-10步流程)→ LangGraph(状态管理最佳) / Claude Agent SDK(MCP生态丰富)
- 复杂Agent(多角色协作)→ AG2(对话驱动协作) / CrewAI(角色声明式) / LangGraph(图驱动)
按MCP生态需求选择:
- 重度MCP依赖(需要对接大量MCP Server)→ Claude Agent SDK / Strands Agents / AG2(原生支持)
- 轻度MCP使用→ 任意框架(社区适配够用)
其他框架代码速览:
Claude Agent SDK 示例:
python
"""
Claude Agent SDK ------ MCP原生集成示例
依赖:pip install anthropic
"""
import anthropic
client = anthropic.Anthropic()
# MCP Server配置(原生支持,无需适配层)
mcp_servers = {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"]
}
}
response = client.agents.run(
model="claude-sonnet-4-20250514",
system="你是一个高级软件工程师,擅长代码审查和架构设计。",
messages=[{"role": "user", "content": "审查src/目录下的Python文件,重点关注安全漏洞和代码风格"}],
mcp_servers=mcp_servers,
max_turns=50
)
print(response)
OpenAI Agents SDK 示例:
python
"""
OpenAI Agents SDK ------ Handoff协作示例
依赖:pip install openai(新版包含agents模块)
"""
from openai import agents
# 定义Agent和Handoff关系
researcher = agents.Agent(
name="研究员",
instructions="你负责搜索和收集信息。使用WebSearch工具。",
tools=[agents.WebSearchTool()],
handoffs=["分析师"] # 完成后可交接给分析师
)
analyst = agents.Agent(
name="分析师",
instructions="你负责分析信息,生成数据报告。",
tools=[agents.CodeInterpreterTool()],
handoffs=["审核员"]
)
# 运行Agent链
result = agents.Runner.run(
starting_agent=researcher,
input="调研2026年全球AI基础设施投资趋势",
max_turns=30
)
print(result.final_output)
AG2 示例:
python
"""
AG2 ------ GroupChat多Agent协作示例
依赖:pip install ag2
"""
from ag2 import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager
# 定义专职Agent
coder = AssistantAgent(
name="Coder",
system_message="你是一个Python专家,负责实现代码。",
llm_config={"model": "gpt-4o"}
)
reviewer = AssistantAgent(
name="Reviewer",
system_message="你是代码审查专家,负责检查代码质量。",
llm_config={"model": "claude-sonnet-4-20250514"}
)
executor = UserProxyAgent(
name="Executor",
human_input_mode="NEVER",
code_execution_config={"work_dir": "workspace"}
)
# GroupChat协作
group_chat = GroupChat(
agents=[coder, reviewer, executor],
messages=[],
max_round=12
)
manager = GroupChatManager(groupchat=group_chat)
# 启动协作
executor.initiate_chat(
manager,
message="实现一个FastAPI用户认证模块,包含注册、登录和JWT验证"
)
Strands Agents 示例:
python
"""
Strands Agents ------ AWS原生Agent示例
依赖:pip install strands-agents
"""
from strands import Agent, Tool
# 定义工具
@Tool(name="search_docs", description="搜索AWS文档")
def search_docs(query: str) -> str:
# 实际项目中调用AWS Knowledge Base
return f"关于'{query}'的AWS文档摘要..."
@Tool(name="deploy_service", description="部署服务到AWS")
def deploy_service(config: dict) -> str:
return f"服务已部署:{config.get('service_name')}"
# 创建Agent
agent = Agent(
model="us.anthropic.claude-sonnet-4-20250514-v1:0", # Bedrock模型ID
tools=[search_docs, deploy_service],
system_prompt="你是AWS DevOps专家,帮助用户部署和管理AWS服务。"
)
# 执行任务
result = agent("部署一个Lambda函数处理S3事件通知")
print(result)
9.6 选型决策树
#mermaid-svg-upritTOR3T0xYVET{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-upritTOR3T0xYVET .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-upritTOR3T0xYVET .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-upritTOR3T0xYVET .error-icon{fill:#552222;}#mermaid-svg-upritTOR3T0xYVET .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-upritTOR3T0xYVET .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-upritTOR3T0xYVET .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-upritTOR3T0xYVET .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-upritTOR3T0xYVET .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-upritTOR3T0xYVET .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-upritTOR3T0xYVET .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-upritTOR3T0xYVET .marker{fill:#333333;stroke:#333333;}#mermaid-svg-upritTOR3T0xYVET .marker.cross{stroke:#333333;}#mermaid-svg-upritTOR3T0xYVET svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-upritTOR3T0xYVET p{margin:0;}#mermaid-svg-upritTOR3T0xYVET .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-upritTOR3T0xYVET .cluster-label text{fill:#333;}#mermaid-svg-upritTOR3T0xYVET .cluster-label span{color:#333;}#mermaid-svg-upritTOR3T0xYVET .cluster-label span p{background-color:transparent;}#mermaid-svg-upritTOR3T0xYVET .label text,#mermaid-svg-upritTOR3T0xYVET span{fill:#333;color:#333;}#mermaid-svg-upritTOR3T0xYVET .node rect,#mermaid-svg-upritTOR3T0xYVET .node circle,#mermaid-svg-upritTOR3T0xYVET .node ellipse,#mermaid-svg-upritTOR3T0xYVET .node polygon,#mermaid-svg-upritTOR3T0xYVET .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-upritTOR3T0xYVET .rough-node .label text,#mermaid-svg-upritTOR3T0xYVET .node .label text,#mermaid-svg-upritTOR3T0xYVET .image-shape .label,#mermaid-svg-upritTOR3T0xYVET .icon-shape .label{text-anchor:middle;}#mermaid-svg-upritTOR3T0xYVET .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-upritTOR3T0xYVET .rough-node .label,#mermaid-svg-upritTOR3T0xYVET .node .label,#mermaid-svg-upritTOR3T0xYVET .image-shape .label,#mermaid-svg-upritTOR3T0xYVET .icon-shape .label{text-align:center;}#mermaid-svg-upritTOR3T0xYVET .node.clickable{cursor:pointer;}#mermaid-svg-upritTOR3T0xYVET .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-upritTOR3T0xYVET .arrowheadPath{fill:#333333;}#mermaid-svg-upritTOR3T0xYVET .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-upritTOR3T0xYVET .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-upritTOR3T0xYVET .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-upritTOR3T0xYVET .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-upritTOR3T0xYVET .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-upritTOR3T0xYVET .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-upritTOR3T0xYVET .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-upritTOR3T0xYVET .cluster text{fill:#333;}#mermaid-svg-upritTOR3T0xYVET .cluster span{color:#333;}#mermaid-svg-upritTOR3T0xYVET div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-upritTOR3T0xYVET .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-upritTOR3T0xYVET rect.text{fill:none;stroke-width:0;}#mermaid-svg-upritTOR3T0xYVET .icon-shape,#mermaid-svg-upritTOR3T0xYVET .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-upritTOR3T0xYVET .icon-shape p,#mermaid-svg-upritTOR3T0xYVET .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-upritTOR3T0xYVET .icon-shape .label rect,#mermaid-svg-upritTOR3T0xYVET .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-upritTOR3T0xYVET .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-upritTOR3T0xYVET .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-upritTOR3T0xYVET :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} LangChain深度使用
AWS深度使用
Claude深度使用
GPT深度使用
无绑定/多模型
简单1-3步
中等5-10步
复杂多角色
是
否
对话驱动
角色声明式
图驱动
选择Agent框架
团队已有技术栈?
LangGraph
⭐⭐⭐ 推荐
Strands Agents
⭐⭐⭐ 推荐
Claude Agent SDK
⭐⭐⭐ 推荐
OpenAI Agents SDK
⭐⭐⭐ 推荐
工作流复杂度?
CrewAI
⭐⭐ 上手最快
需要MCP原生?
协作模式?
AG2
⭐⭐⭐ MCP原生
LangGraph
⭐⭐⭐ 状态管理
AG2
⭐⭐⭐ GroupChat
CrewAI
⭐⭐⭐ 角色驱动
LangGraph
⭐⭐⭐ 显式控制
十、踩坑记录与最佳实践
10.1 8大常见误区澄清
| 误区 | 正解 | 影响 |
|---|---|---|
| Agent就是加了Function Calling的Chatbot | Agent核心是自主决策循环(ReAct),Function Calling只是执行手段 | 误解核心架构,设计出伪Agent |
| ReAct已过时,应该全用Plan-and-Execute | 三种模式各有适用场景,按任务复杂度选择 | 过度设计简单任务 |
| MCP只是另一种Function Calling格式 | MCP是工具生态的标准化协议,类比USB接口标准 | 误判MCP的生态价值 |
| Agent不需要记忆,上下文窗口够大就行 | 上下文窗口不是记忆,长期记忆让Agent跨会话积累经验 | Agent无法积累经验,每次从零开始 |
| Agent越多越好 | Agent数量取决于任务复杂度,简单场景2-3个就够 | 过多Agent增加协调成本和调试难度 |
| Tree of Thoughts一定更好 | ToT计算成本极高,简单任务反而不如直接推理 | 浪费算力,降低效率 |
| Agent应该完全自主,不需要人工介入 | 生产Agent必须在关键决策点支持人工审核 | 缺乏安全阀,输出失控 |
| 一次开发就够了,Agent不需要迭代优化 | Agent需要持续优化Prompt、工具、记忆策略 | 上线后质量持续下降 |
10.2 ReAct循环死循环防范
ReAct最危险的bug是死循环------Agent不断调用工具却永远不输出答案。
防范策略:
python
# 策略1:硬性步数限制(必须)
MAX_STEPS = 5 # 根据任务复杂度设置
# 策略2:重复检测(推荐)
def detect_loop(messages: list) -> bool:
"""检测是否陷入循环(连续两次调用相同工具和参数)"""
tool_calls = []
for msg in messages:
if hasattr(msg, 'tool_calls') and msg.tool_calls:
for tc in msg.tool_calls:
tool_calls.append(f"{tc.function.name}:{tc.function.arguments}")
if len(tool_calls) >= 2:
last_two = tool_calls[-2:]
if last_two[0] == last_two[1]:
return True # 陷入循环
return False
# 策略3:超时机制(生产必须)
import time
def react_with_timeout(query: str, max_steps: int = 5, timeout: int = 60) -> str:
"""带超时的ReAct执行"""
start_time = time.time()
messages = [{"role": "user", "content": query}]
for step in range(max_steps):
if time.time() - start_time > timeout:
return "执行超时,请简化任务或增加超时时间"
# ... 正常ReAct循环 ...
return "达到最大步数限制"
10.3 Prompt工程最佳实践
Agent的Prompt比Chatbot更关键------它直接决定了决策质量。
python
# ❌ 不好的Prompt(模糊、无约束)
BAD_PROMPT = "你是一个助手,可以调用工具完成任务。"
# ✅ 好的Prompt(明确角色、约束、决策规则)
GOOD_PROMPT = """你是一个数据分析助手,专门帮助用户查询和分析数据。
## 决策规则
1. 当用户问数据相关问题时,先调用数据查询工具获取真实数据
2. 不要基于训练数据猜测数据------永远先查询
3. 如果工具返回错误,告知用户并建议替代方案
4. 当收集到足够数据后,直接给出分析结论,不要再调用工具
## 输出格式
- 分析结论放在开头
- 数据支撑放在结论后面
- 如果数据不充分,明确标注"数据不完整"
"""
关键原则:
- 角色明确:告诉Agent它是谁、擅长什么、不擅长什么
- 决策规则:告诉Agent什么时候调用工具、什么时候停止
- 约束条件:告诉Agent什么不能做(安全边界)
- 输出格式:告诉Agent结果应该长什么样
10.4 工具调用错误处理
python
def safe_tool_call(func_name: str, func_args: dict, tool_map: dict) -> str:
"""安全的工具调用封装------统一错误处理"""
try:
if func_name not in tool_map:
return f"错误:未知的工具 '{func_name}',可用工具:{list(tool_map.keys())}"
func = tool_map[func_name]
result = func(**func_args)
return str(result)
except TypeError as e:
return f"工具参数错误:{e}。请检查参数格式。"
except ConnectionError as e:
return f"工具连接失败:{e}。请稍后重试或使用替代方案。"
except Exception as e:
return f"工具执行异常:{type(e).__name__}: {e}"
# 在Agent循环中使用
for tool_call in msg.tool_calls:
func_name = tool_call.function.name
func_args = json.loads(tool_call.function.arguments)
result = safe_tool_call(func_name, func_args, TOOL_MAP) # 安全调用
messages.append({"role": "tool", "tool_call_id": tool_call.id, "content": result})
10.5 成本控制策略
Agent的Token消耗是Chatbot的5-50倍------必须主动控制。
python
# 策略1:按任务复杂度选择模型
MODEL_SELECTION = {
"simple": "gpt-4o-mini", # 简单任务用便宜模型
"medium": "gpt-4o", # 中等任务用标准模型
"complex": "gpt-4o", # 复杂任务用强模型
"reflection": "gpt-4o", # 反思校验用强模型
}
# 策略2:限制最大步数
MAX_STEPS_BY_COMPLEXITY = {
"simple": 3, # 简单任务最多3步
"medium": 8, # 中等任务最多8步
"complex": 15, # 复杂任务最多15步
}
# 策略3:压缩历史消息(避免上下文膨胀)
def compress_messages(messages: list, max_tokens: int = 4000) -> list:
"""当消息过长时,压缩早期消息"""
total = sum(len(m.get("content", "")) for m in messages)
if total < max_tokens:
return messages
# 保留最近的消息,压缩早期消息为摘要
recent = messages[-4:] # 保留最近4条完整消息
early = messages[:-4]
# 将早期消息压缩为一条摘要
summary = f"[历史摘要:共{len(early)}条消息,主要涉及{len(set(m.get('role','') for m in early))}种角色]"
return [{"role": "system", "content": summary}] + recent
# 策略4:缓存工具结果(避免重复调用相同工具)
tool_cache = {}
def cached_tool_call(func_name: str, func_args: dict) -> str:
"""缓存工具调用结果"""
cache_key = f"{func_name}:{json.dumps(func_args, sort_keys=True)}"
if cache_key in tool_cache:
return tool_cache[cache_key] # 返回缓存结果
result = TOOL_MAP[func_name](**func_args)
tool_cache[cache_key] = result
return result
10.6 生产化部署建议
| 维度 | 开发环境 | 生产环境 |
|---|---|---|
| 模型选择 | 单一模型(gpt-4o) | 按复杂度路由多模型 |
| 步数限制 | 10-15步 | 5-8步 + 超时机制 |
| 错误处理 | print日志 | 结构化日志 + 告警 |
| 状态管理 | 内存 | 持久化(Redis/SQLite) |
| 人工介入 | 无 | 关键决策点interrupt |
| 成本监控 | 无 | Token计费 + 预算上限 |
| 安全边界 | 无 | Prompt注入防护 + 工具权限控制 |
| 测试 | 手动运行 | 单元测试 + 集成测试 + 回归测试 |
生产部署核心原则:
- 可观测:每一步执行都要有结构化日志,包括调用什么工具、传什么参数、返回什么结果、用了多少Token。
- 可控制:关键决策点必须支持人工审核(LangGraph的interrupt_before机制)。
- 可回溯:检查点机制让出错时可以回溯到之前的状态重新执行。
- 可限流:硬性的步数限制和超时机制,防止Agent失控。
十一、总结与展望
Agentic AI的三大核心要点
-
自主决策循环是核心:Agent不是"加了工具的Chatbot",核心差异在于自主决策循环------Agent自己判断下一步做什么、什么时候停止。ReAct是理解这个循环的起点。
-
架构模式按需选择:没有"万能模式"。ReAct适合简单任务,Plan-and-Execute适合中等任务,Reflect确保输出质量,Multi-Agent处理复杂协作。混合架构是生产标配。
-
基础设施决定上限:MCP让工具接入标准化,A2A让Agent协作标准化。它们不是可选组件,而是Agent生态的基础设施------就像USB和TCP/IP是硬件和互联网的基础设施。
未来趋势
- A2A互操作将成为标配:Google提出的A2A协议正在被越来越多框架采纳。未来,不同框架的Agent可以像不同品牌的手机一样互联互通。
- MCP生态统一工具接入:MCP正在成为事实标准。未来,开发者只需要实现一次MCP Server,所有Agent框架都能直接调用。
- 多框架混合部署:生产环境不会只用一个框架。LangGraph处理核心工作流,CrewAI处理外围协作,Claude Agent SDK处理MCP密集型任务------混合部署是必然趋势。
给开发者的建议
- 先手写,再用框架:理解底层原理是使用框架的前提。本文第五节的纯Python ReAct Agent只有50行代码,但它包含了Agent的核心循环。先跑通它,再去用框架。
- 从ReAct起步:不要一开始就尝试Multi-Agent。从单Agent ReAct开始,遇到瓶颈再升级架构模式。
- 重视质量校验:生产Agent必须有Reflect机制。没有质量校验的Agent,输出不可控。
- 成本先行:Agent的Token消耗是Chatbot的5-50倍。在开发阶段就要建立成本监控,不要等到上线才发现超预算。
- 选框架看生态,不只看特性:框架的MCP支持等级、A2A集成深度、社区活跃度,比功能列表更重要。
参考资料
- ReAct: Synergizing Reasoning and Acting in Language Models --- Yao et al., 2022
- Tree of Thoughts: Deliberate Problem Solving with Large Language Models --- Yao et al., 2023
- Model Context Protocol (MCP) Specification --- Anthropic, 2024
- Agent-to-Agent (A2A) Protocol --- Google, 2025
- LangGraph Documentation
- CrewAI Documentation
- AG2 (AutoGen) Documentation
- Claude Agent SDK Documentation
- OpenAI Agents SDK Documentation
- Strands Agents Documentation
如果这篇文章对你有帮助,欢迎点赞收藏关注。Agentic AI 是2026年最值得投入的技术方向------从理解到落地,这条路径值得每一个开发者走一遍。