LLM 不是 Agent:先理解模型、推理与生成
LLM 不是 Agent:先理解模型、推理与生成
在聊天窗口里输入一句话,模型能分析需求、列计划、写代码。接上搜索和文件工具后,它还会查资料、改文件。用户只看到同一个输入框,很容易把背后的能力都算到 LLM 头上。
但程序如果在模型返回第一条结果后停止,任务也就停了。工具不会自己执行,任务进度没人保存,结果也没人检查。模型只完成了一次生成。
我更愿意把 LLM 看作 Agent 系统里的“决策部件”。它负责判断下一步做什么,周围还需要一套系统把判断变成行动。
先把三层拆开
我们常用的聊天产品,通常已经把对话历史、文件解析、搜索、代码执行和安全检查包在一起。界面很简单,组件之间的分工也因此不容易看见。
拆开来看,大致有三层:
| 层次 | 做什么 | 输入 | 输出 |
|---|---|---|---|
| 模型 | 根据当前内容继续生成 | Token 序列 | 新 Token 或结构化结果 |
| 模型服务 | 提供模型调用接口 | Request | Response、用量、结束状态 |
| Agent 系统 | 管理任务、工具、状态和权限 | 用户目标、环境状态 | 任务结果、执行记录 |
模型服务和 Agent 系统可能由同一个产品提供,代码里甚至只要调用一个 SDK。但状态仍要保存,工具仍要执行,失败也得处理,只是产品把这些工作藏了起来。
下面这张图记录了一次真实的任务执行。用户提交 Prompt 后,第一次 LLM Call 决定调用终端。Runtime 执行命令,再把终端返回值和 Session 里的信息组装成下一次输入。如此循环,直到第四次 LLM Call 给出最终结果。

注:这里使用的是 Hermes Agent,一轮完整交互会被包装在一次 Hermes Turn 中。
LLM 在一次调用里做了什么
在上面的任务流程中,每个 LLM Call 都代表一次模型调用。主流 LLM 大多基于 Transformer 及其后续架构。生成文本时,模型根据已有 Token 计算下一个 Token 的概率分布,选出一个结果,再继续生成。
已有 Token
↓
计算下一个 Token 的概率
↓
选择并追加 Token
↓
继续,直到停止
这段计算叫 Inference,中文通常译作“推理”。这里的“推理”是指模型接收输入并完成计算,不等于用户交代的事情已经办完。
如果只调用裸模型,可以输入:
请根据官方文档比较三个 Agent Runtime。
模型会根据当前上下文和训练得到的参数生成回答。它不会主动创建研究项目,也不会花几个小时阅读官网,再带着核验过的资料回来。要做到这些,外部系统必须提供工具,并在第一次生成结束后继续驱动任务。
同一份输入也未必得到相同结果。模型计算出的是概率分布,解码时可以选择最高概率项,也可以从候选项中采样。Temperature、top-p 等参数会改变选择范围。Temperature 升高时,低概率候选通常更容易出现,输出可能更丰富,也可能跑偏。把 Temperature 简单理解成“创造力旋钮”并不准确。
模型返回的是生成结果,不是经过验收的事实。内容是否真实、能否满足业务要求,还得另外检查。
一次 Inference 结束,模型的计算也随之停止。要继续推进任务,外部系统得保存状态、执行工具,再次调用模型。
什么时候才开始像 Agent
聊了多少轮,不能用来判断系统是不是 Agent。连续聊十轮,也可能只是应用反复把旧消息交给模型。
系统根据模型的输出采取行动,再把环境返回的结果交给模型,这才形成 Agent Loop:
任务
↓
模型决定下一步
↓
系统执行工具
↓
环境返回结果
↓
更新状态
↓
继续或结束
每一轮里,模型判断下一步做什么,外部程序执行动作,并决定是否继续。后面的文章会分别讨论 Tool Calling、State 和 Runtime,这里先说清楚它们与模型的分工。
更强的模型也救不了坏掉的系统
模型即使正确判断出“应该先看官方文档”,系统仍可能出错。
系统可能没有搜索工具,也可能读到过期页面。工具超时后如果只会反复重试,费用会不断增加。没有验收规则,缺少引用的报告也可能被直接交付。换一个参数更多的模型,解决不了这些故障。
| 问题 | 主要由谁负责 |
|---|---|
| 理解要求、提出下一步 | 模型 |
| 获取网页、文件和数据库内容 | 工具与环境 |
| 保存进度、处理超时和恢复 | Runtime |
| 判断结果能否交付 | 验收规则与权限系统 |
模型能力会影响 Agent 能做什么,而任务能否稳定完成,还取决于模型之外的系统。
C01:让裸模型做一次技术调研
这个系列会逐步实现一个“技术调研与报告交付 Agent”。在 C01 中,我关闭搜索,不保存任务状态,也不验证结果,只发出下面这条请求:
调研三个主流 Agent Runtime,根据官方文档比较它们的状态管理、持久化、人工审批和可观测性,并给出选型建议。
如果你用 Hermes Agent,或者在已经具备工具能力的应用中测试,可以改用下面这段指令:
你现在处于 DIRECT_INFERENCE 模式。
规则:
- 只回答 <user_instruction> 中的内容;
- 只进行一次模型生成;
- 禁止工具调用、任务委派、Memory 检索、文件读取和网络访问;
- 禁止创建计划或建议自己稍后继续执行;
- 缺少信息时,明确说明无法从当前输入确定,不得调用外部能力补全;
- 输出中只包含最终答案。
<user_instruction>
调研三个主流 Agent Runtime,根据官方文档比较它们的状态管理、持久化、人工审批和可观测性,并给出选型建议。
</user_instruction>
模型给出了一篇结构完整的答案,比较维度乍看也合理。但只看这份输出,我无法确认:
- 它依据的是哪一版资料?
- 关键结论来自哪里?
- 它有没有读过当前官方文档?
- 信息不够时,谁负责继续调查?
- “调研完成”由谁判断?
一次模型调用无法回答这些问题。
本次裸模型调用的输出如下:

