Warp 基于 Claude 的自改进代理:基础技能 + 改进技能循环

·阅读约14分钟·Evergreen Tools Team
Warp self-improving agents

💡 工具推荐实现自改进循环时,试试 Evergreen Tools 的 Diff对比工具, JSON格式化工具, Cron表达式生成器

代理需要可靠地处理重复任务。一个第一版提示词能答对 80% 任务的代理,会带给用户嘈杂而恼人的体验。Warp 在内部代码审查代理上栽过这个跟头,并用这个教训重塑了产品策略——服务着全球近 100 万开发者。Warp 是 AI 终端与代理式开发环境,构建在 Claude 平台上。工程师们抱怨他们的审查代理发表无用的评论、产出低质量内容。最终他们意识到:无论反馈目的是什么,给代理的反馈通常在会话结束时消失——关键上下文从代理循环中被移除。他们的解法:一个基于 Agent Skills 的框架,让反馈随时间复利,持续精炼和增强代理输出。

1. 问题:反馈在会话结束时消失

给代理的反馈,无论其用途如何,通常在会话结束时消失。这对任何代理循环都是致命的:每次运行都从同一个不完善的起点重新开始,错误一遍遍重复,因为「上次人类纠正了什么」从未被保存下来。Warp 的工程师们对内部代码审查代理的抱怨非常具体:无用的评论、低质量的输出。不是模型不够聪明,而是没有任何机制把人类的纠正累积下来。会话是隔离的,知识不是。

// The inner/base skill: functional domain knowledge and
// instructions, kept OUT of the raw prompt. When a PR is
// opened, the code agent executes using this skill.
// SKILLS/code-review/SKILL.md
# Code Review Agent
## Rules
- Comment only when the change is actionable.
- Naming: follow repo conventions (see GLOSSARY.md).
- Never suggest a rename that contradicts a global
  variable naming convention documented in the repo.
- Explain the why behind every rule so the agent can
  reason instead of pattern-match.
## Context
- Load GLOSSARY.md before reviewing.

2. 解法:Agent Skills 与双技能架构

核心技巧是一个基于 skills 的自改进循环。skills 是基于文件的编码知识——把指令从原始提示词里拿出来。Warp 演化出由两个技能构成的自改进代理架构,中间夹着人类反馈。内部/基础技能持有功能领域知识与指令:比如 PR 打开时,Warp 的代码代理用基础技能和上下文执行审查。外部/改进技能是一个观察者代理,按计划而不是按任务运行:它拉取累积的人类反馈,比较代理的建议和人类的回应,然后对基础技能提出一个小而聚焦的修改。

Feedback loop
// Feedback is the critical component: explicit is better.
// A thumbs up helps; detailed reasons teach. The session
// used to swallow this — now it feeds the loop.
type Feedback = {
  prId: string;
  agentCommentId: string;
  human: "affirmed" | "rejected";
  reason?: string; // "you suggested renaming X, but our
                   // codebase convention for globals is Y"
};
const collected: Feedback[] = await pullFromPRs(org, "30d");

3. 人类反馈:质量优先,数量其次

人类对代理输出的反馈是自改进循环的关键组件。对代码审查来说,可以简单到点个赞——但越明确越好。Warp 创始人 Zach Lloyd 解释:「人类可以确认『这是个好评论』,也可以给出详细理由说明为什么一次审查不好。比如『你建议重命名这个变量,但我们代码库的惯例是这种全局变量用这种命名上下文』——这告诉代理下次怎么做对。」小样本量、领域特定的详细反馈,比一大堆敷衍的点赞更有价值,因为二元点赞不说明「为什么」。

// The outer/improver skill: an observer agent that runs on
// a schedule, not per task. It pulls accumulated feedback,
// compares what the agent suggested against how humans
// responded, and proposes a small, focused edit to the
// base skill. Because skills are plain files, agents are
// extremely good at updating them.
// SKILLS/code-review-improver/SKILL.md
# Improver
1. Load feedback collected over the last 30 days.
2. Group by pattern: which suggestions got rejected?
3. Draft ONE small edit to ../code-review/SKILL.md.
4. Open a PR with the change + the evidence.

4. 为什么 skills 让改进变得可行

