AI Agent 没有魔法
10 行代码
AI Agent 的核心逻辑,用伪代码写出来大概是这样:
while not done:
response = model.chat(messages, tools=tool_definitions)
if response.has_tool_call:
result = execute_tool(response.tool_call)
messages.append(result)
continue
else:
print(response.text)
done = True一个循环。模型输出 JSON,客户端执行,结果喂回去,重复。这就是所有 Agent 产品底层的样子——Claude Code、Cursor、AutoGPT,没有例外。
模型只会输出文本
Function calling 听起来像模型在"调用函数"。实际上模型从来没碰过任何函数。
整个过程是这样的:客户端启动时,把工具的定义(名字、参数 schema、功能描述)作为文本发给模型。模型看到这些描述,在合适的时候输出一段 JSON:
{"name": "Read", "arguments": {"file_path": "/src/app/page.tsx"}}客户端收到这段 JSON,解析它,真正去读文件,然后把文件内容作为文本返回给模型。模型再根据这些内容决定下一步。
模型从头到尾只做一件事:根据上下文预测下一个 token。它不知道什么是文件系统,不知道什么是 shell,甚至不知道自己输出了 JSON。它只是在续写最合理的文本。
这个能力不是天生的。原始模型拿到工具定义后可能会输出格式错误的 JSON、在不该调用时乱调用、或者该调用时自己编答案。需要经过三个阶段的训练:
Supervised Fine-tuning 用标注数据教基本格式——什么时候该调、调哪个、参数怎么填。RLHF 教更好的判断——多个工具选最合适的,能不调就别调。Constrained decoding 在推理时加一层保障,只允许生成符合 JSON schema 的 token,保证输出格式一定合法。
三层训练下来,模型学会了"看到工具描述 → 输出正确的 JSON"这个模式。但本质没变,还是 next token prediction。
一次请求在 GPU 上发生了什么
理解 Agent 为什么要这样设计,需要先理解模型推理的物理过程。
一个请求进来,经历两个阶段。
第一个阶段叫 Prefill。用户的整个输入(prompt + 工具定义 + 历史对话)被一次性送进 Transformer 所有层,并行计算。这一步是 compute-bound,GPU 算力拉满。计算完会产出一份 KV Cache——把对输入的"理解"存起来,后面不用重复算。
第二个阶段叫 Decode。模型开始一个 token 一个 token 地生成输出。每一步只对最新一个 token 做 forward pass,利用 KV Cache 避免重复计算之前的 token。输出一个 token 后,把它的 KV 追加到 Cache 里,再生成下一个。
Decode 是 memory-bandwidth-bound。每个 token 的生成都要读取巨大的 KV Cache,但只做极少计算。所以生成速度瓶颈在显存带宽,不在算力。
一个类比:Prefill 是读完题目,Decode 是一个字一个字写作文,KV Cache 是不用反复读题,记住就行。
吞吐量的优化靠 Continuous Batching。不是一次只处理一个请求,而是把多个请求的 token 拼在一起同时算。请求 A 在 decode 第 15 个 token,请求 B 刚到在 prefill,请求 C 做完了被移出,换请求 D 进来。动态调度,让 GPU 始终满载。
流式返回就是每生成一个 token 就推一个给客户端。用户看到第一个字的速度取决于 TTFT(Time To First Token,即 Prefill 耗时),之后每个字出来的速度取决于 TPS(Tokens Per Second,受显存带宽限制)。
Agent = 模型 + 工具 + 循环
把前面两节串起来:模型会输出结构化 JSON,客户端会执行工具,把这两个放进一个循环,就是 Agent。
但能跑和好用之间差了六个能力。
规划。 拿到目标后能拆解成可执行的步骤。不是上来就写代码,而是先看项目结构,再决定怎么改,改完验证。没有规划的 Agent 会像无头苍蝇。
工具使用。 知道自己有什么工具,什么时候该用哪个。用户说"修复 build 报错",应该先 Bash 跑 build 看报错,再 Read 看出错的文件,然后 Edit 修改,最后再 Bash 验证。不是先 Read 所有文件。
记忆。 三层:短期记忆是对话上下文,知道刚才做了什么;长期记忆是跨会话的偏好和项目知识;工作记忆是当前任务的进度状态。Claude Code 里的对话历史、MEMORY.md、TaskList 分别对应这三层。
纠错。 遇到失败能自己调试、换方法。build 报错,看报错信息,改代码,再 build,还报错,再分析,换一种改法。不是同一个错误重试十次。
自主决策。 不需要人一步步指挥。先读哪个文件、改一处还是重构多处、要不要跑测试、什么时候算做完——这些都是模型自己判断。
终止判断。 知道什么时候该停。目标完成了就停,遇到无法解决的问题就问用户。不会改完代码不验证就停,也不会永远觉得"还能再优化"。
这六个能力里,规划决定上限,纠错决定下限,记忆决定能处理多复杂的任务。
为什么现在才可用
Agent 这个概念不新。2023 年 AutoGPT 就火了,但当时的模型做 Agent 有明显的问题:调错工具、忘记目标、死循环、不知道什么时候该停。
不是 Agent 的架构不行,是模型不够好。
现在的变化是:上下文窗口从 4K 到 200K,模型能记住完整的操作过程了。工具调用经过专门训练,准确率高了。推理能力上来了,能规划多步任务,能从错误中恢复。这些改进叠加在一起,才让"模型 + 工具 + 循环"这个简单的架构真正可用。
所以回到开头那 10 行伪代码。Agent 没有什么魔法,底层就是 next token prediction 加上一个执行循环。让人觉得"智能"的,是训练后模型在规划、判断、纠错上的表现,不是什么新的技术突破。
← All posts