【大模型专题】Agentic AI 实战指南 — 从 ReAct 到多智能体协作的完整落地路径

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落地元年? 三大驱动力已经交汇:

  1. 用户需求升级:用户不需要更会聊天的AI,需要能干活的AI。"帮我做"比"帮我查"有价值10倍。
  2. 企业落地诉求:企业的核心诉求是自动化------让AI把流程跑通,而不是让AI写更多的邮件模板。
  3. 模型能力溢出: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 多角色分工协作 专业化、可并行、扩展性强 协调复杂、通信开销、调试难 大型业务流程、多领域协作

新手学习路径建议

  1. 第一步:理解ReAct,手写最小Agent(本文第五节有完整代码)
  2. 第二步:学LangGraph,构建状态化工作流(本文第六节)
  3. 第三步:学CrewAI,体验多角色协作(本文第七节)
  4. 第四步:尝试混合架构,组合多种模式(本文第八节)

模式选择原则

任务难度 推荐模式 理由
简单任务(单步工具调用) 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/中间结果缓存 单次任务执行期间 存储中间计算结果

一个常见误区:上下文窗口够大就不需要记忆系统了?错。上下文窗口是短期记忆,它有三个硬限制:

  1. 容量限制:即使128K窗口,复杂任务也会溢出
  2. 跨会话断裂:新会话开始,所有上下文归零
  3. 检索效率:大窗口里的信息,模型不一定能精准定位

长期记忆通过向量数据库解决这些问题------把关键信息持久化存储,按语义相关性检索,跨会话复用。

记忆系统配置示例

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核心能力

  1. 能力发现:Agent发布Agent Card,其他Agent据此发现可用能力
  2. 任务委派:调度Agent将子任务委派给最合适的专职Agent
  3. 并行协作:多个Agent同时执行不同子任务,异步返回结果
  4. 状态同步: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", ...})

三个关键点

  1. 自主决策:模型自己决定调用哪个工具、传什么参数。不是硬编码的"先查北京再查上海",而是模型根据问题自主推理出的行动序列。
  2. 观察驱动:每次工具调用的结果都追加到对话历史,模型基于观察结果继续推理。
  3. 停止条件 :模型判断"信息足够"时停止调用工具,直接输出答案。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表示继续执行,不传入新状态

为什么检查点重要?

  1. 断点续传:Agent工作流可以暂停,人工确认后继续。避免Agent自行做出关键决策。
  2. 状态回溯:出错时可以回到之前的状态重新执行,而不是从头开始。
  3. 多会话协作:不同用户可以在不同时间点介入同一个工作流。

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的执行流程简洁明了:

  1. 任务分配 :Crew按顺序分配任务。research_task先分配给researcher
  2. Agent执行:researcher使用搜索工具收集信息,输出研究笔记。
  3. 上下文传递 :研究笔记自动传递给write_taskcontext参数。
  4. 接力执行: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 代码详解

混合架构的三个关键设计

  1. 复杂度路由classify_complexity在任务入口判断复杂度,动态选择执行模式。这避免了"用重型模式处理简单任务"的资源浪费,也避免了"用简单模式处理复杂任务"的风险。

  2. 模式组合:ReAct处理简单任务,Plan-and-Execute处理中等任务,Multi-Agent处理复杂任务。每种模式发挥各自优势。

  3. 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方案)
  • 你的团队需要 独立/灵活 → 选 CrewAIAG2(多模型支持)

按工作流复杂度选择

  • 简单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. 当收集到足够数据后,直接给出分析结论,不要再调用工具

## 输出格式
- 分析结论放在开头
- 数据支撑放在结论后面
- 如果数据不充分,明确标注"数据不完整"
"""

关键原则

  1. 角色明确:告诉Agent它是谁、擅长什么、不擅长什么
  2. 决策规则:告诉Agent什么时候调用工具、什么时候停止
  3. 约束条件:告诉Agent什么不能做(安全边界)
  4. 输出格式:告诉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注入防护 + 工具权限控制
测试 手动运行 单元测试 + 集成测试 + 回归测试

生产部署核心原则

  1. 可观测:每一步执行都要有结构化日志,包括调用什么工具、传什么参数、返回什么结果、用了多少Token。
  2. 可控制:关键决策点必须支持人工审核(LangGraph的interrupt_before机制)。
  3. 可回溯:检查点机制让出错时可以回溯到之前的状态重新执行。
  4. 可限流:硬性的步数限制和超时机制,防止Agent失控。

十一、总结与展望

Agentic AI的三大核心要点

  1. 自主决策循环是核心:Agent不是"加了工具的Chatbot",核心差异在于自主决策循环------Agent自己判断下一步做什么、什么时候停止。ReAct是理解这个循环的起点。

  2. 架构模式按需选择:没有"万能模式"。ReAct适合简单任务,Plan-and-Execute适合中等任务,Reflect确保输出质量,Multi-Agent处理复杂协作。混合架构是生产标配。

  3. 基础设施决定上限:MCP让工具接入标准化,A2A让Agent协作标准化。它们不是可选组件,而是Agent生态的基础设施------就像USB和TCP/IP是硬件和互联网的基础设施。

未来趋势

  • A2A互操作将成为标配:Google提出的A2A协议正在被越来越多框架采纳。未来,不同框架的Agent可以像不同品牌的手机一样互联互通。
  • MCP生态统一工具接入:MCP正在成为事实标准。未来,开发者只需要实现一次MCP Server,所有Agent框架都能直接调用。
  • 多框架混合部署:生产环境不会只用一个框架。LangGraph处理核心工作流,CrewAI处理外围协作,Claude Agent SDK处理MCP密集型任务------混合部署是必然趋势。

给开发者的建议

  1. 先手写,再用框架:理解底层原理是使用框架的前提。本文第五节的纯Python ReAct Agent只有50行代码,但它包含了Agent的核心循环。先跑通它,再去用框架。
  2. 从ReAct起步:不要一开始就尝试Multi-Agent。从单Agent ReAct开始,遇到瓶颈再升级架构模式。
  3. 重视质量校验:生产Agent必须有Reflect机制。没有质量校验的Agent,输出不可控。
  4. 成本先行:Agent的Token消耗是Chatbot的5-50倍。在开发阶段就要建立成本监控,不要等到上线才发现超预算。
  5. 选框架看生态,不只看特性:框架的MCP支持等级、A2A集成深度、社区活跃度,比功能列表更重要。

参考资料


如果这篇文章对你有帮助,欢迎点赞收藏关注。Agentic AI 是2026年最值得投入的技术方向------从理解到落地,这条路径值得每一个开发者走一遍。