C01 的能力缺口
| 调研要求 | 裸模型能做什么 | 还缺什么 |
|---|---|---|
| 理解主题 | 提炼比较维度 | 明确的任务范围和验收条件 |
| 获取当前资料 | 根据训练参数生成内容 | 搜索、读取工具 |
| 记录证据 | 在文本里写引用 | 可追踪的证据存储 |
| 持续推进 | 描述后续计划 | 循环和任务状态 |
| 交付报告 | 生成正文 | 文件写入、验证和发布权限 |
这次实验说明,裸模型能梳理问题,也能生成正文。C01 关注的是:模型回答一次之后,系统还缺哪些部件,才能把调研真正做完。
几个容易混淆的地方
多轮聊天最容易被误认成 Agent。应用可能只是在反复提交历史消息,没有工具,也没有独立的任务状态。
Tool Call 只是一份调用请求。模型生成函数名和参数后,网络请求、数据库查询或文件写入仍由 Runtime 完成。
Context 更长,只说明模型本次调用能读取更多内容。信息是否长期保存、何时更新或删除,取决于 Memory 的设计。
计划也可能只是一段文本。模型写下“先搜索,再比较,最后写报告”之后,仍要由工具执行,由状态记录进度,再由 Runtime 判断何时停止。
小结
LLM 读取当前上下文,完成一次 Inference 并返回结果。模型服务承载这次调用。Agent 系统负责执行工具、保存进度、处理权限,以及判断任务是否结束。
后面讨论 Agent Loop 时还会反复碰到这条边界:模型给出下一步,Runtime 执行动作,并处理动作对真实环境的影响。
下一篇先把一次模型调用拆开,看看 Request、Context、Inference 和 Response 各自处在哪里。
案例实践
- 使用不带搜索和工具的模型执行 C01 提示。
- 保存输入、模型标识、参数、调用时间和原始输出。
- 标出回答里的实时事实、无来源主张和无法核验的结论。
- 按“任务、工具、证据、状态、验收”整理能力缺口。
- 确认聊天产品没有在后台启用搜索或文件工具。
参考资料
- Attention Is All You Need:Transformer 架构原始论文。
- Google Machine Learning Crash Course:Transformers:Transformer 架构与工作方式的入门说明。
- OpenAI Agents SDK:Agents:Agent 的模型、Instructions、Tools、Guardrails、Handoffs 和 Runtime 行为。
- OpenAI Agents SDK:Running agents:Runner 与 Agent Loop 的职责。
- Anthropic:Building effective agents:Workflow、Agent 与增强模型的边界。
- Hugging Face Transformers:Generation strategies:文本生成与解码策略。