🤖 什么是 Agent
从「调用一次 LLM」到「让 LLM 自主完成多步任务」——理解 Agent 的本质,以及它与普通 LLM 应用的关键区别。
本章目标
- 说清楚 Agent 与「单次 LLM 调用」「Chain(链)」的根本区别
- 掌握 Agent 的三个核心能力:推理、行动、记忆
- 理解「控制权反转」——由谁来决定下一步做什么
- 建立贯穿全教程的统一术语,为后续源码学习打下锚点
为什么「只用 LLM」不够
大语言模型(LLM)本身的能力边界很明确:
- 它只能基于训练数据"说话"——不知道你私有的、实时的、本地文件里的信息。
- 它不能产生副作用——不能发邮件、不能查数据库、不能运行代码、不能改文件。
- 它一次性回答就结束——不会根据执行结果调整后续动作。
所以,一个能真正"做事"的系统,必须把 LLM 当作决策大脑,外面套一层能感知环境、执行动作、循环思考的框架。这个整体,就叫 Agent(智能体)。
Agent = 一个以 LLM 为大脑、能在循环中自主决定"下一步做什么"并调用工具执行的系统。
三种形态的对比
把 AI 应用按"控制权"递进来看,最容易理解 Agent 的定位:
| 维度 | 单次 LLM 调用 | Chain 链 | Agent 智能体 |
|---|---|---|---|
| 谁决定流程 | 程序员 | 程序员(写死步骤) | LLM(运行时决定) |
| 执行步数 | 1 步 | 固定 N 步 | 不固定,直到完成 |
| 能否用工具 | 否 | 可(但顺序固定) | 可,且自己选哪个 |
| 能否根据结果调整 | 否 | 有限(条件分支) | 能,每步都重估 |
| 典型例子 | 翻译一句话 | RAG 问答 | "帮我查最近订单并退款" |
Chain 的流程是程序员在代码里写死的(先检索、再拼接、再问 LLM);Agent 的流程是LLM 自己在运行时决定的(它看到工具结果后,自己判断"还要不要再查一次""是不是可以结束了")。这条界线是 Agent 的灵魂,后面所有框架(LangChain 的 AgentExecutor、LangGraph 的图、OpenCode 的 runLoop)都是围绕它设计的。
Agent 的三个核心能力
无论哪个框架,一个 Agent 都具备这三项能力,缺一不可:
1. 推理(Reasoning)
LLM 接收当前状态(用户目标 + 已完成的步骤 + 工具结果),输出"下一步该做什么"的判断。这个判断可能是:
- "我需要调用
search工具查一下 X" - "我已经拿到足够信息,可以回答用户了"
- "上一步出错了,我应该换个方式重试"
2. 行动(Acting / Tool Use)
把 LLM 的判断翻译成对工具的实际调用,并拿到返回结果(observation)。工具可以是任意东西:搜索引擎、数据库查询、代码执行、文件读写、发 HTTP 请求……
3. 记忆(Memory)
记住到目前为止发生了什么,这样 LLM 在下一步推理时才有完整上下文。记忆分两层:
- 短期记忆:当前这次任务的对话历史和工具结果(放 prompt 里)。
- 长期记忆:跨任务持久化的状态(通常存数据库/向量库)。
源码中的 Agent 定义
这三个能力的循环,在 LangChain 源码里有一段非常精炼的官方定义。我们提前看一眼(这会在 LC7 章精读):
Agents use language models to choose a sequence of actions to take.
A basic agent works in the following manner:
1. Given a prompt an agent uses an LLM to request an action to take
(e.g., a tool to run).
2. The agent executes the action (e.g. runs the tool), and receives an observation.
3. The agent returns the observation to the LLM, which can then be used to generate
the next action.
4. When the agent reaches a stopping condition, it returns a final return value.
把这段话翻译成数据结构,就是 Agent 循环里的两个核心状态:「要继续行动」和「可以结束了」。在 LangChain 源码里对应两个类:
class AgentAction(Serializable):
"""代表「要执行某个工具」的请求 —— 循环继续"""
tool: str # 要调用的工具名
tool_input: str | dict # 传给工具的参数
log: str # LLM 的原始输出,用于审计
type: Literal["AgentAction"] = "AgentAction"
class AgentFinish(Serializable):
"""代表「到达停止条件」的最终返回 —— 循环结束"""
return_values: dict # 最终返回给用户的结果
log: str
type: Literal["AgentFinish"] = "AgentFinish"
现在你只需要记住:Agent 循环 = 在「AgentAction(继续)」和「AgentFinish(终止)」之间反复判断。这个二态判定,是 LangChain、LangGraph、OpenCode 三套实现共同的骨架。等学到 LC7、LG8、OC2 时,你会发现它们都在用不同方式实现这同一个循环。
Agent 的常见分类
按 LLM 决定动作的"风格",业界有几种经典范式,后面源码里都会遇到:
| 范式 | 核心思想 | 在本教程哪里学 |
|---|---|---|
| ReAct | Reason + Act 交替:先思考(Thought)再行动(Action),观察结果(Observation)后再思考 | F3 理论 / LG8 create_react_agent |
| Tool Calling | 直接用 LLM 原生的 function calling 能力选工具,不再用文字推理 | LC8 create_tool_calling_agent |
| Plan-and-Execute | 先全局规划再分步执行,适合长任务 | OpenCode 的 plan 模式(OC5) |
为了后面读源码不卡壳,先混个眼熟(现在记不住没关系,用到时回来查):
- Observation(观察):工具执行返回的结果,会喂回给 LLM。
- Tool Call(工具调用):LLM 输出的"要调用某工具"的结构化指令。
- Scratchpad(草稿区):把历史思考+行动+观察拼成的一段文本,作为下次推理的输入。
- State(状态):LangGraph 里的核心概念,承载整个任务过程中流转的数据。
- Checkpointer(检查点):把状态存盘,让 Agent 能中断/恢复(人在回路的基础)。
小结
- Agent 的本质是把 LLM 从"答题器"升级为"自主决策的执行体",关键在于控制权从程序员转移到 LLM。
- 三个核心能力:推理(决定下一步)、行动(执行工具)、记忆(保留上下文)。
- 循环骨架是 AgentAction ↔ AgentFinish 的二态判定——这是贯穿三大框架的统一锚点。
下一章 F2 · LLM 调用解剖,我们钻进 LLM 本身,搞懂 token、context window、工具调用(function calling)的底层机制——这是理解 Agent "推理"和"行动"能力的物理基础。