Chapter 01

AI Agent 核心概念

理解 Agent 的本质:感知环境、自主规划、采取行动。从 ReAct 范式到 Plan-and-Execute、Reflexion 等现代架构,建立完整的心智模型。

什么是 AI Agent

AI Agent(智能体)是一种能够感知环境、自主规划并采取行动以完成目标的 AI 系统。与传统的单次 LLM 调用不同,Agent 具备持续迭代、使用工具、保持状态的能力。它不只是"回答问题",而是"完成任务"。

Agent(智能体)
能够自主感知输入、利用 LLM 进行推理规划、调用外部工具执行行动、并根据反馈迭代的软件系统。Agent 的关键特征是"自主性"——它能决定做什么,而不只是被动响应。2025 年的 Agent 定义进一步扩展:可以操作计算机、浏览器、代码编辑器等真实环境。
ReAct 框架(Reasoning + Acting)
2022 年 Google 提出的 Agent 范式(Yao et al. 2022),将 LLM 的推理过程(Thought)与行动(Action)、观察(Observation)交替进行,形成闭环循环。ReAct 证明:交织推理和行动比单独使用任一方式准确率高 34%(HotpotQA 基准)。这是目前主流 Agent 框架的核心思想基础。
Plan-and-Execute 架构
将 Agent 的工作明确分为两阶段:规划阶段(用推理模型一次性生成完整执行计划)+ 执行阶段(用快速模型逐步执行计划)。与 ReAct 的逐步局部规划相比,Plan-and-Execute 具有更强的全局视野,更适合需要 10+ 步骤的复杂任务。LangGraph 0.2+ 对此架构有原生支持。
Reflexion(反思迭代)
Shinn et al. 2023 年提出的自我改进框架:Agent 完成初步尝试后,让 LLM 对自己的输出进行批判性反思,生成改进方向,再次尝试。Reflexion 在 HumanEval 代码生成基准上比标准 ReAct 高出 11 个百分点。核心思想是把"错误"变成学习信号,而不是直接重试。
Tool Call(工具调用)
Agent 通过 LLM 输出结构化指令来调用外部函数、API 或服务的机制。现代 LLM 的 Function Calling / Tool Use 功能保证了工具调用的格式可靠性。工具调用是 Agent 连接真实世界的桥梁,使其能操作数据库、搜索网络、执行代码等。
MCP(Model Context Protocol)
Anthropic 2024 年发布的开放标准协议,用于统一 AI 模型与工具/数据源之间的连接方式。类似于 AI 世界的"USB-C 接口"——工具提供者按 MCP 规范实现服务端,任何支持 MCP 的 Agent 客户端都可以直接使用,无需为每个 LLM 单独适配。2025 年已成为主要 AI 框架的标准集成方式。
State(状态)
Agent 在多轮交互中维护的上下文信息,包括对话历史、任务进度、中间结果等。状态管理是构建复杂 Agent 的核心挑战之一。LangGraph 用 TypedDict 定义状态 schema,并通过 Reducer 函数(如 add_messages)控制每次更新的合并方式,避免状态意外覆盖。

感知—规划—行动 循环

所有 Agent 本质上都运行在一个三阶段循环中。理解这个循环,就理解了 Agent 的运作机制:

┌─────────────────────────────────────────────────────┐ │ 感知 - 规划 - 行动 循环 │ └─────────────────────────────────────────────────────┘ 用户目标 / 环境输入 │ ▼ ┌──────────────┐ │ 感 知 │ ← 接收输入:用户消息、工具返回、 │ Perceive │ 环境状态、历史记忆 └──────┬───────┘ │ ▼ ┌──────────────┐ │ 规 划 │ ← LLM 推理:分析目标、选择策略、 │ Plan │ 决定下一步行动(或结束) └──────┬───────┘ │ ▼ ┌──────────────┐ │ 行 动 │ ← 执行:调用工具、修改状态、 │ Act │ 输出结果给用户 └──────┬───────┘ │ ▼ 观察结果 → 是否完成? │ │ 未完成 完成 │ │ └──→ 回到感知 └──→ 返回最终答案

