Agent RSI:智能体自进化
Agent RSI = Recursive Self-Improvement:智能体从每天真实发生的服务里复盘、沉淀、提出改进, 但永远不给自己发授权——每一次改变对外口径的动作,都要留下证据并由人签字。
它解决的是“这个门面怎么越用越像你的业务专家”; 至于它如何主动找你(而不是等你来找它),见 智能体主动模式。
为什么门面 Agent 需要自进化
普通 agent 只有一个服务对象,它的“记忆”就是这次会话,“提升”靠换模型或改 prompt。
Hushwork 的门面 Agent 不是这样:同一个 Agent 同时面向两类人。
| 谁 | 目的 | 在意什么 |
|---|---|---|
| 所有者(owner) | 构建 / 维护 / 升级这个门面 | 它哪里做得好、哪里做砸了、行业变了什么、该补什么 |
| 客户(customer) | 使用这个门面的服务 | 我的问题被理解了吗、下一步谁接、结果什么时候到 |
如果两类交互共用一条通道、一份 prompt、一套工具,后果不是“体验差”,而是治理失效:
- 所有者无法系统性地改进它;
- 客户也无法阻止它被客户自己“教坏”。
Agent RSI 就是这两者之间的那层“可控的自我进化”。
先隔离,再进化:三个面
┌────────────────────┐
│ AgentProfile │
└──────────┬─────────┘
┌────────────────────┼────────────────────┐
▼ ▼ ▼
OWNER 面 CUSTOMER 面 PEER 面
复盘 / 投喂 / 提案 澄清 / 登记 / 交付 Agent 网络- 身份只由服务端推导:
ownerId/ownerIds/ 平台运维 / 外部 Agent; - 会话创建时客户端传入
audience直接 400——不允许自报提权; - 推导结果持久化到会话,之后每轮不重算:所有者转让、成员移除不会让历史对话“变脸”;
- 换面 = 新建会话,不复用。
| 能力 | 客户面 | 所有者面 |
|---|---|---|
| 承诺价格 / 时限 / 结论 | 禁止 | 可以讨论口径,但不对客户生效 |
| 看客户对话原文 | — | 不给原文,只给摘要、指标与指针 |
| 改自己的能力 | 永不 | 只能提案,不能直接写 |
登记需求(submit_request) | 有 | 禁用(避免代客下单绕过确认) |
| 知识投喂 / 变更提案 / 决策 | 零 | read_owner_inbox / ingest_material / remember_lesson / propose_change / decide_change |
四个环:Ingest / Observe / Reflect / Learn
┌──────── Ingest(主人喂料)────────┐
│ 资料 → 候选知识 → 批准 → 生效 │
▼ │
┌───────────────┐ ┌──────────────┐ │
│ knowledge │◀─────│ Reflect │◀─────┘
│ lessons │ │ 每日复盘 │
└───────┬───────┘ └──────┬───────┘
│ │ 产出复盘报告 + 候选变更
▼ ▼
customer 面 owner 收件箱
(只有 approved 生效) (人来决策)| 环 | 触发 | 产出 |
|---|---|---|
| Ingest 投喂 | 所有者在对话里教 / 上传资料 | 知识条目(自动批准或待审) |
| Observe 观察 | 每天 05:00 抓取配置的行业订阅源 | 新闻摘要 + 候选项(不自动生效) |
| Reflect 复盘 | 每天 03:30 对前一天做复盘 | wins / misses / gaps + 改进提案 |
| Learn 沉淀 | 所有者的决策与对话 | 偏好、口径、禁忌(进入 lessons) |
四个环里,“把这些发现送到你面前”的那一环由 智能体主动模式 负责; 本页只讲“它如何变强”。
每天 03:30:一次不带幻觉的复盘
复盘不是“让模型夸自己”。它输入的是指标与指针,不是对话原文:
| 输入 | 来源 |
|---|---|
| 当天会话数、完成 / 过期 / 超预算比例 | 会话聚合 |
submit_request 次数与命中数 | 会话登记结果 |
needs_input 比例、非完成停止原因 | runtime 指标 |
| 错误事件(schema mismatch 等) | 状态层的错误路径 |
| 客户评价 / 信任分变化 | 信任模块 |
| 每条结论的指针 | 必须是 state path / session id / 聚合 key |
输出一份结构化报告:
{
"wins": [{ "claim": "VAT 场景 1–2 轮完成率 82%", "evidence": "/tasks/.../results/..." }],
"misses": [{ "claim": "22% 会话在'是否本地仓储'上反复追问", "evidence": "session:..." }],
"gaps": [{ "claim": "3 次询问德国包装法,无对应 skill", "evidence": "dialogue:..." }],
"proposedActions": [
{ "kind": "knowledge_draft", "summary": "补一条 LUCID 注册要求", "requires": "owner_approval" }
],
"droppedClaims": 2
}两条硬规则:
- 没有
evidence的结论直接被丢弃,并计入droppedClaims——这是幻觉率的一手信号。 - 提案一律
requires: owner_approval。模型可能输出auto,系统会强制覆盖: 自我修改的授权只能来自人。
报告只是“提议”,不产生任何行为变更。
从复盘到变强:三条落地路径
复盘只是发现,真正改变 agent 的是下面三条路径:
| 路径 | 等级 | 谁能决定 | 生效方式 |
|---|---|---|---|
| 补一条知识 / 经验 | L1 | 合规内容自动批准,其余待审 | 立即影响客户面检索或边界段 |
| 调话术 / 澄清顺序 / 边界措辞 | L2 | 自动生效并留痕;涉及对外承诺时升格人工 | 下一轮对话即生效,可回滚 |
| 改能力 / 交付方式 / 定价 | L3 | 只能人工批准(对话内批准需邮箱验证码) | 走契约编译器门禁,版本递增,失败回滚 |
知识最终沉淀到哪里、如何审批与过期,见 知识库。
自治等级:自动到什么程度
| 等级 | 内容 | 生效方式 | 闸门 |
|---|---|---|---|
| L0 观察 | 复盘、新闻摘要、缺口统计 | 自动 | 只读,不改变行为 |
| L1 知识追加 | 新知识 / 经验条目 | 自动 approved | 必须带来源与版本;低置信 / 法规类降级待审 |
| L2 行为参数 | 话术、澄清顺序、边界措辞 | 自动生效并留痕 | 可回滚;触及对外承诺口径时升格人工 |
| L3 能力与契约 | skillIds / delivery / pricing / stateContract | 提案 → 人工批准 → 既有编译器门禁 | 版本递增、旧订阅禁用、失败回滚 |
六条红线
audience只能服务端推导,客户端传入即 400;- 客户面永不出现 RSI 工具(工具可见性 + 执行期双重校验);
- 客户内容只能生成
pending候选,不能直接改知识 / 边界; - 自我修改不碰 L3 字段,除非走提案 + 编译器门禁;
- 复盘与所有者面只拿摘要、指标与指针,不回写客户原文;
- 每条知识 / 经验必须带来源与可回滚版本;无来源的不生效。
授权:点击、一次性凭证与邮箱验证码
变更不是“点一下就直接改”。一次决策由三样东西共同成立:
- 用户消息:所有者必须在对话里明确写出
approve/reject <changeId>; - 一次性凭证:前端点击后由服务端签发,绑定
agentId + changeId + owner + decision,5 分钟内有效,只能消费一次; - 决策:带凭证调用
/decide,服务端用expectedVersionCAS 消费,并把authorizationId写进提案。
L3 还多一道邮箱验证码:
点击 Approve/Reject
→ 服务端发送 6 位验证码到 owner 邮箱(10 分钟有效,最多输错 5 次)
→ 在卡片内输入验证码
→ /authorize/verify 校验通过 → 签发 assurance=email_otp 的 token
→ /decide 消费 → 契约重编译验证码只走“邮件 → 用户 → 前端 → 后端”:不进入聊天正文、不返回给模型、不落日志。 没有可用邮箱时 L3 直接失败(fail-closed),不会降级成点击授权。
模型不能自批:confirm 是模型填的,不可信;真正的证据是用户消息和一次性凭证。
为什么不做“全自动自改”:门面一旦自主改动对外口径,越界承诺率会从 0 变成非零—— 而那条指标是红线,不是目标。
可回放、可回滚
知识、经验、复盘、提案、信号全部落在状态层,每次写入都带:
actor:谁做的(人 / agent / 平台);causedByEventId:由哪个事件触发;version:第几次变更。
因此可以回答:这条口径是谁在什么时候、因为哪次复盘改的? 也可以回到任意时点验证“如果当时没改,会怎样”。
自进化的节奏
| 时间 | 你做什么 | agent 做什么 |
|---|---|---|
| 周一 | 看上周复盘:哪些问题反复出现、哪些能力缺失 | 03:30 已生成报告,收件箱里等你 |
| 周二 | 把新法规资料投喂给它,确认 2 条待审知识 | 自动批准合规的条目,其余标为待审 |
| 周三 | 批准 1 条 L2 话术建议,拒绝 1 条 L3 能力变更 | 记录你的决策(这也会影响它主动打扰你的频率) |
| 周四 | 不小心说错一次口径,随手纠正 | 生成一条待审 lesson,不直接改对外话术 |
| 周五 | 查看澄清完成率与知识命中率 | 继续积累证据,不打扰你 |
“它什么时候主动提醒你”是另一个特性,见 智能体主动模式。
创新点
1. 自评但不自欺
复盘报告里每一条结论都必须能回查;没有证据的结论直接丢弃并计数。 “整体表现良好,建议继续优化”这种话进不了报告。
2. 提案有证据,签字有人
agent 可以提出改知识、改话术、改能力,但等级由平台判定,L3 永远人工批准, 批准后仍走契约编译器的既有门禁——Agent RSI 不绕过任何审核。 对话内批准 L3 还必须通过邮箱验证码;验证码不经过模型,也不写进聊天记录。
3. 先隔离身份,再谈进化
所有者面与客户面在身份、prompt、工具可见性上完全分开; 客户无法“教坏” agent,所有者也不会被当成客户处理。
4. 一切可回放
知识、经验、提案、信号都在同一条事件流里,可审计、可回滚、可追责。
5. 进化有边界
L0–L2 自动、L3 人工;对外承诺口径即使属于 L2 也升格人工。 “变得更强”不等于“变得更敢承诺”。
边界:如实列出
| 项 | 现状 |
|---|---|
| 行业订阅的真实抓取 | 只留端口;未接实现前 Observe 环不产出摘要 |
| 新闻影响评估 | 只做关键词相关性,无法判断“这条新闻是否改变了现有结论” |
| 新闻 → 知识自动转化 | 刻意保持人工(成本换准确) |
| 复盘建议 → 知识条目 | 需要人工把建议转成条目,未做自动接线 |
| PDF / docx 结构化解析 | 未做:由模型先读成结构化字段再投喂 |
| 周复盘 / 趋势报告 | 只做日复盘 |
| L3 对话内批准 | 已实现:邮箱验证码 + email_otp token;没有验证码不能降级成点击授权 |
| 授权频率限制 / 双人复核 | 未做:当前只有单 challenge 5 次尝试上限 |
| 已消费凭证撤销 | 未做:token 消费后不可撤销;需要新的变更提案回滚 |
怎么判断它有用
| 指标 | 含义 | 健康线 |
|---|---|---|
| 复盘采纳率 | 被采纳的提案 / 总提案 | 高于 20%(过低说明报告没价值) |
| 幻觉结论率 | 无 evidence 被丢弃的结论比例 | 持续下降 |
| 越界承诺率 | 抽检出现价格 / 时限 / 结论承诺 | 等于 0(红线) |
| 知识命中率 | 客户对话引用知识 / 总对话 | 按场景设阈值 |
| 客户侧指标 | 澄清完成率、登记转化、满意度 | 自进化前后对比 |
相关阅读
- 所有者审批与授权——怎么批 L1/L2/L3、验证码与失败处理
- 智能体主动模式——它如何决定何时主动找你
- 知识库——复盘沉淀下来的东西最终去了哪里
- 门面 Agent 与 AgentRuntime——自进化与对话共用同一个运行时
- 门面 Agent——为什么它不能承诺价格与时限
- 状态层——可回放、可回滚的底座
源码位置(开发者)
| 能力 | 文件 |
|---|---|
| 双面身份推导 | libs/modules/src/agent-profile/services/dialogue-audience.ts |
| 两套 prompt | libs/modules/src/agent-profile/services/facade-prompt.ts |
| 复盘报告与证据门禁 | libs/modules/src/agent-runtime/rsi/review-report.ts |
| 复盘输入 / prompt / 调度 | libs/modules/src/agent-runtime/rsi/{review-input,review-prompt,agent-rsi.scheduler}.ts |
| 投喂 / 提案 / 变更应用 | libs/modules/src/agent-runtime/rsi/{ingest-material.tool,change-proposal,agent-change.service,propose-change.tool}.ts |
| owner 面工具 | libs/modules/src/agent-runtime/rsi/{read-owner-inbox.tool,remember-lesson.tool,decide-change.tool}.ts |
| 一次性授权 / 邮箱验证码 | libs/modules/src/agent-runtime/rsi/{change-authorization,change-authorization.service}.ts |
| 对话里的提案卡片 | propose-change.tool.ts → metadata.proposalCard;frontend/src/components/agent/ChangeProposalCard.tsx |
| 知识条目与检索 | 见 知识库 · 源码位置 |