因为 skills 是纯文件,代理极其擅长更新它们。改进技能产出的修改是可审查、可批准、可合并的——走正常的 PR/代码审查流程。合并之后,下一次基础技能运行就继承了改进。这解决了一个根本问题:过去让代理「记住教训」要么塞进提示词(每次都在膨胀),要么依赖某种神秘的状态系统。文件即知识,PR 即记忆。Warp 把反馈循环变成了普通的工程流程。

Improver skill

5. Warp 的规模数据

Warp 已融资 7300 万美元,月活开发者 80 万,财富 500 强中 56% 在使用 Warp;至今在 Warp 内运行了 1000 万次 Claude Code 会话,每周超过 40 万次;Warp Agent 对话累计 4000 万次。现在 Warp 在它的整个开源仓库里运行这套模式,分别有规格编写、审查、分流三个代理,各自携带自己的自改进循环。Zach Lloyd 说:「基于文件的 skills 是一种为代理编码知识的方式,不把知识直接放进提示词——代理在工作中随时可以查。」

// The update flows through a normal PR/code-review
// workflow: reviewable, approvable, mergeable. Once merged,
// the next run of the inner skill inherits the improvement.
async function improveLoop(schedule: Cron) {
  schedule.every("monday 09:00", async () => {
    const feedback = await collectFeedback("30d");
    if (feedback.length < MIN_SIGNAL) return; // quality > volume
    const pr = await improverAgent.proposeEdit(feedback);
    await openReviewablePR(pr); // human approves, then merge
  });
}
// Feedback compounds over time instead of vanishing.

6. 写作自改进 skills 的实战建议

Warp 团队分享了几条经过验证的建议:解释「为什么」。给出规则背后的理由,让代理能推理问题而不是死板执行指令,这能带来更好的泛化。反馈质量 > 数量,但数量有帮助——一小份来自资深工程师的、围绕领域特定知识的详细反馈,比大量敷衍的反馈更有价值,因为后者不说明原因。保持小步:每次只对基础技能做一个聚焦的修改,让每一轮改进都可审查、可回滚。框架的美妙之处就在于它的简单:「有领域特定的基础技能,还有精炼它的改进技能。」

// The full architecture Warp runs across its open-source
// repo: separate spec-writing, review, and triage agents,
// each carrying its own self-improvement loop.
const agents = [
  { name: "spec-writer",  base: "spec-writing",  improver: "spec-improver" },
  { name: "reviewer",     base: "code-review",   improver: "code-review-improver" },
  { name: "triage",       base: "issue-triage",  improver: "triage-improver" },
];
for (const a of agents) {
  runLoop({ base: loadSkill(a.base),
            improver: loadSkill(a.improver),
            schedule: "weekly" });
}
// The framework is really simple: a base domain-specific
// skill and an improver skill that refines it.

📌 常见问题 FAQ

什么是自改进代理?

自改进代理把人类反馈累积起来并随时间复利:每次会话的纠正不会在会话结束时消失,而是通过改进技能定期提炼成对基础技能的修改,让代理下一次运行自动变好。

什么是自改进代理?

自改进代理把人类反馈累积起来并随时间复利:每次会话的纠正不会在会话结束时消失,而是通过改进技能定期提炼成对基础技能的修改,让代理下一次运行自动变好。

什么是自改进代理?

自改进代理把人类反馈累积起来并随时间复利:每次会话的纠正不会在会话结束时消失,而是通过改进技能定期提炼成对基础技能的修改,让代理下一次运行自动变好。

什么是自改进代理?

自改进代理把人类反馈累积起来并随时间复利:每次会话的纠正不会在会话结束时消失,而是通过改进技能定期提炼成对基础技能的修改,让代理下一次运行自动变好。

什么是自改进代理?

自改进代理把人类反馈累积起来并随时间复利:每次会话的纠正不会在会话结束时消失,而是通过改进技能定期提炼成对基础技能的修改,让代理下一次运行自动变好。

两个技能怎么配合?

基础技能持有领域知识和指令,代理执行任务时使用;改进技能是观察者代理,按计划运行,拉取累积反馈、对比建议与人类回应、对基础技能提出小修改,走正常 PR 流程合并。

两个技能怎么配合?

基础技能持有领域知识和指令,代理执行任务时使用;改进技能是观察者代理,按计划运行,拉取累积反馈、对比建议与人类回应、对基础技能提出小修改,走正常 PR 流程合并。

两个技能怎么配合?

