📘 Day 11 — 代码,Agent 的元能力

🎯 目标

  1. Coding Agent 的实现技巧 + 搜索工具 + 文件编辑工具(把昨天的架构落到工具层)
  2. 代码作为元能力的六个方向(今天的重头戏)

模块 1:让 Coding Agent 真正"跑得快、省得下"

昨天讲了理想工作流,今天讲五个实现技巧——它们是第 2/4 章通用技术在编程场景的具体应用:

⚡ 技巧 1:并行工具调用、流式执行与级联中止

  • 串行是浪费:传统实现"生成一个调用→执行完→再决定下一步",排队等待浪费时间
  • 流式执行:利用流式响应,第一个工具调用的参数一生成完整并通过校验,立即开始执行,与后续调用的生成过程重叠
  • 并行执行:彼此独立的调用可同时跑,而非排队
  • 级联中止(Cascade Abort):工具定义声明是否支持并发(默认为否,失败安全);某个调用失败时,中止同一批中依赖它的调用,但不波及独立调用和父级操作——这就是 Harness"故障边界控制"的具体落地

💾 技巧 2:上下文的精细化管理

代码库很大、上下文窗口有限,要分层管理:

层面 做法
文件读取 支持按行号范围读取片段(只读 100-150 行,而非整文件)
行号标注 每行代码前缀真实行号 → 模型可精确说"src/main.py 第 42 行",减少歧义
命令输出 保留前若干行(错误上下文)+ 后若干行(错误总结),中间一行提示,完整输出存临时文件按需查看

🧭 技巧 3:环境信息动态注入(状态栏技术在 Coding Agent 的体现)

每次推理前,在上下文末尾注入:

  • 当前工作目录(避免路径引用出错)
  • git 分支(主分支还是特性分支)
  • 最近提交记录(项目演化脉络)
  • 未暂存/已暂存的变更概览(已改了什么)

⚠️ 注意:这些不能硬编码在静态系统提示词里(会破坏 KV Cache 效率),必须作为动态追加的状态栏注入。

🖥️ 技巧 4:命令执行环境的状态持久化

  • 如果每次命令都开全新 shell,cd、激活虚拟环境、设置环境变量全都会丢失
  • 应维护一个持久化终端会话:启动时创建、全程保持活跃,默认模式
  • 同时保留启动隔离终端的能力以支持并行任务

✍️ 技巧 5:即时的语法反馈机制

  • 文件写入一完成,工具层自动运行 linter/语法检查器,结果作为工具返回值的一部分
  • 就像 IDE 里打错括号立刻画红线——Agent 在错误引入那一刻就能修正,不用等跑测试才发现

一句话总结 5 个技巧:并行与流式、上下文管理、环境感知、状态持久化、即时反馈——让 Agent 像经验丰富的开发者一样流畅工作。


模块 2:搜索工具 —— 在代码库里"找得准"

成熟的 Coding Agent 有 4 类互补的搜索工具

