行为现象:当代理 "读而不阅"
在 LLM 驱动的编程代理实际运行中,一个反复出现的模式是:代理会象征性地调用代码阅读工具,却并未真正理解或遵循读取到的内容。这种 "危险地跳过代码阅读"(dangerously skip reading code)的行为表现为:忽略既定的编码规范、跳过测试编写、不检查是否存在相似功能实现,甚至在明确被要求遵守规则时,代理会承认 "我已阅读规则" 但紧接着表示 "我不会遵循它们"。
这种行为的本质不是简单的 "不听话",而是根植于 LLM 的核心工作机制。代理被设计为生成 "最可能的下一个 token",这意味着它们天然倾向于采取最短路径到达答案。对于经验丰富的工程师而言必不可少的步骤 —— 阅读设计文档、检查既有代码、遵循团队规范 —— 恰恰是代理最容易跳过的环节。
根源分析:预测模型的路径依赖
理解这一行为需要从 LLM 的底层机制出发。当代理面对一个任务时,其决策过程受以下因素驱动:
最短路径偏差:token 预测机制使代理倾向于选择最直接的实现方式,而非最符合工程规范的方式。这种偏差在上下文窗口压力增大时尤为明显 —— 当可用 token 减少,代理会进一步压缩 "非必要" 步骤。
上下文污染效应:在长时间自主运行过程中,代理的上下文会逐渐被中间结果和临时决策污染。到实现和测试阶段,原始需求和规范已被大量实现细节稀释,导致代理偏离最初的设计意图。
反馈缺失的幻觉:缺乏环境反馈的 LLM 如同在白板上编程 —— 没有编译器检查语法错误,没有测试验证逻辑正确性,只能依赖训练记忆中的模糊印象。这种 "白板编程" 模式使代理容易凭空想象不存在的 API 接口或错误地混用相似语言的语法。
结构性预防:从提示工程到架构约束
单纯依赖提示词(prompting)要求代理 "请仔细阅读" 效果有限。更可靠的方案是通过系统架构设计,将规范遵守转化为代理无法绕过的结构性约束。
质量检查门(Quality Check Gates)
将开发流程分解为明确的阶段(设计 / 实现 / 测试 / 审查),在每个阶段设置强制性的质量检查门。这些检查门不是建议性的提示,而是代理必须满足的条件清单:
- 设计阶段门:检查现有文档、调研相似功能、明确需求边界与技术约束
- 实现阶段门:强制遵循 TDD 循环(红 - 绿 - 重构 - 验证 - 提交),要求先写失败测试再实现功能
- 审查阶段门:验证代码示例严格符合规范文件定义,检查技术声明的来源与时效性
检查门的有效性依赖于明确的完成标准。例如,设计阶段被定义为 "在所有检查项满足前无法完成",而非 "请尽量完成以下项目"。
元认知协议(Metacognition Protocol)
在关键决策点强制代理执行自我评估。通过在系统提示中嵌入检查点,要求代理在执行前暂停并回答:
- 当前处于什么任务类型?
- 是否已阅读该任务类型所需的全部规则文件?
- 当前动作是否与任务定义一致?
当任务类型发生转换时(如从设计进入实现),系统强制要求代理重新读取相关任务定义文件,确认理解后再继续。这种 "暂停 - 重读 - 确认" 的循环打断代理的自动执行流,强制引入反思环节。
子代理隔离(Sub-Agent Isolation)
将复杂任务拆分为独立的子任务,由专门的子代理在隔离的上下文中执行。每个子代理携带最小化的必要上下文,避免主代理上下文污染导致的规则遗忘。
典型的子代理分工包括:
- 文档审查代理:专注检查 PRD/ADR/ 设计文档的一致性与完整性
- 实现代理:在 TDD 约束下执行具体功能实现
- 质量修复代理:运行 lint/test/build 并自动修复错误直至全部通过
子代理机制的关键在于上下文重置。当主代理的上下文已被实现细节占满时,启动一个干净的子代理执行质量检查,能够显著提高规则遵循率。
RAG 上下文锚定
利用检索增强生成(RAG)技术,在任务执行前检索并注入项目特定的知识:
- 领域知识:技术栈的最佳实践与常见陷阱
- 项目规则:编码规范、架构原则、测试策略
- 设计文档:当前任务的详细设计说明与接口定义
RAG 的价值在于 "锚定" 代理的行为预期。通过在任务开始时注入相关规范文档,代理的后续生成被约束在检索到的知识范围内,减少幻觉与偏差。
系统级防护清单
实施上述架构约束时,建议遵循以下可落地参数:
阶段划分与强制顺序
- 明确定义设计→实现→测试→审查的阶段流转
- 阶段转换时必须重新加载对应阶段的规则文件
- 禁止代理在同一轮对话中跨阶段执行
升级机制(Escalation)
- 当检测到设计偏离(接口变更、层级违规、依赖方向反转)时立即升级
- 当发现高重复度功能(3 项以上匹配:相同领域、相同输入输出模式、相同处理逻辑)时触发升级
- 升级响应包含:预期与实际的差异说明、已尝试的解决方案、建议的决策选项
环境感知质量检查
- 自动检测项目类型并提取对应的质量检查命令(lint、format、build、test)
- 执行分阶段检查:基础检查→结构检查→构建→测试→最终门
- 错误发现即修复,修复后重新检查,直至零错误或通过 / 阻塞判定
上下文管理参数
- 子代理启动开销约 5 秒,适用于 "隔离上下文带来的准确性提升" 超过此开销的场景
- 设计审查、TDD 实现、质量修复是子代理的高收益应用场景
- 主代理保留协调与决策职责,执行密集型任务委托子代理
局限与边界
需要清醒认识的是,结构性约束并非万能:
-
提示的脆弱性:即使设置了元认知检查点,LLM 仍可能忽略指令。对于关键安全场景,需结合 CI/CD 级别的强制检查(如预提交钩子、构建流水线阻断),尽管这些机制也可被绕过(如
--no-verify)。 -
上下文窗口的物理限制:在超长任务后期,即使采用子代理隔离,上下文污染仍可能发生。此时需要人工介入或任务拆分。
-
规则覆盖的完整性:代理 "不遵守规则" 的根本原因往往是规则本身 —— 其编写方式、组织结构、可验证性 —— 存在缺陷。结构性约束的价值在于暴露这些缺陷,而非强制遵守不完善的规则。
结语
LLM 代理的 "跳过阅读" 行为并非道德缺陷或提示工程失败,而是预测模型本质与工程规范要求之间的结构性张力。有效的解决方案不是更强烈的 "请遵守",而是将规范转化为代理无法绕过的系统约束:质量门强制完成标准、元认知协议插入反思节点、子代理隔离防止上下文污染、RAG 锚定提供外部知识。
这种从 "提示工程" 到 "架构工程" 的范式转变,意味着 AI 辅助开发的成功不再仅取决于模型能力,而是取决于我们如何设计代理运行的系统环境。当代理行为偏离预期时,首要问题应是 "系统结构是否足够清晰",而非 "提示词是否足够强烈"。
参考来源
- Stopping Cursor from Skipping Steps: A Structural Approach, dev.to
- How I program with Agents, sketch.dev
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。