基础技能持有领域知识和指令,代理执行任务时使用;改进技能是观察者代理,按计划运行,拉取累积反馈、对比建议与人类回应、对基础技能提出小修改,走正常 PR 流程合并。

两个技能怎么配合?

基础技能持有领域知识和指令,代理执行任务时使用;改进技能是观察者代理,按计划运行,拉取累积反馈、对比建议与人类回应、对基础技能提出小修改,走正常 PR 流程合并。

两个技能怎么配合?

基础技能持有领域知识和指令,代理执行任务时使用;改进技能是观察者代理,按计划运行,拉取累积反馈、对比建议与人类回应、对基础技能提出小修改,走正常 PR 流程合并。

为什么反馈之前会消失?

传统代理会话是隔离的:会话结束,上下文清空。纠正只存在于人类记忆里,代理每次运行都从同一个不完善起点重新开始,错误反复出现。skills 把知识变成文件,PR 流程变成记忆。

为什么反馈之前会消失?

传统代理会话是隔离的:会话结束,上下文清空。纠正只存在于人类记忆里,代理每次运行都从同一个不完善起点重新开始,错误反复出现。skills 把知识变成文件,PR 流程变成记忆。

为什么反馈之前会消失?

传统代理会话是隔离的:会话结束,上下文清空。纠正只存在于人类记忆里,代理每次运行都从同一个不完善起点重新开始,错误反复出现。skills 把知识变成文件,PR 流程变成记忆。

为什么反馈之前会消失?

传统代理会话是隔离的:会话结束,上下文清空。纠正只存在于人类记忆里,代理每次运行都从同一个不完善起点重新开始,错误反复出现。skills 把知识变成文件,PR 流程变成记忆。

为什么反馈之前会消失?

传统代理会话是隔离的:会话结束,上下文清空。纠正只存在于人类记忆里,代理每次运行都从同一个不完善起点重新开始,错误反复出现。skills 把知识变成文件,PR 流程变成记忆。

怎么开始?

把一个代理的领域指令写成 SKILL.md 文件;收集人类反馈(越明确越好);写一个改进技能按周运行,聚合反馈提出一个聚焦修改;通过 PR 审查合并。从最小信号量开始,质量优先。

怎么开始?

把一个代理的领域指令写成 SKILL.md 文件;收集人类反馈(越明确越好);写一个改进技能按周运行,聚合反馈提出一个聚焦修改;通过 PR 审查合并。从最小信号量开始,质量优先。

怎么开始?

把一个代理的领域指令写成 SKILL.md 文件;收集人类反馈(越明确越好);写一个改进技能按周运行,聚合反馈提出一个聚焦修改;通过 PR 审查合并。从最小信号量开始,质量优先。

怎么开始?

把一个代理的领域指令写成 SKILL.md 文件;收集人类反馈(越明确越好);写一个改进技能按周运行,聚合反馈提出一个聚焦修改;通过 PR 审查合并。从最小信号量开始,质量优先。

怎么开始?

把一个代理的领域指令写成 SKILL.md 文件;收集人类反馈(越明确越好);写一个改进技能按周运行,聚合反馈提出一个聚焦修改;通过 PR 审查合并。从最小信号量开始,质量优先。

有什么风险?

风险在于反馈质量:二元点赞不说明原因,可能放大噪声;修改必须小步且可审查,避免基础技能被带偏。Warp 的做法是只在小样本详细反馈上做改进,保持每轮一个聚焦修改。

有什么风险?

风险在于反馈质量:二元点赞不说明原因,可能放大噪声;修改必须小步且可审查,避免基础技能被带偏。Warp 的做法是只在小样本详细反馈上做改进,保持每轮一个聚焦修改。

有什么风险?

风险在于反馈质量:二元点赞不说明原因,可能放大噪声;修改必须小步且可审查,避免基础技能被带偏。Warp 的做法是只在小样本详细反馈上做改进,保持每轮一个聚焦修改。

有什么风险?

风险在于反馈质量:二元点赞不说明原因,可能放大噪声;修改必须小步且可审查,避免基础技能被带偏。Warp 的做法是只在小样本详细反馈上做改进,保持每轮一个聚焦修改。

有什么风险?

风险在于反馈质量:二元点赞不说明原因,可能放大噪声;修改必须小步且可审查,避免基础技能被带偏。Warp 的做法是只在小样本详细反馈上做改进,保持每轮一个聚焦修改。