三大主流 Agent 架构对比

理解三种架构的设计哲学,才能在具体业务场景中做出正确选型:

架构 1:ReAct(逐步思考,局部视野) ───────────────────────────────────────────────────── 适合场景:简单查询任务(1-5步),需要实时获取信息 工作方式: Thought → Action → Observation → Thought → Action → Observation → ... → Finish 优点:简单、直接、延迟可控 缺点:无全局规划能力,步骤多时容易"迷路" 架构 2:Plan-and-Execute(全局规划,再执行) ───────────────────────────────────────────────────── 适合场景:复杂研究任务(5-20步),步骤间有依赖关系 工作方式: 规划器(推理模型)一次性生成完整计划 执行器(快速模型)按计划逐步执行 优点:路径最优、成本可预测、执行稳定 缺点:计划固定,无法应对意外的工具返回结果 架构 3:Reflexion(尝试→反思→改进) ───────────────────────────────────────────────────── 适合场景:高质量写作/代码/分析,允许多轮迭代 工作方式: 尝试(k次) → 自我批判 → 生成改进方向 → 再尝试 优点:输出质量高,自动修正错误 缺点:延迟高(多轮迭代),成本是基础版 3-5x

ReAct 范式代码实现

ReAct 的核心是:让 LLM 输出带 Thought/Action/Observation 格式的文本,解析后执行对应工具:

import anthropic
import json
from typing import Callable, Dict

client = anthropic.Anthropic()

# ── 工具定义:给 LLM 描述可用工具 ──────────────────────────
TOOLS = [
    {
        "name": "search_web",
        "description": "搜索互联网获取最新信息。用于查找事实、新闻、技术文档。",
        "input_schema": {
            "type": "object",
            "properties": {
                "query": {"type": "string", "description": "搜索查询词"}
            },
            "required": ["query"]
        }
    },
    {
        "name": "calculate",
        "description": "执行数学计算。用于算术、统计等精确计算。",
        "input_schema": {
            "type": "object",
            "properties": {
                "expression": {"type": "string", "description": "数学表达式,如 '2 ** 10'"}
            },
            "required": ["expression"]
        }
    }
]

# ── 模拟工具实现 ─────────────────────────────────────────
TOOL_IMPL: Dict[str, Callable] = {
    "search_web": lambda query: f"[搜索结果] {query}: 找到3篇相关文章...",
    "calculate": lambda expression: str(eval(expression, {"__builtins__": {}}))
}

def run_react_agent(user_query: str, max_iterations: int = 10) -> str:
    """ReAct Agent 主循环:思考→行动→观察,直到完成。"""
    messages = [{"role": "user", "content": user_query}]

    for iteration in range(max_iterations):
        # 调用 LLM,允许工具调用
        response = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=4096,
            tools=TOOLS,
            messages=messages
        )

        # 检查是否结束:stop_reason == "end_turn" 且没有工具调用
        if response.stop_reason == "end_turn":
            # 提取最终文字回复
            for block in response.content:
                if hasattr(block, "text"):
                    return block.text
            return "任务完成(无文字输出)"

        # stop_reason == "tool_use":执行工具调用
        tool_results = []
        for block in response.content:
            if block.type == "tool_use":
                tool_name = block.name
                tool_input = block.input
                tool_id = block.id

                # 查找并执行对应工具实现
                if tool_name in TOOL_IMPL:
                    result = TOOL_IMPL[tool_name](**tool_input)
                else:
                    result = f"工具 {tool_name} 不存在"

                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": tool_id,
                    "content": result
                })

        # 将工具结果追加到消息历史,形成 ReAct 闭环
        messages.append({"role": "assistant", "content": response.content})
        messages.append({"role": "user", "content": tool_results})

    return "达到最大迭代次数,任务未完成"

# 使用示例
answer = run_react_agent("搜索 Python 3.12 的新特性,并计算如果有 5 个特性,每个特性占比多少")
print(answer)
无限循环风险与防范

Agent 在没有进展时可能重复同样的工具调用。上面代码的 max_iterations=10 是关键安全阀——不能省略。生产环境还需要检测"重复工具调用"(相同工具+相同参数)并提前终止,避免无效消耗。

