Commit c0614d3a by luoqi

docs(algorithm): 补充治疗链合成 + AI 话术生成两个算法(5 算法完整)

审计发现通俗文档漏了 2 个够格的决策算法,补上:

§四 治疗链合成算法(chain-composer):
- 5 阶段 S1发现→S5闭环 + 4 状态(发现/进入/执行中/已闭环)
- 按牙位 union-find 分链;6 种生命周期(一次性/线性/根管+冠/长周期/周期性/终身维护)
- 牙周 lifelong_maintenance maxStage=4 永不闭环(临床事实非 bug)
- 闭环条件严(全 milestone+复查+无退费+无反弹)+ 替代闭环
- 定位:画像"治疗链状态"标签的深层引擎 + UI 可视化进度条

§五 AI 话术生成算法(Skills harness):
- "搭积木"非套模板:4 维度装配话术包(场景/病种 K00-K09/人群/新老客)+ 大模型润色
- 三道安全护栏(只认提纲事实 / 禁词不承诺不写死时间 / 失败降级模板)
- 可追溯(skills_used + promptVersion + token)
- 运营改 MD 不动代码

配套更新:
- §〇 流水线图 3→5 算法(治疗链作支撑算法喂画像 + 可视化)
- §六 端到端 卜晓平 加治疗链 + 话术两步
- 一句话总括 + FAQ 补 治疗链永不闭环 / AI 话术护栏 两问

