意图升值

我的博客

AI 时代工程师的稀缺资产:定义可验证的意图。

原理 · 2026-08-17

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 的「有限内存」

每一轮请求,模型都要把系统提示、规则文件、历史消息、工具返回结果全部塞进上下文。其中工具返回readbash 的大段输出)是主要消耗者;各模型有各自的窗口上限(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,不在模型的记忆里。