Agent 是怎么工作的:架构、上下文与压缩
Agent 是一个循环:LLM(上下文 + 工具)→ 行动 → 环境反馈 → 继续 / 终止。
从「确定性」到「自主性」
要理解 Agent,先要分清它和另一种东西——Workflow。Workflow 是预定义好的代码路径,把一次任务拆成固定步骤,每步调用 LLM、把输出传给下一步;步骤确定、可预测,适合「明确该怎么做」的任务。Agent 则相反:由 LLM 自己动态决策、自己规划下一步,更适合开放性的问题——没人预先写死路径,因为路径本身要靠推理得出。
它们的底层是同一个构建块:增强 LLM(Augmented LLM)= LLM + 检索 + 工具 + 记忆。当前的模型已经能自主生成搜索查询、选择要调的工具、决定该保留哪些信息。
五种常见的 Workflow 模式
Anthropic 总结了五种模式,自简到繁:
- 提示链(Prompt chaining):把任务拆成固定步骤链,每步输出进下一步,可加「闸门」检查
- 路由(Routing):先分类再分发——简单任务给小模型,难题交给大模型
- 并行化(Parallelization):Sectioning(拆独立子任务并行)+ Voting(同一任务跑多次取多数)
- 编排者-工人(Orchestrator-workers):主 LLM 动态拆任务、委派子 LLM、汇总结果,适合子任务不可预知的场景
- 评估-优化(Evaluator-optimizer):一个 LLM 生成、另一个评估反馈,循环改进
Agent 本质是一个循环
Agent 不是某个模型,而是一个运行机制:
- LLM 基于「上下文 + 工具」决策 → 采取行动(调用工具)→ 从环境拿到真实反馈 → 继续或终止
- 它从人这里领任务,但每一步的进展判断来自环境,而不是人
- 遇到检查点或受阻时暂停、征求人类意见
- 必须有明确的停止条件,否则会无限循环
设计 Agent 的三条原则
- 保持简单:先从单次 LLM 调用开始,够用就不要加编排
- 透明性:明确展示规划步骤,让人看得懂它在做什么
- 精心设计 ACI(Agent-Computer Interface):工具接口要像给人写文档一样用心。Anthropic 在 SWE-bench 上花在优化工具接口上的时间,比优化 prompt 还多
以 opencode 为例对号入座:它本质是 Agent(LLM 自主调工具的循环);task 派发 subagent 是编排者-工人;并发读文件是并行化;plan / build 双模式是路由;系统提示 + AGENTS.md + skills 构成增强 LLM 的记忆与指令层。
上下文:Agent 的「有限内存」
每一轮请求,模型都要把系统提示、规则文件、历史消息、工具返回结果全部塞进上下文。其中工具返回(read、bash 的大段输出)是主要消耗者;各模型有各自的窗口上限(models.dev 上可查,约 128k~200k token)。
窗口大不等于「越大越好」,因为存在 context rot(上下文腐化):token 越多,模型准确回忆起某条信息的概率越低,这是所有模型共有的非线性现象。注意力的复杂度是 O(n²),长上下文下注意力预算被摊薄。所以上下文工程有一条铁律:
用最小的高信号 token 集,去最大化期望行为出现的概率。
长期任务的三大技术
- Compaction(压缩):上下文接近上限时,让模型把历史摘要成关键细节。Claude Code 的策略是保留架构决策、未解决的 bug、实现细节 + 最近访问的文件,丢弃冗余的工具输出
- 结构化笔记 / agentic memory:把状态定期写到上下文之外的持久文件(如 NOTES.md),需要时再拉回
- Sub-agent 隔离:把子任务交给独立 subagent,各自维护上下文,最后只把浓缩结果回传
除此之外还有:JIT 注入(按需读入,AGENTS.md 预注入 + 按需探索)、Repo map(只送最相关的符号签名)、工具结果清理(删除工具调用原始输出,Anthropic 称之为「最安全轻量的压缩形式」)、Prompt caching(降成本,但不解决溢出)。
压缩可靠吗?——不可靠
压缩本质是有损的。 模型自摘要必然丢掉细节:中间推理、微妙的限定条件、被否决的方案、原话的语气——尤其口语、反讽、隐含意图。大段工具输出被压缩后只剩一个结论,难以追溯。prune: true 更激进,之后的正确性只能靠记忆或重新读取。
没有根治办法,但有缓解手段:
- 关键事实写进持久层(AGENTS.md / instructions),每次请求重新注入
- ground truth 放在 git,随时可回滚
- 用 subagent 隔离,缩小每个上下文的覆盖面
- 调大预留缓冲(
reserved)防溢出 - 主动
/compact,在信息还完整时动手,别等自动压缩
业界没有「压缩效果最好」的公开基准;按口碑,Claude Code 的 auto-compact 最成熟,Aider 强在「很少需要压缩」。真正决定摘要质量的,还是底层模型的判断力。
一句话
Agent 的技术内核并不神秘:增强 LLM 当底座,workflow 解决确定任务,agent 循环解决开放任务。真正的难点不在架构,而在上下文工程——它决定了「模型到底能看到什么」。而压缩永远有损,所以正确性的最终来源,永远在文件与 git,不在模型的记忆里。