工具 原理 适用场景 局限
正则内容匹配(grep/ripgrep) 逐行扫描文本模式 知道要找的具体文本(函数名、错误消息) 只能匹配文本,不懂语义——搜"用户认证"找不到叫 check_credentials 的函数
文件名匹配(glob) 按路径模式找文件 探索项目结构第一步,如 **/*.test.ts 不看内容
语义代码搜索 结构感知分块 + 混合检索(向量 + BM25)+ 重排序 探索性任务:找"与数据库交互"的代码 需建索引
符号级查找(LSP) 跳转定义/查找引用 重构:区分同名符号的定义和调用 需要语言服务器

关键点:语义搜索的路线之争(这是业界真实争论):

  • Claude Code 路线:刻意不建嵌入索引,纯靠 agentic 的 grep + glob 现场检索——不用维护会陈旧的索引、省基础设施、避免代码嵌入外发第三方
  • Cursor 路线:愿意为跨文件语义召回付建索引成本,大型代码库快速找语义相关片段

本质权衡:“基础设施与数据外发的代价” vs “跨文件语义召回的收益”

实践组合策略:“从粗到细、从语义到语法”——先用语义搜索找到相关模块 → 正则精确定位代码行 → 符号搜索追踪调用链。


模块 3:文件编辑工具 —— “改得准、改得稳”

5 种方案对比(核心张力:人类语言表达的灵活性 vs 机器执行的精确性):

方案 代表 原理 优点 缺点
差异描述 + Apply Model Cursor 模型输出 diff 或带省略标记的骨架,小模型负责合并 主模型专注高层逻辑;Cursor 用 fast-apply + 推测解码做到每秒上千 token 合并环节脆弱:相似代码片段可能合并错位置
旧字符串→新字符串 Claude Code 提供 old string + new string,框架查找替换 可预测、透明、无歧义,实现简单 删大段代码要完整输出原文;重复代码需更长上下文消歧
行号定位 指定"删 X-Y 行,插入新内容" 大段删除只需两个数字 模型"数"行号易错;编辑后行号漂移,限制并行
类 Vim 命令 复制/剪切/粘贴等 重组代码(移动函数)高效 语法学习负担大,小模型错误率高
字符串首尾匹配 只给要删内容的开头几行+结尾几行 综合了文本替换可靠性和行号效率 首尾组合需唯一

实践建议(作者给的):

  • 自建 Agent 起点:旧字符串→新字符串(可靠性优先、实现简单、无需额外模型)
  • 大段改动:字符串首尾匹配(更经济的折中)
  • 行号方案:只在 IDE 深度集成(实时维护行号映射)时才可靠,否则行号漂移导致失效

模块 4:代码作为元能力 —— 六个方向 🎯 今日重头戏

什么是"元能力"?

普通能力 = Agent 能做某件具体的事。元能力 = 能创造其他能力的能力:当场写出新工具、新约束、新表达形式,而不必事先预制好一切。

代码生成正是这样的元能力——它精确、可执行、可组合

六个方向按"作用对象由内向外"组织:

         ┌─────────────────────────────┐
         │   6. Agent 自身(自举)       │  ← 最外层:创造/修复 Agent
         │   ┌───────────────────────┐  │
         │   │ 5. 用户界面(生成式 UI)  │  ← 与人交互的界面
         │   │   ┌─────────────────┐  │  │
         │   │   │ 4. 系统接口(适配器)│  │  ← 连接机器与机器
         │   │   │   ┌───────────┐  │  │  │
         │   │   │   │ 3. 内容呈现 │  │  │  │  ← PPT/视频/可视化
         │   │   │   │  ┌───────┐ │  │  │  │
         │   │   │   │  │2.业务规则│ │  │  │  │  ← 可执行约束
         │   │   │   │  │┌─────┐│ │  │  │  │
         │   │   │   │  ││1.思维││ │  │  │  │  ← 代码替代自然语言推理
         │   │   │   │  │└─────┘│ │  │  │  │
         │   │   │   │  └───────┘ │  │  │  │
         │   │   │   └───────────┘  │  │  │
         │   │   └─────────────────┘  │  │
         │   └───────────────────────┘  │
         └─────────────────────────────┘
   思维 → 规则 → 内容 → 接口 → 界面 → Agent 自身
   (由内向外,最终回到自身)

方向 1:代码作为思考工具(弥补概率思考的短板)

  • LLM 思考是概率性、近似的;数学/逻辑要求确定性、精确
  • 分工:LLM 负责理解问题并写代码,代码解释器负责精确计算
  • 书中的例子:40 名学生 60% 选数学、45% 选物理、25% 都选——纯语言推理算错"只选物理 = 24-10 = 14",代码 only_phys = phys - both 得到正确的 8
  • Wolfram 洞察:Wolfram Alpha 能做符号计算但自然语言理解脆弱;LLM 擅长理解自然语言但算不准——两者协同:LLM 把自然语言问题形式化为 SymPy 代码,符号计算引擎执行
  • 🔑 一个重要规律模型与脚手架此消彼长——模型越强,代码求解器增益越小;模型越弱,越需要把逻辑交给代码兜底。同一套脚手架配不同能力的模型,结论可能截然不同(实验刻意用弱模型放大对照)

方向 2:代码作为业务规则的约束(Harness"约束编码化"的回应)

  • 自然语言规则充满歧义:“7 天内可退款”——自然日还是工作日?下单时间还是发货时间?
  • 代码 = 无歧义、可执行、确定性的知识表达
  • 自然语言 vs 代码化:互补而非替代
    • 提示词里的自然语言规则:可解释政策、可找变通方案(改签而非取消)
    • 代码化校验工具:精确、确定、适合复杂规则组合;特别适合防止不可逆错误操作(取消订单、转出资金、删除数据)
  • τ-bench 三重保障(书里的 cancel_reservation 例子):
    1. 系统提示词的自然语言规则 → 帮助理解和解释
    2. 工具描述 + 参数设计作为 checklistexpected_* 参数迫使模型调用前先查订单、逐条核对 → 模型常在自己核对时就发现违规,根本不会发起调用
    3. 服务端基于数据库真值的代码化校验 → 最后守门员:舱位、保险、时间全部服务端查库获取,绝不采信模型自报值(模型可能幻觉或被提示注入操纵)
  • 关键设计:expected_* 与真值不一致时记录告警,用于审计

方向 3:代码驱动的多媒体生成(提议者-审核者机制)

  • PPT 生成:把 PPT 创作重新框定为代码生成问题(Slidev 用 Markdown/HTML 定义演示内容)
    • 关键洞察:Agent 写完代码不知道实际渲染效果 → 需要提议者-审核者
    • Proposer Agent:生成 Slidev 代码
    • Reviewer Agent:渲染每页为图片,用 Vision LLM 检查内容密度/可读性/布局,生成结构化改进建议(“第 3 页内容过多,建议拆分”——含页码、问题类型、严重程度)
    • 迭代直到达标或达到最大轮数(5 轮)——“质量达标”+"最大轮数"正是 Loop 工程要求的两类显式终止条件
  • 为什么用双 Agent 而非单 Agent 循环? 核心是上下文管理:Reviewer 每次只看最新版渲染图,不受历史版本干扰;Proposer 只累积结构化文本反馈,token 少、易推理。单 Agent 要在同一上下文堆几十页渲染图,迅速超限
  • 视频编辑:GUI 操作需要精确坐标 → 重构为 API 调用和代码生成(Blender Python API / FFmpeg);两步定位策略:粗粒度(每 10 秒截图 + Vision LLM 找场景区间)→ 精细粒度(窄范围每秒截图精确定位);视频分析封装为子 Agent,避免大量截图占主 Agent 上下文
  • 与第 4 章事前审批同源:都是提议者-审核者范式——生成与审查分离、双模型独立评估

方向 4:代码作为系统适配器(连接机器与机器)

  • 真实系统接口常不规范:文档缺失、格式非标、字段漂移 → Agent 当场读接口文档或观察一两条真实响应,即时生成适配代码——“万能胶”
  • RPA 延伸:对只有 GUI 的系统,先 Computer Use 操作,再把成功序列固化为代码 → 未来直接跑代码,速度快、稳定、不用昂贵的视觉思考
  • 自适应日志解析(实验 5-7):前端遇到无法解析的日志格式 → 不报错,把失败信息(日志样本+报错)报告给 Agent → Agent 生成解析代码 → 虚拟浏览器自动测试 → 热更新部署。系统自动适应格式演化
  • 生产日志智能诊断(实验 5-8):Agent 读轨迹日志 + 架构文档 + PRD → 判断流程是否符合预期 → 生成结构化问题报告(优先级/模块/描述/建议)+ 回归测试用例(引用轨迹 ID,自动重放验证)→ 通过 MCP 对接 GitHub 创建 Issue。问题发现到任务分派全自动化

方向 5:代码作为生成式 UI(突破纯文本交互)

  • 纯文本交互局限:收集结构化信息要反复问答、表达复杂数据关系无力、选项选择不直观
  • 生成式 UI:Agent 动态生成表单、交互图表甚至完整 Web 应用

A2UI 类协议(安全优先的标准化方案)

  • Agent 不直接生成可执行代码,只输出界面描述清单(JSON:“显示 3 行 2 列的表格,标题为销售数据”)
  • 客户端用自己预先准备好的安全组件渲染——像餐厅菜单:顾客只能点菜单上的菜,不能进厨房自己做
  • 原因:Agent 直接生成 HTML/JS 时,提示注入可能让 Agent 生成窃取数据的恶意脚本——成因是提示注入,效果类似 XSS
  • 支持跨平台(React/Flutter/原生)+ 增量生成(流式 JSONL)
  • ⚠️ 易混淆辨析:AG-UI(CopilotKit)不是界面描述语言,而是事件/传输协议(把执行状态流式推送到前端),它甚至能承载 A2UI 载荷——二者互补而非同类

三个具体应用

  1. HTML 交付成果取代 Markdown 汇报:交互式演示、更好数据可视化、可持续完善的交付件(作者每个研究项目维护活文档网站:实验数据追溯 + 训练内科指标监控——损失/梯度范数/困惑度/奖励/KL 散度,比任务准确率更早暴露训练崩溃 + 运行原理展示)
  2. 动态表单澄清意图:一次填写代替十轮问答,支持级联表单(选"往返"才显示返程日期)
  3. SQL Artifact 模式:关键设计——Agent 不自己读数据!Agent 只生成 SQL 代码作为 artifact,系统执行、数据从数据库直达用户界面,完全绕过 LLM 中间人(LLM "抄写"几千行数据极易出错且耗 token)。进阶:SQL + 可视化代码双 artifact 流水线,LLM 只生成代码不参与数据传递

动态生成软件:Imagine with Claude 展示边界(从零生成完整应用)——但成本延迟高,更务实的是基于已有框架的半定制:热加载(HMR)让"把按钮改成蓝色"即时生效,“千人千面”。

方向 6:代码创造代码 —— Agent 自举 🚀

  • 与第 8 章分工:本节讲怎么用代码修复/创建同类 Agent(自举);第 8 章讲什么触发自我修改 + 如何灰度/回滚(进化控制)
  • OpenClaw Doctordoctor --fix 两层结构——
    • 第一层:确定性检查(过期 token、锁文件、端口冲突——有明确检测规则和固定修复动作,与传统运维脚本无异)
    • 第二层:LLM 兜底疑难问题:分析错误日志、理解配置语义、推断因果、生成针对性修复
    • "Agent 修复 Agent"从系统适配器升级为自举基础设施
  • 让 Agent 编写 Agent 的 4 个常见缺陷
    1. 上下文管理随意(纯文本轨迹、忽略 KV Cache 优化、循环边界 bug)
    2. 工具设计不规范(描述简略、缺负面清单、参数缺示例)
    3. 技术选型滞后(倾向训练数据里最常见但已过时的模型/API)→ 维护 SOTA 知识库或给搜索能力
    4. 外部生态脱节(废弃 API、不再维护的库)
  • 最有效解法:提供高质量 Agent 实现作为参考范例,基于范例修改而非从零开始——范例代码本身就是最佳实践载体,“基因复制加变异”

📝 自测题

  1. 级联中止(Cascade Abort)和 Harness 工程哪个原则对应?它终止哪些调用、不波及哪些?
  2. 语义搜索的 Claude Code 路线和 Cursor 路线的本质分歧是什么?
  3. 五种文件编辑方案中,为什么行号方案在独立 Agent 中不可靠?
  4. 什么是"元能力"?代码生成为什么是元能力?
  5. τ-bench 三重保障分别是什么?为什么 expected_* 参数"不承担安全责任"?
  6. 提议者-审核者相比单 Agent 循环的核心优势是什么?
  7. A2UI 和 AG-UI 有什么区别?为什么声明式界面协议更安全?
  8. SQL Artifact 模式为什么比"Agent 读数据后描述"更好?
  9. OpenClaw Doctor 的确定性检查和 LLM 兜底各解决什么问题?
  10. 为什么"基于范例生成"是解决 Agent 编写 Agent 缺陷的最有效路径?
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