-
feat(ai): S2.2 福利进话术 + 缓存失效规则 · cebde6b1
🔴 分配功能里**唯一一条「做错了会对患者做出虚假承诺」**的路。 ## 那个缓存坑的实际形状(已核实) `plan_scripts.planId` 是 **@unique**(一 plan 一话术),orchestrator 写的是 upsert; 而生成**只在有人点「生成」时才跑**,之后一路读缓存(loadPlanScript 直接 findUnique)。 召回池又是共享的、未分配的单谁都能打开触发生成。三段后果一段比一段重: ① 分配**之前**有人点开过 → 话术已 ready 落库,**福利段永远不会出现**,T4 的归因目的失效 ② plan 在批次 A(福利甲)→ 退回 → 进批次 B(福利乙)→ 话术缓存**还是甲的文案**, 客服照着念 = **对患者做了一个不存在的承诺** ③ 撤销批次后,话术里的福利仍在 ②③ 不是体验问题,是患者会按一个不存在的优惠上门、前台兑现不了。 ## 失效规则:**删除**,不是置 pending 置 pending 会把旧 content 留在库里,任何一条**只读 content 不看 status** 的路径 (现在没有,将来难保)都会把过期福利念出去 —— 而这正是要防的那件事。 删掉则物理上不可能读到;审计不丢(agent_invocations 那条记录还在,丢的只是指针)。 落在两处写路径的**事务里**: · `create()` 配了福利 → 作废这批的话术缓存 · `revoke()` 批次撤销 → **收回的和没收回的都作废**。没收回的那些(客服已打开过) 手里正拿着一份写着福利的话术,而福利刚被撤销 —— 那才是最危险的一批,他马上要打电话。⚠ ️ 只**作废**不急切重生成:作废是一句 deleteMany(很便宜);重生成是**懒的**, 客服打开详情页时走现有的"点生成"流程。一批 100 人若急切重生成 = 100 次 LLM 调用的 钱和延迟,而其中大部分单可能根本没人打开。懒生成让成本随**真实使用**走,不随批次大小走。 ## 福利作事实输入进 prompt(T4),带四条禁令⛔ 不走 `AGENT_IDENTITY_PLACEHOLDER` 那套占位符:那是给 **PII 与缓存**用的 (人名不进 LLM、换客服不用重生成);福利是**内容**不是身份 token,硬插一句会打断口语流, 且三档输出形态差异大,占位符要在每档各实现一次。作为事实输入则三档通用。 护栏的四条禁令,每条都对应一种真实会发生的编造: 不得追加条件/期限/名额/人群 ← "限本月前 20 名""老客户专享" 不得改写金额/折扣/项目、不得夸大 ← 把"免费"说成"5折" 原文没写的一律不说 ← 兜底 追问细节 → "以到院时前台说明为准" ← 不给出口它就会现编一个条款 标成「硬约束」,与"高龄不主推种植""低龄不承诺能不能种"同级,落点也放在一起。⚠ ️ 第一版我在 fact-block(标准/深度)和 stable/prompt(稳健)**各写了一份** —— 那必然会漂,而「哪一档漏了哪条禁令」要等客服念出去才发现。已抽成导出的 `benefitBlock`, 两档共用;spec 里加了一条断言直接读 stable/prompt 源码,拦"图省事再抄一份"。 没配福利 → **整段不生成**,不留空钩子(留了模型会自己编一个)。 ## 取数只认 confirmed 的批次 orchestrator 装配时 `plan.assignment.status === 'confirmed'` 才带福利 —— 撤销后的批次福利已不适用,带进去就是念一个作废的优惠。⚠ ️ 不判 expiresAt:时效是"客服什么时候该打完",不是"福利什么时候失效"; 福利本身的有效期写在文案里(如"8 月…"),由主管负责。 ## 验证 900 单测(新增 6 条护栏断言)+ 本地端到端: 造 6 份「旧话术」(模拟分配前被人点开过)→ 带福利分配 → **剩余 0 份**✅ 重新生成含新福利的话术 → 撤销批次 → **剩余 0 份**✅ 测试数据已清理。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>luoqi committed
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| admin | Loading commit data... | |
| ai | Loading commit data... | |
| assistant | Loading commit data... | |
| auth | Loading commit data... | |
| clinical-gap | Loading commit data... | |
| clinical-signals | Loading commit data... | |
| facts | Loading commit data... | |
| mcp | Loading commit data... | |
| patient | Loading commit data... | |
| persona | Loading commit data... | |
| plan | Loading commit data... | |
| plan-aggregate | Loading commit data... | |
| realtime-coach | Loading commit data... | |
| sync | Loading commit data... | |
| weixin-aibot | Loading commit data... |