《深入理解 AI Agent》之学习笔记-DAY 11(代码,Agent 的元能力)
·
📘 Day 11 — 代码,Agent 的元能力
🎯 目标
- Coding Agent 的实现技巧 + 搜索工具 + 文件编辑工具(把昨天的架构落到工具层)
- 代码作为元能力的六个方向(今天的重头戏)
模块 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例子):- 系统提示词的自然语言规则 → 帮助理解和解释
- 工具描述 + 参数设计作为 checklist →
expected_*参数迫使模型调用前先查订单、逐条核对 → 模型常在自己核对时就发现违规,根本不会发起调用 - 服务端基于数据库真值的代码化校验 → 最后守门员:舱位、保险、时间全部服务端查库获取,绝不采信模型自报值(模型可能幻觉或被提示注入操纵)
- 关键设计:
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 载荷——二者互补而非同类
三个具体应用:
- HTML 交付成果取代 Markdown 汇报:交互式演示、更好数据可视化、可持续完善的交付件(作者每个研究项目维护活文档网站:实验数据追溯 + 训练内科指标监控——损失/梯度范数/困惑度/奖励/KL 散度,比任务准确率更早暴露训练崩溃 + 运行原理展示)
- 动态表单澄清意图:一次填写代替十轮问答,支持级联表单(选"往返"才显示返程日期)
- SQL Artifact 模式:关键设计——Agent 不自己读数据!Agent 只生成 SQL 代码作为 artifact,系统执行、数据从数据库直达用户界面,完全绕过 LLM 中间人(LLM "抄写"几千行数据极易出错且耗 token)。进阶:SQL + 可视化代码双 artifact 流水线,LLM 只生成代码不参与数据传递
动态生成软件:Imagine with Claude 展示边界(从零生成完整应用)——但成本延迟高,更务实的是基于已有框架的半定制:热加载(HMR)让"把按钮改成蓝色"即时生效,“千人千面”。
方向 6:代码创造代码 —— Agent 自举 🚀
- 与第 8 章分工:本节讲怎么用代码修复/创建同类 Agent(自举);第 8 章讲什么触发自我修改 + 如何灰度/回滚(进化控制)
- OpenClaw Doctor:
doctor --fix两层结构——- 第一层:确定性检查(过期 token、锁文件、端口冲突——有明确检测规则和固定修复动作,与传统运维脚本无异)
- 第二层:LLM 兜底疑难问题:分析错误日志、理解配置语义、推断因果、生成针对性修复
- "Agent 修复 Agent"从系统适配器升级为自举基础设施
- 让 Agent 编写 Agent 的 4 个常见缺陷:
- 上下文管理随意(纯文本轨迹、忽略 KV Cache 优化、循环边界 bug)
- 工具设计不规范(描述简略、缺负面清单、参数缺示例)
- 技术选型滞后(倾向训练数据里最常见但已过时的模型/API)→ 维护 SOTA 知识库或给搜索能力
- 外部生态脱节(废弃 API、不再维护的库)
- 最有效解法:提供高质量 Agent 实现作为参考范例,基于范例修改而非从零开始——范例代码本身就是最佳实践载体,“基因复制加变异”
📝 自测题
- 级联中止(Cascade Abort)和 Harness 工程哪个原则对应?它终止哪些调用、不波及哪些?
- 语义搜索的 Claude Code 路线和 Cursor 路线的本质分歧是什么?
- 五种文件编辑方案中,为什么行号方案在独立 Agent 中不可靠?
- 什么是"元能力"?代码生成为什么是元能力?
- τ-bench 三重保障分别是什么?为什么
expected_*参数"不承担安全责任"? - 提议者-审核者相比单 Agent 循环的核心优势是什么?
- A2UI 和 AG-UI 有什么区别?为什么声明式界面协议更安全?
- SQL Artifact 模式为什么比"Agent 读数据后描述"更好?
- OpenClaw Doctor 的确定性检查和 LLM 兜底各解决什么问题?
- 为什么"基于范例生成"是解决 Agent 编写 Agent 缺陷的最有效路径?
更多推荐



所有评论(0)