智能体范式总览:从提示工程到自主系统
第 1 章 智能体范式总览:从提示工程到自主系统
如果一个系统能够用自然语言与你对话,它就是智能体吗?答案是否定的。能够生成流畅文本的聊天机器人(Chatbot)≠智能体(Agent);作为 IDE 插件在你键入时给出建议的 Copilot ≠智能体;甚至一个被精心编排的、单轮运行的 LangChain Pipeline,也不是智能体。判断一个系统是否真正属于"智能体范式"的关键,在于它是否同时具备自主目标分解、环境反馈闭环、工具调用决策这三项能力。本章将以这个判定准则为锚点,从概念边界、历史演化、认知架构、经典范式、工程实现五个维度,帮助你建立对"什么是 LLM Agent"的精确认知。
1.1 形式化定义与三组概念边界
在 AI 经典教材《Artificial Intelligence: A Modern Approach》(AIMA)中,Russell 与 Norvig 给出过一个被广泛引用的定义:智能体(Agent)是任何能够通过传感器(sensors)感知其环境(environment),并通过执行器(actuators)作用于该环境的实体。这个定义强调 "percept → action" 的闭环映射。在 LLM 时代,这个定义被自然延伸为:LLM Agent 是以大语言模型为认知核心、以自然语言作为主要交互协议、以外部工具与记忆系统为感知—执行扩展的智能体。
但工程语境中,三个词汇常被混用,需要厘清:
- **Agent(经典 AI 意义)**:泛指任何具备感知—行动能力的实体,行为可由规则、效用函数或学习模型驱动。从真空吸尘器 Roomba 到 AlphaGo 都属此范畴。
- **AI Agent**:特指以 AI 模型(不限于 LLM,也包括传统机器学习、强化学习模型)作为决策核心的 Agent。LLM Agent 是 AI Agent 的子集。
- **Agentic AI / Agentic System**:2024 年起流行的新词,强调"系统级涌现的自主性",常指多智能体协作或具备长期目标管理能力的架构。Anthropic 在 2024 年发布的 *Building Effective Agents* 论文中,曾刻意区分 "Agentic Workflow"(工作流)与 "Agent"(端到端自主系统)。
理解这一层区分,对于后续阅读文献、选型框架非常重要——当你看到 "Multi-Agent System" 时,它通常指多个 LLM Agent 通过消息总线协作;当你看到 "Agentic Workflow" 时,它更多指由人参与设计、由 LLM 节点串联的执行图。
1.1.1 系统性分类:Reactive / Deliberative / Hybrid
认知架构层面,Brooks 的包容体系结构(Subsumption Architecture)将 Agent 区分为三大流派,这一分类至今仍有效:
1. Reactive Agent(反应式):不维护内部世界模型,仅以"刺激—响应"对即时环境作出反应。经典案例如 Roomba,它的工作循环极简:撞墙 → 转弯 → 继续行走。在 LLM 时代,纯粹的 Reactive Agent 较少单独存在,但它构成了 Hybrid 架构中的"快路径"——例如异常检测、紧急停止等。 2. Deliberative Agent(审议式):维护显式的符号化世界模型,通过"规划(Planning)→ 搜索 → 执行"链条完成复杂任务。STRIPS、HAL 等经典规划系统是典型代表。LLM Agent 多采用 Deliberative 范式:模型先在"内心"展开推理(Thought Chain),再决定是否调用工具。 3. Hybrid Agent(混合式):上层审议、下层反应,结合两者优势。当代 LLM Agent 几乎全部是 Hybrid:LLM 充当审议层,工具回调、错误兜底则构成反应层。LangGraph、CrewAI 等框架的底层抽象都体现了这种混合思路。
值得注意的是,Hybrid 并不意味着"两个独立系统并存"——它可能只是一段 Prompt + 几行异常处理代码,外加一个工具描述清单。这种轻量级 Hybrid 实际上就是 MVP Agent 的全部复杂度。
1.2 演化脉络:从 Rule-based Bot 到 LLM-driven Agent
把 LLM Agent 看作"一夜之间出现的发明"是一种常见误解。它的工程范式经历了半个世纪的演进:
| 阶段 | 时间 | 范式 | 关键事件 / 系统 | |------|------|------|----------------| | Symbolic | 1966–1995 | 规则驱动 | ELIZA、MYCIN、SHRDLU | | Sub-symbolic | 1995–2012 | 搜索 + 学习 | DeepBlue、TD-Gammon | | Statistical NLP | 2011–2017 | 概率模型 | Watson、Siri 初代 | | Deep Learning | 2016–2020 | 端到端学习 | AlphaGo、AlphaZero、BERT | | Prompt-driven LLM | 2020–2022 | 提示工程 | GPT-3、InstructGPT | | Agentic LLM | 2022–至今 | 工具 + 推理 | ReAct、AutoGPT、BabyAGI、LangChain |
LLM 并没有"发明" Agent,它解决的是过去三十年悬而未决的认知核心问题——自然语言理解与开放式推理。在 GPT-3 之前,要构建一个能理解"帮我查一下上周关于芯片制裁的新闻并写一份摘要"这种模糊指令的组件,成本极高且效果脆弱。LLM 将这一组件的成本从数人年降至几乎为零,使 Agent 范式的门槛从研究机构下沉到普通开发者。
理解这一历史脉络有助于抓住一个核心判断:LLM Agent 的工程难点已经从"如何让模型理解自然语言"转移到"如何设计稳定的闭环控制、记忆管理、工具协议"。这也是本书后续章节的重心——我们将不再把大段篇幅花在 prompt 技巧上,而是聚焦于工程化、稳定性、可观测性、可扩展性。
1.3 五大经典范式深度对比
到 2024 年底,社区已沉淀出若干可被复现、可被理论分析的有影响力范式。本节挑选概念差异最大的五个展开讨论:ReAct、Reflexion、Plan-and-Execute、AutoGPT、BabyAGI。
1.3.1 ReAct:Reason + Act
ReAct(Yao et al., 2022)是大语言模型 Agent 范式的奠基性工作。它首创了将"推理(Reasoning)"与"行动(Acting)"在同一上下文中交错输出的机制。每次 LLM 调用,模型必须输出以下结构化字段之一:
``` Thought 1: 我需要先了解用户问的是什么。 Action 1: web_search Action Input 1: "上周 芯片 制裁 新闻" Observation 1: ... Thought 2: 从结果中提取关键事件。 Action 2: summarize Action Input 2: "..." Observation 2: ... Thought 3: 信息充分,可以给出最终答案。 Final Answer: ... ```
三个关键贡献使其成为后续所有范式的母体: 1. 可解释性:Thought 字段让推理过程对人类与系统都可审计。 2. 可中断性:任何一步都可以被人工、错误检测器或超时机制中断并替换。 3. 可重放性:完整的 Thought-Action-Observation 轨迹天然构成一条决策日志,为后续反思、强化学习提供数据。
ReAct 的局限在于:推理深度受上下文长度限制;当链条过长时容易出现"中途忘记目标"的现象,这正是后续 Reflexion 试图解决的问题。
1.3.2 Reflexion:引入自我反思
Reflexion(Shinn et al., 2023)在 ReAct 基础上增加了一个"自我评估 → 反思 → 长期记忆复用"环节。模型在每次任务完成后,会被要求生成一段 self-reflection:
``` Self-Reflection:
- 这次尝试的错误:在步骤 3 我错误地选择了 search_by_date 但缺少日期参数。
- 改进策略:下次应先用 extract_date 提取时间范围。
```
这条反思被写入长期记忆(通常是向量库或文件系统),下一次面对类似任务时被检索并注入 Prompt。Reflexion 在 HumanEval、HotpotQA 等基准上相较纯 ReAct 提升显著,但代价是 token 消耗增加 2–3 倍,且反思质量本身受模型能力限制——小模型做反思往往适得其反。
1.3.3 Plan-and-Execute:分离规划与执行
当任务复杂、需要长链路推理时,让一个 LLM 同时承担"规划"与"执行"两个角色容易导致上下文拥挤。Plan-and-Execute 范式将其拆为两个阶段:
- **Planner**(通常使用强模型,如 GPT-4):接收用户目标,产出一张子任务的有向无环图(DAG),每个节点包含 ID、依赖、输入、目标描述。
- **Executor**(可用弱模型,甚至简单函数):按拓扑序遍历 DAG,对每个节点调用对应工具,将结果回填。
这种分层的好处是显著的:可控性提升(Planner 输出可被人在回路中审核、修改);成本可优化(Planner 调用 GPT-4 仅一次,Executor 调用 GPT-3.5 数十次);失败定位更准(任意节点失败时,仅需重跑该子图)。LangChain 的 `PlanAndExecute` Agent、LlamaIndex 的 `QueryPipeline` 都属于这一家族。
其代价是:对 Planner 的要求极高——它必须对最终可达性有较强的先验,否则生成的 DAG 本身不可行。
1.3.4 AutoGPT:目标驱动的无人值守循环
AutoGPT(Significant Gravitas, 2023.3)是第一个引发广泛关注的开源 Agent 项目。它的核心抽象是:
``` while not goal_achieved(): think(current_state, memory, long_term_goals) decide(next_command) execute(command) observe(result) append_to_memory(result) self_critique() # 防止漂移 ```
AutoGPT 引入了若干此前未被重视的工程概念:长期目标向量、命令白名单(防止任意 shell 执行)、自我批评(防止目标漂移)。但它也暴露了 LLM Agent 的经典脆弱性:循环卡死、token 预算耗尽、上下文遗忘。在生产环境中,AutoGPT 几乎从不直接被部署,但它的设计语言(command、critique、long-term goal)深刻影响了后续框架。
1.3.5 BabyAGI:极简任务队列
BabyAGI(Yohei Nakajima, 2023.3)以约 600 行 Python 实现了类似 AutoGPT 的能力,但更聚焦"任务优先级动态排序"。其核心循环为:
1. 基于目标与历史结果,生成新任务。 2. 用 LLM 为任务排序。 3. 执行优先级最高的任务。 4. 基于结果"蒸馏"(distill)出新的洞察。 5. 回到第 1 步。
BabyAGI 证明了:Agent 不一定要复杂,它只需要"目标 → 任务队列 → 执行 → 反馈"的闭环。它的简化版至今仍出现在很多产品的最小实现里。
1.3.6 范式对比矩阵
| 维度 | ReAct | Reflexion | Plan-and-Execute | AutoGPT | BabyAGI | |------|-------|-----------|-------------------|---------|---------| | 推理深度 | 单次链 | 自反思增强 | DAG 结构化 | 长期目标 | 队列优先级 | | 长期记忆 | 无 | 有 | 可选 | 核心 | 核心 | | 规划显式度 | 隐式 | 隐式 | 显式 DAG | 隐式 | 半显式 | | 适用复杂度 | 中 | 中 | 高 | 高 | 中低 | | Token 成本 | 中 | 高 | 中(Planner 仅一次) | 极高 | 中 | | 工程可控性 | 高 | 中 | 极高 | 低 | 中 |
*表 1-1:五大经典 LLM Agent 范式对比维度*
实际工程中,纯范式极少被原样使用,更多做法是将多种范式的元素混合。例如:LangGraph 默认采用 Plan-and-Execute 的拓扑结构,但允许在每个节点内部嵌入 ReAct 的推理;AutoGen 中的 `AssistantAgent` 又被设计为可自反思。研究这些范式的真正价值,不在于"选一个",而在于看清它们各自解决了什么权衡,从而为自己的业务场景挑选子集组合。
1.4 最小可行智能体(MVP Agent)的五要素拆解
理论之后,让我们动手构建一个真正可运行的 Agent。本节定义一个 LLM Agent 不可省略的五要素,并以此搭建一个具备搜索与摘要能力的研究助手。
1.4.1 五要素:LLM、Prompt、Tools、Memory、Loop
| 要素 | 类比 | 职责 | |------|------|------| | LLM | 大脑 | 提供推理、语言理解、指令遵循能力 | | Prompt | 任务书 | 角色设定、输出格式契约、行为边界 | | Tools | 手脚 | 可被 LLM 调用的函数(搜索、计算、数据库) | | Memory | 记忆 | 短期(当前对话)+ 长期(跨会话、向量库) | | Loop | 神经回路 | 控制"何时思考 → 何时行动 → 何时停止"的执行节奏 |
这五要素虽不至于"缺一不可",但每一项缺失都会让系统的能力出现本质下降:没有 Tools 退化为聊天;没有 Memory 退化为单轮;没有 Loop 退化为一次性调用;Prompt 缺失则行为不可控;LLM 缺失则回到传统规则系统。
1.4.2 代码实现:研究助手 MVP
下面的代码实现了一个具备网页搜索与摘要能力的研究助手 Agent。它刻意只依赖 OpenAI SDK 与 DuckDuckGo 的 HTTP 端点,不依赖任何框架——目的是暴露底层循环。
```python import os import json import requests from openai import OpenAI
--- 1. LLM ---
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"]) MODEL = "gpt-4o-mini"
--- 2. Tools ---
def web_search(query: str, max_results: int = 3) -> str: """Search the web and return top results as plain text.""" try: r = requests.get( "https://duckduckgo.com/lite/", params={"q": query}, headers={"User-Agent": "Mozilla/5.0"}, timeout=10, ) text = r.text return text[:1500] except Exception as e: return f"SEARCH_ERROR: {e}"
TOOL_REGISTRY = { "web_search": web_search, }
--- 3. Prompt ---
SYSTEM_PROMPT = """You are a Research Assistant Agent. You have access to the following tools:
- web_search(query: str) -> str
Reply STRICTLY in one of these two formats each turn:
ACTION::: tool: web_search input: {"query": "<search query>"} END
FINAL::: <your final answer in Chinese, citing sources> END
Rules: 1. Plan briefly in 1 sentence before each action. 2. Prefer concrete, recent information. 3. When you have enough info, output FINAL. """
--- 4. Memory (short-term: messages list) ---
messages = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": "请帮我总结一下 2025 年 LLM Agent 框架的最新进展,并列出值得关注的三个项目。"} ]
--- 5. Loop ---
MAX_STEPS = 6 for step in range(MAX_STEPS): resp = client.chat.completions.create( model=MODEL, messages=messages, temperature=0.2, ) content = resp.choices[0].message.content messages.append({"role": "assist