至此 5 算法完整:召回(谁)→画像+治疗链(是谁/到哪)→优先级(先打谁)→话术(怎么打)
parent b7d424d7
......@@ -14,19 +14,24 @@
诊所每天产生大量就诊记录(诊断、治疗、收费、预约……),但里面藏着很多"漏掉的机会":
医生说过"这颗牙该补",患者却一直没来补;种植做完该年度复查,患者忘了(将来实现)……
PAC 做三件事,像一条流水线:
PAC 的算法连成一条流水线,客服拿到的是排好序、带背景、带话术的电话清单:
```
全院患者 客服每天的电话清单
│ ▲
│ ① 召回算法 ② 画像算法 ③ 优先级算法 │
└──「谁该被请回来?」──→「这个人是谁?」──→「先打给谁?」──┘
(筛出候选) (了解背景) (排好顺序)
全院患者 客服每天的电话
│ ▲
│ ① 召回算法 ② 画像算法 ③ 优先级算法 ⑤ 话术生成 │
└「谁该回来?」──→「他是谁?」──→「先打给谁?」──→「怎么打?」────┘
(筛候选) (贴标签) (排顺序) (定制脚本)
│ ④ 治疗链合成「治疗走到哪一步?」
└ (算出治疗进度,喂②的治疗链标签 + 画可视化进度条)
```
- **① 召回算法**:从几万患者里,筛出"该回来做点什么、但还没做"的人。
- **② 画像算法**:给每个筛出来的患者贴标签(价值高不高、容易流失吗、能不能打扰)。
- **③ 优先级算法**:把这些人排个先后,客服时间有限,先打最该打的。
- **④ 治疗链合成算法**:还原每个患者"治疗走到哪一步",既喂②的"治疗链状态"标签,也单独画成可视化进度条(支撑算法)。
- **⑤ AI 话术生成算法**:按患者具体情况,生成定制通话脚本(怎么开场、怎么应对异议)。
> ⚙️ **关于数值**:本文列出的**权重/分档/阈值都是"出厂默认配置",可按宿主或集团策略调整**
>(不同集团对种植 vs 补牙的重视、对"多久算流失"的口径可能不同)。
......@@ -261,7 +266,101 @@ score = clamp(round(raw), 0, 100) ← 取整 + 夹到 0~100,保证不越界
---
## 四、三者怎么配合(端到端)
## 四、治疗链合成算法 —— "这患者的治疗走到哪一步了?"
前面画像的"治疗链状态"标签(进行中/有缺口/已闭环)是**浅层结论**;治疗链合成算法是它**底下的引擎**——把一颗牙(或一组牙)从"发现问题"到"彻底做完"的整条路径还原出来,客服详情页的**治疗链可视化**就是它画的。
### 一条治疗链的 5 个阶段
```
S1 发现 医生诊断出问题(缺牙/龋齿…) ← 召回算法盯的就是停在这步的
S2 进入 患者同意/挂号/付费,正式启动
S3 执行 真正在做治疗(种植植体、根管…)
S4 复查 术后复查 / 定期检查
S5 闭环 全部做完 + 复查通过 + 没反弹
```
客服看到的 4 种状态:**发现(★机会)/ 进入 / 执行中 / 已闭环**
### 三个关键设计
**① 按牙位分链**:同一颗牙的所有治疗归一条链,不同牙各自成链(用牙位重叠 union-find,跟召回算法同一套合并逻辑)。
**② 不同治疗"闭环"标准不同**(生命周期模型):
| 生命周期 | 例子 | 怎么才算闭环 |
|---|---|---|
| 一次性 | 补牙、拔牙 | 做完即闭环 |
| 线性多步 | 种植(植体 + 冠) | 几步都做完 |
| 多步 + 冠保护 | 根管(做完还得戴冠,否则牙易裂) | 根管 + 冠都做完 |
| 长周期 | 正畸 | 整个疗程走完 |
| 周期性 | 年度复查类 | 按周期持续 |
| **终身维护** | **牙周病** | **永远不闭环**(只能"在管",牙周需终身维护) |
**③ 闭环条件比"做过"严得多**:不是做过一次治疗就算完,要**全部步骤命中 + 有复查 + 没退费 + 没反弹诊断**才闭环。
> 📐 **证据**(`chain-composer.service.ts` + `canonical-codes.ts`):
> ```
> 阶段:S1 discovered → S2 entered → S3/S4 ongoing → S5 closed
> 分链:同 (chainLabel + 牙位 overlap) union-find,保留 stage 最高的
> 生命周期:TreatmentLifecycles —— one_shot / linear / linear_then_crown /
> long_term / periodic / lifelong_maintenance(maxStage=4 永不闭环)
> 闭环:全 milestone 命中 + S4 复查 + 无 refund 后置 + 无反弹诊断 + lifecycle.maxStage=5
> 替代闭环:同牙后续有"已治"链 → 当前 discovered/entered 链标记为已闭环(避免重复召回)
> ```
> 各治疗的步骤(milestones)/ 生命周期归属可配,真理源在 `TreatmentMilestones` 字典。
> **本质**:治疗链合成把零散的治疗记录,还原成一条条"从发现到闭环"的路径——既给画像贴"治疗链状态"标签,也给客服画出可视化的进度条。
---
## 五、AI 话术生成算法 —— "电话该怎么打?"
排好了打给谁,客服还需要"开口说什么"。AI 话术生成根据**这个患者的具体情况**,生成一份定制的通话脚本(开场 / 切入话题 / 异议应对 / 结束确认 4 段)。
### 不是套模板,是"搭积木"
PAC 把话术拆成一块块**话术包**(技能 / skill),按患者特征**动态拼装**,再交大模型润色成自然话术:
```
按 4 个维度挑话术包:
① 召回场景 —— 新链召回(发现没做)
② 诊断病种 —— K00–K09 各有专属话术包(种植怎么聊 ≠ 补牙怎么聊)
③ 人群 —— 儿童(对家长说)/ 青少年 / 成人 / 老人(语速慢、复述)
④ 新老客 —— 新客(详细自报家门)/ 老客(可家常、引用历史)
+ 异议库 + 安全规则
→ 拼成给大模型的指令 → 大模型生成 4 段话术
```
举例:一个**70 岁老人****缺牙**召回,会自动拼上"种植话术包 + 老人沟通包 + (老客/新客)包",生成的话术就会**语速提示慢、主动提家属商量、不催**
### 三道安全护栏(不让 AI 乱说)
| 护栏 | 防什么 |
|---|---|
| **只认提纲事实** | 只能用系统给的诊断/医生/时间,**不许编**(医生没说的不准说) |
| **禁词 + 不承诺** | 不许"保证治好"、不许报价、不许写死时间(诊所没排班接口,时间只能是"示例") |
| **失败降级** | 大模型出错或违规 → 自动退回安全的模板话术,客服永远有东西可用 |
### 可追溯
每次生成都记录:**用了哪些话术包 + 大模型版本 + 花了多少 token**,出问题能复盘归因。
> 📐 **证据**(`skill-composer.ts` + `skills/*/SKILL.md` + `call.ts`):
> ```
> 话术包 = SKILL.md(Anthropic Skills 标准格式),按 frontmatter.applies 声明式匹配:
> scenario / diagnosisCodePrefix / ageMin-ageMax / relationship
> 装配 = base 通用铁律 + 匹配到的 skill 正文 → system prompt(同患者命中相同包 → 命中缓存)
> 安全 = call.ts safetyRules(禁词 / close 段无加粗时间 / 无承诺式表述)+ 失败走 fallback 模板
> 落账 = agent_invocations(promptVersion / skills_used / token / cost)
> ```
> 话术包是 MD 文件,**运营可改文案不动代码**;新增病种/人群话术 = 加一个 SKILL.md。
> **本质**:话术生成不是"一个大模板",而是按患者特征搭积木 + 大模型润色 + 安全兜底,让每通电话的话术都贴合这个具体患者。
---
## 六、五者怎么配合(端到端)
用卜晓平走一遍完整流程:
......@@ -270,20 +369,22 @@ score = clamp(round(raw), 0, 100) ← 取整 + 夹到 0~100,保证不越界
扫全院 → 发现卜晓平 151 天前诊断"36 缺失",至今没种植,且没拔没约
→ 通过合规红线(在世/可联系)→ 进候选池,理由="缺失牙未启动修复"
② 画像算法
给卜晓平贴标签:价值=钻石卡高价值 / 流失风险=中(链有缺口) / 治疗链=种植已发现未启动 / 可联系
→ 客服打电话前就知道"这是个重要客户,值得好好聊"
② 画像算法(+ ④ 治疗链合成在背后)
给卜晓平贴标签:价值=钻石卡高价值 / 流失风险=中(链有缺口) / 可联系
④ 治疗链合成算出他 36 号牙这条链停在"S1 发现"(种植已发现未启动)→ 喂"治疗链状态"标签 + 画进度条
→ 客服打电话前就知道"重要客户 + 治疗卡在最开头,值得好好聊"
③ 优先级算法
综合 6 因素算出 87 分 → 在今天的电话清单里排很靠前
→ 客服优先打给他,且看得到"为什么是 87 分"
(再往后)
客服点"生成话术" → AI 根据卜晓平的年龄/缺牙情况/老客身份,生成定制开场白和应答
⑤ AI 话术生成
客服点"生成话术" → 按"种植 + 老客 + 成人"装配话术包 + 大模型生成
→ 出来一份贴合卜晓平的开场白 / 异议应对 / 结束确认(且不编事实、不报价、不写死时间)
```
**一句话总括**:
> **召回算法**筛出"该回来的人",**画像算法**告诉客服"他是谁",**优先级算法**排好"先打谁"——三者串成一条流水线,把诊所散乱的就诊数据,变成客服每天一份**排好序、带背景、可解释**的电话清单。
> **召回**筛出"该回来的人",**画像 + 治疗链**告诉客服"他是谁、治疗走到哪",**优先级**排好"先打谁",**话术生成**定制"怎么打"——五个算法串成一条流水线,把诊所散乱的就诊数据,变成客服每天一份**排好序、带背景、可解释、带脚本**的电话清单。
---
......@@ -300,3 +401,9 @@ A:画像目前全是明确规则算的(不是 AI 猜),比如"消费多少算高
**Q:换一家诊所/集团,算法还能用吗?**
A:能。算法逻辑跟具体诊所无关,新诊所只需要把自己的数据按格式对接进来,算法直接复用。
**Q:治疗链为什么有的"永远不闭环"?**
A:不是 bug。牙周病这类需要终身维护(每 3–6 个月复查),临床上没有"治好了"的终点,所以算法让它最高停在"复查管理中(S4)",永远不标"闭环"——这是临床事实,不是算法缺陷。
**Q:AI 话术会不会瞎编、乱承诺?**
A:有三道护栏:① 只能用系统给的事实(医生没说的不许说);② 禁词 + 不许报价 + 不许写死时间;③ 出错/违规自动退回安全模板。且每段话术都按患者真实情况(病种/年龄/新老客)定制,不是套一个大模板。
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment