双循环驱动 AI Agent 技能持续进化 Warp 团队的 Issue Triage 实战框架
在真实的生产级开源仓库里,新 Issue 每天涌入。Agent 被寄予厚望去做第一轮分类——ready-to-implement、duplicate、needs-info——可现实往往是:它把需要更多环境细节的 issue 直接标成了 ready-to-implement。维护者手动改标签、写评论解释原因。第二天类似 issue 再来,Agent 依然犯同样的错。技能文件没有记住这些修正,维护者陷入反复手动兜底的循环。
这不是 Agent “不够聪明”,而是执行与进化被混在同一个静态提示里。Warp 团队在管理自身开源仓库时,把这个问题拆成了两个可独立运行、可相互喂养的闭环:内循环负责当下执行,外循环负责基于真实反馈进化技能。他们把这个模式提取出来,让别人也能复用。
为什么把执行和进化拆开,才是可持续的解法
我起初以为,只要把 triage prompt 写得再详细、再加几条规则,就能覆盖所有边界。后来看到他们把核心契约(输出 schema、保留标签规则、安全约束)锁死在共享 skill 里,只允许本地 companion 文件被外循环修改,才明白:技能的进化必须像代码 Review 一样,有明确的修改边界和审计路径,否则一次坏的更新就会污染整个系统。
这就像一支职业球队。场上球员执行战术(内循环),教练组赛后复盘录像、更新战术手册(外循环)。球员再有天赋,没有复盘机制也只能靠个人经验慢慢试错;有了系统复盘,手册里的每一条调整都能被下一场比赛直接继承。Agent 的技能文件(.agents/skills/xxx/SKILL.md)就是那本可版本控制的战术手册。
另一个更贴近工程的类比是工厂 SOP。工人严格按最新 SOP 操作(内循环),质量部门收集异常报告后修订 SOP(外循环)。新员工入职直接用修订后的版本,而不是靠老员工口口相传。双循环把“个人经验”变成了“组织资产”。
内循环:把 triage 变成可重复、可观测的生产动作
内循环的核心是:每当新 Issue 出现,就用当前最新版本的技能去处理,并把完整交互记录下来。
典型实现(以 GitHub + Oz 云 Agent 为例):
# .github/workflows/oz-issue-triage.yml(简化示意)
on:
issues:
types: [opened, reopened, edited]
jobs:
triage:
runs-on: ubuntu-latest
steps:
- name: Run Oz triage agent
uses: warpdotdev/oz-agent-action@vX
with:
skill: triage-issue # 核心共享技能(不可被外循环随意修改)
local-skill: triage-issue-local # 仓库专属可进化部分
# 传入 issue 内容、仓库 config、历史上下文等
Agent 执行后会输出结构化结果(triage_result.json),包含:
- 标签集合(严格遵守保留标签规则)
- 可复现性评估
- 最可能根因(带证据)
- follow_up_questions(最多 5 个,且必须是只有 reporter 才能回答的)
- duplicate_of(与已有 issue 的关联)
- issue_body(要发在 issue 下的 Markdown 总结)
整个过程不直接修改仓库,只通过标签和评论与人类交互。所有运行轨迹都被记录(文件、agent trace 或外部系统),为外循环提供“训练数据”。
外循环:把人类修正变成可合并的 diff
外循环通常按日程(或事件触发)运行。它不执行 triage,而是观察内循环产生的所有反馈。
具体流程(基于 Warp 团队的 update-triage 模式重构):
- 聚合过去 7 天(或自定义窗口)被人类修正过的 issue(标签改动 + 评论中的明确理由)。
- 识别可复用的模式:反复把某类 issue 从 ready-to-implement 改成 needs-info、特定 owner 分配规律、 recurring follow-up 问题等。
- 只对可覆盖类别提出最小 diff:
- 仓库专属的 triage-issue-local/SKILL.md(启发式、follow-up 模式、duplicate 聚类等)
- .github/issue-triage/config.json(仅标签 taxonomy)
- 严格禁止触碰核心 triage-issue/SKILL.md 的输出 schema、保留标签规则和安全约束。
- 生成 PR,人类 review 后合并。合并即完成技能升级,下一次内循环自动使用新版本。
整个过程像一次“代码 Review + 最小变更原则”:只改该改的,只因为有重复信号才改,避免把一次性噪音固化成规则。
<!-- update-triage 技能的简化决策逻辑(中文注释) -->
- 读取 feedback.json(聚合脚本产出)
- 检测重复模式(同一类 mis-triage 出现 ≥2 次且有明确理由)
- 仅修改 overridable 部分:
- label taxonomy 描述
- repo-specific follow-up 模式
- issue-shape 启发式
- 生成最小 patch,验证后开 PR
- 禁止:修改核心 schema、弱化保留标签、把 reporter 个人内容写成通用规则
双循环 vs 传统静态方案对比
| 维度 | 静态 Prompt / 单次 Skill | 双循环自改进方案 | 关键权衡与边界条件 |
|---|---|---|---|
| 长期性能 | 随使用次数增加而退化 | 持续复利式提升 | 需要足够反馈密度,否则外循环无数据可学 |
| 人力投入 | 反复手动修正同类错误 | 初期搭建成本高,后续维护大幅下降 | 适合 issue volume 中高、反馈可结构化的场景 |
| 可审计性 | 几乎为零(黑盒提示词) | 完整 diff + PR 历史,像代码一样可追溯 | 外循环必须有严格写权限限制 |
| 风险控制 | 低(人工兜底) | 中(外循环可能提出次优更新,需 review) | 推荐叠加 eval 机制验证更新效果 |
| 知识沉淀 | 留在个人脑子里或聊天记录 | 沉淀为版本化、可复用的组织资产 | 适合团队协作或长期维护的 Agent 系统 |
| 自动化潜力 | 低 | 高(可替换人类反馈为自动 grader) | 目标清晰且有可靠自动评估指标时优先 |
为什么这个模式值得在更多场景复制
把技能当成“可 diff 的文件”而非“黑盒提示词”,是整个方法论的底层杠杆。它让 Agent 从“每次都要重新教”的工具,变成了“能记住教训并主动进化”的队友。
在 Warp 团队的实践中,这个双循环已经被用于管理他们自己的开源仓库,也被提取成可复用的框架(oz-for-oss 相关 workflows 与 skills)。当你有清晰的目标(比如“把 needs-info 比例降到 X% 以下”),甚至可以把外循环里的“人类 reviewer”替换成自动 grader,进一步降低人力依赖。
当然,这套系统也对基础设施有要求:可靠的反馈收集通道、版本控制的 skill 文件、以及最终的 eval 机制(Zach 本人在回复中也提到,下一步会补充 eval 部分)。没有 eval,就无法判断一次 skill 更新是真正进步还是引入了新问题。
在你的系统里,第一个外循环该从哪里开始?
如果你已经在用 Agent 处理 Issue、Code Review、Incident Response 等重复性任务,那么你手里其实已经积累了最宝贵的资源——人类修正的轨迹。把这些轨迹结构化、喂给外循环,让技能像代码一样被 Review、被合并、被版本化,这就是把一次性实验变成长期生产力的关键一步。
你目前在哪个具体场景里积累了可复用的反馈数据?第一个值得构建外循环的技能,会是 triage、review,还是其他?
我是紫微AI,在做一个「人格操作系统(ZPF)」。后面会持续分享AI Agent和系统实验。感兴趣可以关注,我们下期见。
更多推荐



所有评论(0)