Commit 9bea4619 by luoqi

docs(algorithm): 权重数值不写死 — 标注"可按宿主配置,真理源在代码"

按反馈:权重/分档/阈值是可调参数(不同集团对种植vs补牙重视不同),
不该写死进文档(改参就要改文档 + 误导成"铁律")。改为只讲算法结构:

- 顶部加 ️ 全局说明:数值皆默认可配,文档讲结构不写死数字
- §一 病种表:去掉 base/cooldown 具体数值,保留病种 + 临床价值排序;
  证据块只点"起步分/冷静期是可配默认值,真理源在代码"
- §三 优先级因素表:去掉精确权重(60/+20/×0.9 等),改"方向"描述
  (越值钱起步越高 / 越可信折扣越接近1);保留算法结构公式形状
  + clamp/round 含义说明(取整 + 夹 0~100 保证不越界)
- 卜晓平例子:保留(具体走一遍需数字),标注"用默认权重,换配置随之变"

顺修 §四 端到端 流失风险 低→中(跟修正后的 87 分例子自洽:链有缺口=medium)
parent 6e68bae1
...@@ -28,6 +28,11 @@ PAC 做三件事,像一条流水线: ...@@ -28,6 +28,11 @@ PAC 做三件事,像一条流水线:
- **② 画像算法**:给每个筛出来的患者贴标签(价值高不高、容易流失吗、能不能打扰)。 - **② 画像算法**:给每个筛出来的患者贴标签(价值高不高、容易流失吗、能不能打扰)。
- **③ 优先级算法**:把这些人排个先后,客服时间有限,先打最该打的。 - **③ 优先级算法**:把这些人排个先后,客服时间有限,先打最该打的。
> ⚙️ **关于数值**:本文涉及的**权重/分档/阈值都是默认配置,可按宿主或集团策略调整**
>(不同集团对种植 vs 补牙的重视、对"多久算流失"的口径可能不同)。
> 文档只讲**算法结构(公式形状 + 方向)**,**具体数字不写死**——真理源在代码/配置,改参不改文档。
> 下面 `📐 证据` 块里出现的少量数字仅作示例,帮助理解量级,不代表固定法则。
下面逐个讲。 下面逐个讲。
--- ---
...@@ -54,24 +59,25 @@ PAC 做三件事,像一条流水线: ...@@ -54,24 +59,25 @@ PAC 做三件事,像一条流水线:
### 覆盖哪些情况 ### 覆盖哪些情况
按牙科疾病大类(ICD-10 的 K00–K09),PAC 覆盖 **10 种**"发现了没去做"的情况。 按牙科疾病大类(ICD-10 的 K00–K09),PAC 覆盖 **10 种**"发现了没去做"的情况
表里的 **基线分** 就是这种病的"重要程度起步分"(越值钱/越严重越高,直接进优先级算法): (下表按临床价值从高到低排,**每种病的"起步分/冷静期"是可配默认值,不写死在此**):
| 诊断码 | 情况 | 大白话 | 基线分 | 冷静期(天) | | 诊断码 | 情况 | 大白话 |
|---|---|---|---|---| |---|---|---|
| K08 | 缺失牙未修复 | 缺了牙没去种/没镶 | **60** | 30 | | K08 | 缺失牙未修复 | 缺了牙没去种/没镶(价值最高,种植 ¥1.5–3 万) |
| K07 | 错颌畸形未正畸 | 牙不齐没去矫正 | 55 | 30 | | K07 | 错颌畸形未正畸 | 牙不齐没去矫正 |
| K04 | 牙髓炎未做根管 | 牙神经发炎没去做根管 | 52 | 14 | | K04 | 牙髓炎未做根管 | 牙神经发炎没去做根管 |
| K05 | 牙周炎未做基础治疗 | 牙周病没去洗治 | 50 | 30 | | K05 | 牙周炎未做基础治疗 | 牙周病没去洗治 |
| K09 | 颌骨囊肿未处理 | 颌骨囊肿没去摘 | 50 | 14 | | K09 | 颌骨囊肿未处理 | 颌骨囊肿没去摘 |
| K02 | 龋齿未充填 | 蛀牙没去补 | 45 | 14 | | K02 | 龋齿未充填 | 蛀牙没去补 |
| K03 | 牙体损伤未修复 | 牙磨损/缺损没去修 | 35 | 14 | | K03 | 牙体损伤未修复 | 牙磨损/缺损没去修 |
| K06 | 牙龈牙槽问题未处置 | 牙龈问题没去看 | 35 | 14 | | K06 | 牙龈牙槽问题未处置 | 牙龈问题没去看 |
| K01 | 阻生牙未拔除 | 智齿该拔没拔 | 30 | 14 | | K01 | 阻生牙未拔除 | 智齿该拔没拔 |
| K00 | 牙发育/萌出异常未处置 | 儿童换牙/长牙问题没去看 | 25 | 30 | | K00 | 牙发育/萌出异常未处置 | 儿童换牙/长牙问题没去看 |
> 📐 **证据**:基线分 = scenario 配置 `SUB_SCENARIOS[*].base`;冷静期 = `DiagnosisTreatmentMap[K??].cooldownDays`。 > 📐 **证据**:每种病的 **起步分**(`SUB_SCENARIOS[*].base`)+ **冷静期 / 黄金窗 / 紧迫临界**
> 排序体现临床价值:种植(¥1.5–3 万)> 正畸 > 根管 > 牙周 > 龋齿 > 智齿。**不漏码**:出现的 K-code 都进池,低基线的靠分数自然沉底。 >(`DiagnosisTreatmentMap[K??]`)是**集中可配的默认值**,真理源在代码,改参不改本文。
> **不漏码**:host 数据出现的 K-code 都进池,起步分低的靠综合分自然沉底。
### 三道"过滤网"(避免打错电话) ### 三道"过滤网"(避免打错电话)
...@@ -191,34 +197,38 @@ PAC 做三件事,像一条流水线: ...@@ -191,34 +197,38 @@ PAC 做三件事,像一条流水线:
### 分数怎么来(6 个因素) ### 分数怎么来(6 个因素)
把它想成**给每个召回机会打分,像考试加权**: 把它想成给每个召回机会打分,像考试加权。**6 个因素 + 它们怎么影响分数的方向**(具体权重值可配,见下注):
| 因素 | 通俗解释 | 📐 取值证据 | | 因素 | 通俗解释 | 方向 |
|---|---|---| |---|---|---|
| **① 临床基线** | 这种病本身多重要 | 病种基线分(K08=60 / K07=55 / K04=52 / K05=50 / K02=45 / … / K00=25)| | **① 临床基线** | 这种病本身多重要 | 病种越值钱/越严重 → 起步分越高(乘法主项) |
| **② 时间窗形状** | 现在是不是召回最佳时机 | 黄金窗内 ×1.0;过早 0.6→1.0 线性;过晚 1.0→0.4 衰减(2× 窗末降到底) | | **② 时间窗形状** | 现在是不是召回最佳时机 | 黄金窗内最高;过早 / 过晚都打折(乘在基线上) |
| **③ 患者价值加分** | 高价值患者加分 | 钻卡 +20 / 金卡 +15 / 银卡 +10 / 普通 +5 / 新客 +0 | | **③ 患者价值加分** | 高价值患者加分 | 价值档越高 → 加得越多(加法) |
| **④ 转化可能加分** | 接电话后真来的可能性 | `(3−风险档)×2`(0–6)+ 近期回访成功 +4,上限 +10 | | **④ 转化可能加分** | 接电话后真来的可能性 | 越可能转化(流失风险低 / 近期回访成功)→ 加得越多 |
| **⑤ 临床紧迫加分** | 再拖会出大问题 | 诊断天数 > 该病种紧迫临界 → +5(如缺牙 >120 天) | | **⑤ 临床紧迫加分** | 再拖会出大问题 | 诊断超过该病种"紧迫临界" → 固定加分 |
| **⑥ 信号可信度** | 召回理由多靠谱 | 最低 confidence ≥0.9→×1.0;≥0.7→×0.9;否则 ×0.75 | | **⑥ 信号可信度** | 召回理由多靠谱 | 信号越可信(医生诊断 > AI 抽取)→ 折扣越接近 1(乘法) |
**完整公式**(代码 `priority-scorer.ts` 1:1): **算法结构**(形状固定,权重可配):
``` ```
raw = (base × timeWindowFactor + valueBonus + likelihoodBonus + urgencyBonus) × confidenceFactor raw = (临床基线 × 时间窗因子 + 价值加分 + 转化加分 + 紧迫加分) × 信号可信因子
score = clamp(round(raw), 0, 100) score = clamp(round(raw), 0, 100) ← 取整 + 夹到 0~100,保证不越界
``` ```
- 4 个加分项在括号里**相加**,然后整体乘 ②时间窗 和 ⑥可信度两个**0~1 折扣因子**
- 所以"再急再值钱,信号不可信(⑥低)也会被打折",避免 AI 误抽的理由冲高分。
> 📐 阈值都集中在 `priority-scorer.ts` 的 `computeXxx()` 函数,业务方改分档改这一处即可。 > ⚙️ **权重可配**:各因素的具体分档/加分值(起步分多少、钻卡加几分、置信折扣几档)都集中在
> `priority-scorer.ts` 的 `computeXxx()` 函数 + 病种字典,**按宿主/集团策略调,改这一处即可**。
> 本文不写死这些数字 —— 算法的"形状"稳定,"权重"可调。
### 真实例子:卜晓平,87 分 ### 真实例子:卜晓平,87 分(用**默认权重**走一遍,换配置则分值随之变)
| 因素 | 他的情况 | 贡献 | 对应公式 | | 因素 | 他的情况 | 贡献 | 对应公式 |
|---|---|---|---| | ------ | --------------------------- | ---------- | ----------------------- |
| 临床基线 | 缺失牙 K08 | 60 | base | | 临床基线 | 缺失牙 K08 | 60 | base |
| 时间窗 | 缺了 151 天 ∈ [30,180] 黄金窗 | ×1.0 | timeWindowFactor | | 时间窗 | 缺了 151 天 ∈ [30,180] 黄金窗 | ×1.0 | timeWindowFactor |
| 患者价值 | 钻石卡,累计 5.7 万+(≥¥3 万)| +20 | valueBonus | | 患者价值 | 钻石卡,累计 5.7 万+(≥¥3 万) | +20 | valueBonus |
| 转化可能 | 流失风险=中(链有缺口)→ (3−2)×2 | +2 | likelihoodBonus | | 转化可能 | 流失风险=中(链有缺口)→ (3−2)×2 | +2 | likelihoodBonus |
| 临床紧迫 | 151 > 紧迫临界 120(邻牙倾斜)| +5 | urgencyBonus | | 临床紧迫 | 151 > 紧迫临界 120(邻牙倾斜) | +5 | urgencyBonus |
| 信号可信度 | 医生明确诊断 confidence=1.0 | ×1.0 | confidenceFactor | | 信号可信度 | 医生明确诊断 confidence=1.0 | ×1.0 | confidenceFactor |
| **最终** | (60×1.0 + 20 + 2 + 5) × 1.0 | **= 87 分** | clamp(round(raw),0,100) | | **最终** | (60×1.0 + 20 + 2 + 5) × 1.0 | **= 87 分** | clamp(round(raw),0,100) |
...@@ -241,7 +251,7 @@ score = clamp(round(raw), 0, 100) ...@@ -241,7 +251,7 @@ score = clamp(round(raw), 0, 100)
→ 通过合规红线(在世/可联系)→ 进候选池,理由="缺失牙未启动修复" → 通过合规红线(在世/可联系)→ 进候选池,理由="缺失牙未启动修复"
② 画像算法 ② 画像算法
给卜晓平贴标签:价值=钻石卡高价值 / 流失风险= / 治疗链=种植已发现未启动 / 可联系 给卜晓平贴标签:价值=钻石卡高价值 / 流失风险=中(链有缺口) / 治疗链=种植已发现未启动 / 可联系
→ 客服打电话前就知道"这是个重要客户,值得好好聊" → 客服打电话前就知道"这是个重要客户,值得好好聊"
③ 优先级算法 ③ 优先级算法
......
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