判断 Agent 是否陷入循环的方法:维护最近 N 次工具调用记录,若发现 ≥3 次完全相同的调用,强制终止并返回"无法完成"。

Reflexion 架构:从错误中学习

Reflexion 的核心思想是:Agent 不仅要"做",还要"反思"自己做得好不好,再"改进":

def reflexion_agent(task: str, max_reflections: int = 2) -> str:
    """
    Reflexion 三阶段循环:
    1. Actor:生成初步答案(用工具执行任务)
    2. Evaluator:评估答案质量(LLM 或规则)
    3. Self-Reflection:生成改进建议
    然后用改进建议作为额外上下文,再次尝试
    """
    reflection_history = []  # 积累历次反思内容

    for attempt in range(max_reflections + 1):

        # ── Stage 1: Actor(执行任务)────────────────────────
        context = ""
        if reflection_history:
            # 将历次反思作为额外上下文传入
            context = "\n之前的尝试和反思:\n" + "\n".join(reflection_history)

        actor_response = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=2000,
            messages=[{"role": "user",
                       "content": f"{context}\n\n任务:{task}"}]
        )
        current_answer = actor_response.content[0].text

        # ── Stage 2: Evaluator(评估质量)────────────────────
        if attempt == max_reflections:
            break  # 最后一次不再反思,直接返回

        eval_response = client.messages.create(
            model="claude-sonnet-4-6",
            max_tokens=500,
            messages=[{"role": "user",
                       "content": f"""评估以下答案的质量(0-10分),并指出具体不足:
任务:{task}
答案:{current_answer}

评估标准:准确性、完整性、逻辑清晰度
请简洁回答评分和改进方向(不超过100字):"""}]
        )
        evaluation = eval_response.content[0].text

        # 如果评分高(包含 "9" 或 "10"),提前终止
        if "9" in evaluation[:20] or "10" in evaluation[:20]:
            break

        # ── Stage 3: Self-Reflection(生成改进建议)─────────
        reflection = f"第{attempt+1}次尝试答案:{current_answer[:200]}...\n评估:{evaluation}"
        reflection_history.append(reflection)

    return current_answer

Agent 与 Chain 的本质区别

很多初学者混淆 LangChain 的 Chain(链)与 Agent(智能体),理解二者区别对于正确选型至关重要:

Chain(链)

  • 执行路径在编写时固定
  • 按预定顺序调用一系列步骤
  • 不能根据中间结果改变流程
  • 可预测性强,适合固定流程
  • 调试简单,延迟低且稳定
  • 成本完全可预测
  • 示例:RAG 查询链、摘要链

Agent(智能体)

  • 执行路径由 LLM 动态决定
  • 可根据观察结果选择不同工具
  • 能循环执行直到满足目标
  • 灵活性强,适合开放问题
  • 延迟高,步骤数不确定
  • 成本不确定,需要设置上限
  • 示例:研究助手、代码调试员
选型原则:Agent 不是越"智能"越好

如果任务步骤确定、路径可预测,优先使用 Chain;只有当任务需要动态决策时,才引入 Agent。Agent 引入了不确定性(结果可能因随机性不同)和更高的成本(多轮 LLM 调用),以及更难调试的黑箱行为。

一个常见的错误是:把简单的"如果满足条件 A 用工具 X,否则用工具 Y"的逻辑也做成 Agent,导致不必要的复杂性。这种确定性逻辑用 if-else 代码实现即可,比 Agent 更可靠且便宜 10 倍以上。

Agent 的能力边界

理解 Agent 的局限性与理解其能力同样重要,这避免过度设计和错误期望:

