# 企微回复质量闭环:Evolva 工程机制借鉴与实现记录 ## 1. 范围与结论 本轮借鉴的是 Evolva 的工程机制,不是客服话术。已确认的可迁移机制包括:按权重与预算注入上下文、最终输出前验证、证据不足时限次恢复、检查结果与过程留痕。Evolva 的质量基线主要验证工具路由、上下文/记忆检索、验证门、恢复和 checkpoint,不能据此宣称其拥有更自然的企微客服表达。 本项目的“首句直接回答、必要依据、最多一个高信息增益问题、阶段下一步”等规则,是结合企微沟通场景和现有业务反馈定义的通用回复契约。房产带看、具体房源、学区、产权等行业目标不进入通用包;项目可通过 `QIWEI_AGENT_BUSINESS_GOAL` 和 `QIWEI_AGENT_STAGE_PLAYBOOK` 加载业务覆盖层。 ## 2. 改造前基线 2026-08-05 使用真实 `AgentWorkbenchService`、内存发送桩和 11 类固定低质量候选执行 `autopilot` 基线,不调用真实企微、不写业务远端数据。 | 指标 | 改造前 | | --- | ---: | | 低质量候选 | 11 | | 被直接外发 | 11 | | 被阻断 | 0 | | 低质量拦截率 | 0% | 覆盖场景:首次咨询空泛开场、价格绝对承诺、多问题盘问、异议未回应、催促空话、投诉过度承诺、纯致谢续聊、已回答信息重复追问、字面重复追问、工具无结果却编造结果、仅回复“好的”。 原链路已有能力只有:结构化 JSON、客户原话 grounding 降级、风险词降低置信度、`requiresHuman`、纯确认/致谢不回复。缺少 deterministic verifier、一次修订恢复、发送前统一闸门和结构化质量审计,`autopilot` 会直接发送非空回复。 ## 3. 通用回复契约 回复内容按场景启用,不机械输出固定四段: 1. 首句实质回应当前问题、顾虑或投诉,不用重复问候和处理过程占位。 2. 随后只补充会话、画像、规则或工具事实能支持的必要依据;未知事实明确待确认。 3. 最多追问一个信息增益最高的问题,不重复已经问过或已经回答的字段。 4. 末句给出与当前阶段相符的可执行下一步。 5. 纯确认或致谢且没有新问题、风险或动作时不回复。 Planner 根据 acknowledgement、direct question、first consultation、continuation、objection、urgent follow-up、complaint、tool no result 等场景选择“直接回答、顾虑、已知事实、待确认风险、下一步”内容块。 ## 4. 确定性验证与恢复 Verifier 当前输出 14 项发送门检查,并附带一项非阻断的条件提议说明: | 检查 | 说明 | | --- | --- | | `direct_answer` | 首句是否为实质回应;异议、投诉、无结果有场景专用规则 | | `fact_evidence` | 按分句核验数字、价格、库存、资格等事实;证据必须与具体断言匹配 | | `continuity` | 不复读上一轮完整回复 | | `question_count` | 同时计算问号、疑问意图和独立字段,最多一个问题 | | `length` | Agent 正文非空且不超过通用上限;致谢场景必须为空 | | `repeated_greeting` | 多轮会话不重复问候 | | `repeated_question` | 拦截字面重复及预算、时间、人数等已回答字段的同义追问 | | `stage_next_step` | 末句包含当前阶段可执行动作 | | `risk_handoff` | 风险或高意向场景明确人工角色和可执行核验边界;声称已交接时必须有真实证据 | | `human_boundary` | 风险或高意向场景同步设置 `requiresHuman=true` | | `sensitive_commitment` | 按分句阻断保证、绝对、最低价等未经证实承诺 | | `future_promise_evidence` | “稍后核实/再通知/会回电”等未来动作有同类型成功证据 | | `performed_action_evidence` | “已经转交/正在处理”等已执行声明有同类型成功证据 | | `internal_leakage` | 不外发评分、检查项和内部运行字段 | 首次生成不通过时,运行时根据失败检查最多修订一次。再次不通过或修订调用失败时设置 `requiresHuman=true`,并返回 `qualityScore`、`qualityChecks`、`rewriteCount`、`fallbackReason` 供内部审计。服务层再次验证 Agent 内容,`auto` 与 `autopilot` 均不能绕过;人工 `manualSend` 和人工编辑后 `approveDraft` 仍只执行原有白名单、私聊和长度边界。 ## 5. 上下文权重 Claude 业务提示按请求构建并分别限额: | 分区 | 提示预算 | | --- | ---: | | 执行约束与回复契约 | 31% | | 最近有效会话 | 32% | | 客户画像与证据 | 15% | | 未完成问题/待办/风险 | 12% | | 工具事实 | 10% | 系统上下文按“权威边界 30%、相关记忆 20%、受控业务规则 50%”限额。权威顺序固定为:最近有效会话与本轮工具事实 > 带证据画像 > 未完成问题 > 受控规则 > 相关记忆 > 旧模型 Session。预算报告可由单次 `build*Result()` 返回用于测试,不进入共享并发业务审计。 ## 6. A2 专项结果 专项入口:`npm run agent:quality-smoke`。 | 指标 | 改造前 | 当前 | | --- | ---: | ---: | | 低质量样本 | 11 | 11 | | 低质量拦截 | 0 | 11 | | 低质量拦截率 | 0% | 100% | | 合格样本 | 未设门禁 | 11 | | 合格样本误杀 | 未设门禁 | 0 | | 合格样本误杀率 | 未设门禁 | 0% | A4 后续确定性退化修复另见 [A4 回复质量退化修复与契约冻结](./qiwei-response-quality-a4-regression.md)。当前通用仓还固化了 10 条 A4 去标识化冻结坏回复,指定 hard check 覆盖 10/10;该结果不等同于 48 条真实模型盲测结论。 专项还覆盖:无关 citation + 虚构价格、无关 tool result + 库存已确认、分句追加“其他待核验”、真实同值引用、空泛直接回答、一个问号包含三个字段、已回答预算的同义重复追问、一次修订成功/失败、请求绑定预算报告,以及 review/auto/autopilot/人工/纯致谢模式矩阵。 现有 `agent:smoke` 同步更新并通过 48 项。上述 11+11 是确定性门禁回归,不等同于真实客服自然度盲测。 ## 7. A3 独立评测资产 业务评测副本已冻结 A3-v2 共 48 条匿名场景,其中房产业务 40 条、通用客服 8 条。通用场景覆盖首次收费咨询、已回答字段连续性、工具无结果、催促、异议、纯致谢、内部字段泄露和投诉;每条均包含匿名输入、必要历史/画像/工具事实、场景标签、golden constraints 和 8 维期望。量表维度为直接回答、相关性、事实可追溯、自然度、上下文连续、信息增益、行动推进、风险边界,通过线为 75/100,并设置核心维度下限与硬失败。 生成校验结果:48 个 ID 唯一且与 A4 contract 顺序一致,8 维字段完整,12 个文件严格 UTF-8 解码通过,手机号、wxid、token、邮箱和长数字 ID 扫描 0 命中。 证据边界:4 条匿名历史样本全部来自已拒绝草稿,其中 3 条输入相同,只能观察失败类型,不能估计旧版总体通过率或准确率。48 条旧式回复均标记为 `synthetic_fixture`,只验证评分管线和 A4 接口,不计入旧版实测胜率。 A4 当前只完成发送门禁层配对:旧版低质量拦截 0/11,新版 11/11;新版合格样本误杀 0/11。48 条回复文本盲测状态为 `awaiting_candidates`,需要冻结的旧版/新版同 ID 响应对后才计算自然度、信息增益等 8 维胜率。 ## 8. 审计字段 - `qualityScore`: 0-100 的内部确定性检查得分。 - `qualityChecks`: 检查 ID、是否通过、权重、是否硬失败和简要说明。 - `rewriteCount`: 0 或 1。 - `fallbackReason`: 稳定流程 code:`quality_gate_failed`、`rewrite_limit_reached`、`requires_human` 或 `quality_unavailable`;具体失败项从 `qualityChecks`/`hardFailureIds` 读取。 这些字段写入内部返回、工具轨迹和审计详情,不进入客户回复。 ## 9. 当前边界 - 未发布 npm。 - 未调用真实企微发送。 - 未写业务远端数据。 - 未迁入房产 Provider、云函数或房产业务目标。 - 尚待 48 组冻结的旧版/新版同 ID 回复完成 8 维文本盲测、退化项和典型差异。