上下文窗口限制
所有工具调用的历史、中间结果都占用 Token。长任务很快耗尽上下文窗口(即使是 200K 的 Claude 也有限制)。需要摘要压缩(ConversationSummaryMemory)或分段处理策略。一个典型的 10 步研究任务可能消耗 50,000-100,000 Token。
幻觉与工具滥用
LLM 可能错误地调用工具(调用不存在的函数)、传入错误参数,或对工具结果做出错误解读。健壮的错误处理和工具结果验证不可省略。应对方法:工具描述要精确,在工具 description 中明确说明"何时使用"和"何时不应使用"。
无限循环风险
Agent 在没有进展时可能重复同样的工具调用。必须设置最大步骤数(max_iterations)和超时机制(timeout_seconds),以及"重复调用检测"。生产环境建议 max_iterations ≤ 15。
非确定性与测试困难
相同输入在不同运行中可能产生不同的工具调用序列,使得测试和调试比传统程序更困难。解决方案:将 temperature 设为 0(提高确定性),构建评估数据集(而非单次手动测试),使用 LangSmith 等可观测工具记录每次执行轨迹。

2024–2025 Agent 发展现状

近两年 Agent 领域经历了快速演进,以下是关键里程碑:

2023 Q1 AutoGPT 爆火,展示了 Agent 的可能性(但不稳定,失败率 >60%) 2023 Q2 LangChain Agent 普及,ReAct/MRKL 框架推广,生产可用性仍有限 2023 Q4 OpenAI 发布 Assistants API,内置工具调用与持久化线程 2024 Q1 LangGraph 发布,引入图结构状态机解决循环控制问题 2024 Q2 CrewAI 0.x 成熟,多 Agent 角色协作范式流行 2024 Q3 Claude 3.5 Sonnet 工具调用能力大幅提升,SWE-Bench 49% 2024 Q4 MCP 协议发布,统一 Agent 工具集成标准 AutoGen 0.4 重构,引入异步消息传递架构 2025 Q1 Agent 工作流编排成熟,LangGraph Cloud 上线 Claude 3.7 Sonnet 推出 Extended Thinking + 工具调用组合 2025 Q2 多模态 Agent(视觉+代码+搜索)进入生产,Computer Use 普及

Agent 的五大组成要素

一个完整的 Agent 系统由以下核心组件构成。后续章节将逐一深入讲解每个组件:

# Agent 系统的五大核心组件(概念示意)
from typing import TypedDict
from langchain_anthropic import ChatAnthropic
from langgraph.graph import StateGraph

# ── 组件 1:LLM 推理引擎 — Agent 的"大脑" ──────────────
# temperature=0 提高确定性,适合需要精确工具调用的场景
llm = ChatAnthropic(model="claude-sonnet-4-6", temperature=0)

# ── 组件 2:工具集合 — Agent 的"手" ──────────────────
# 每个工具需要清晰的 name、description、参数 schema
tools = [search_web, run_python, query_database, send_email]
llm_with_tools = llm.bind_tools(tools)  # 将工具绑定到 LLM

# ── 组件 3:记忆系统 — Agent 的"记忆" ────────────────
# 短期记忆:当前会话的消息历史(存在 State 中)
# 长期记忆:跨会话的持久化知识(存在数据库/向量库中)

# ── 组件 4:状态管理 — Agent 的"工作台" ──────────────
# TypedDict 定义状态 schema,Reducer 控制更新方式
class AgentState(TypedDict):
    messages: list          # 用 add_messages reducer 自动追加
    current_task: str       # 当前正在处理的任务
    tools_called: list      # 已调用的工具记录(防循环用)
    iterations: int         # 当前迭代次数(安全阀)

# ── 组件 5:编排逻辑 — Agent 的"神经系统" ────────────
# 决定何时思考、何时行动、何时停止
# LangGraph 用图结构表达,比命令式代码更直观
graph = StateGraph(AgentState)
graph.add_node("reason", reasoning_node)   # 推理节点
graph.add_node("act", action_node)         # 执行节点
graph.add_conditional_edges(               # 条件路由
    "reason", should_act_or_finish
)
本章小结

AI Agent 的核心 = LLM 推理 + 工具调用 + 状态管理 + 编排逻辑。三大主流架构:

选型原则:能用确定性代码实现的逻辑就不要用 Agent;Agent 只用于真正需要动态决策的场景。下一章深入 LangGraph,学习如何用状态图精确控制 Agent 的执行流程。