Commit 10c1319f by luoqi

docs(algorithm): potential-treatment-recall §8 + canonical-fact-layer 对齐 v3 优先级

- potential-treatment-recall §8.2/8.3:旧 6 因子 scorer 伪码/张志远例 → v3 三维(急迫×.4+价值×.3+意愿×.3)
  × 新鲜度 × 置信度;例子换 94 分真实 breakdown;UI 明细更新;加 uplift 局限。
- canonical-fact-layer §7.2bis #11:timeWindowFactor → 新鲜度因子(W7 v3 改名,原理不变)。
- §9 PR 实施路径保留(W3 历史里程碑记录)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
parent 5a268d52
...@@ -769,7 +769,7 @@ WHERE p.active AND NOT pp.do_not_contact AND NOT pp.deceased ...@@ -769,7 +769,7 @@ WHERE p.active AND NOT pp.do_not_contact AND NOT pp.deceased
- 反馈方向:推动 DW 在结算明细补 `tooth_position`,或用 `treat_plan.planCode` 关联结算行,才能升级到牙位级排除。 - 反馈方向:推动 DW 在结算明细补 `tooth_position`,或用 `treat_plan.planCode` 关联结算行,才能升级到牙位级排除。
11. **时间窗别一杆当两用:入池边界 vs 优先级权重要分开**(W3 末同审计) 11. **时间窗别一杆当两用:入池边界 vs 优先级权重要分开**(W3 末同审计)
- 坑:把"黄金窗"(算优先级用,如缺牙 30-180 天)直接当**入池硬边界**(SQL `BETWEEN`),会把超上界的患者直接踢出池 —— 缺牙拖 1 年比拖 3 个月更该召,却因"超 180 天"漏掉(实测超窗 3 个全 >360 天,窗内仅 2 个)。 - 坑:把"黄金窗"(算优先级用,如缺牙 30-180 天)直接当**入池硬边界**(SQL `BETWEEN`),会把超上界的患者直接踢出池 —— 缺牙拖 1 年比拖 3 个月更该召,却因"超 180 天"漏掉(实测超窗 3 个全 >360 天,窗内仅 2 个)。
- 处理:入池上界放宽(如 730 天),黄金窗只喂给打分器算 `timeWindowFactor`(过晚衰减到 0.4);超窗患者照常入池、分数低、排后面。下界保留(刚诊断 <start 天还在考虑期,不急召)。 - 处理:入池**不设硬上界**,黄金窗只喂给打分器算**新鲜度因子**(W7 v3:过窗衰减到 0.4;旧称 timeWindowFactor);超窗患者照常入池、分数低、排后面。下界保留(刚诊断 <start 天还在考虑期,不急召)。
12. **fact 标准主体由 PAC 定,别被单一宿主牵着走 + 摄入断链体检**(W3 末审计 emr/影像) 12. **fact 标准主体由 PAC 定,别被单一宿主牵着走 + 摄入断链体检**(W3 末审计 emr/影像)
- 原则:`fact.content` schema = PAC 自己定的临床通用语义全集(所有宿主的统一投影目标)。 - 原则:`fact.content` schema = PAC 自己定的临床通用语义全集(所有宿主的统一投影目标)。
......
...@@ -369,7 +369,7 @@ PAC 把话术拆成一块块**话术包**(技能 / skill),按患者特征**动 ...@@ -369,7 +369,7 @@ PAC 把话术拆成一块块**话术包**(技能 / skill),按患者特征**动
## 六、五者怎么配合(端到端) ## 六、五者怎么配合(端到端)
用李梦维(真实召回患者,91 分)走一遍完整流程: 用李梦维(真实召回患者)走一遍完整流程:
``` ```
① 召回算法 ① 召回算法
......
...@@ -530,101 +530,51 @@ WHERE ...@@ -530,101 +530,51 @@ WHERE
- 7 天冷静期从软扣分改硬过滤 - 7 天冷静期从软扣分改硬过滤
- 多 brand 通过 `tenant_id` WHERE 自动隔离(brand 在 yaml 时已映射) - 多 brand 通过 `tenant_id` WHERE 自动隔离(brand 在 yaml 时已映射)
### 8.2 优先级(Layer 2)— 数值 ### 8.2 优先级(Layer 2)— v3.0 三维模型(W7 重做)
参考前面 6 因子讨论(本文不重复),整理成最终公式: W7 起替换旧 6 因子加权启发式为业务《画像字典 v3.0》三维模型(用上 8 个画像特征,见 `priority-scorer.ts`):
```typescript ```
function calcPriorityScore(input: { 综合(0-10) = 急迫性×0.4 + 价值性×0.3 + 意愿度×0.3
base: number; // 子场景基线(60 缺牙 / 55 根管 / ...) 最终分(0-100) = 综合 × 新鲜度 × 置信度 × 10
daysSince: number;
goldenRange: [number, number];
persona: Persona | null;
signalConfidences: number[]; // 各信号源 confidence,LLM 抽的可能 < 1
recentExecutions: Execution[];
}): { score: number; breakdown: PriorityBreakdown } {
// 1. TimeWindowFactor(看 daysSince 落在 golden 哪段)
const tw = computeTimeWindowFactor(input.daysSince, input.goldenRange);
const main = input.base * tw; // 0-60
// 2. ValueBonus(Persona value feature)
const value = input.persona?.features.find(f => f.key === 'value');
const valueBonus =
(value?.score ?? 0) >= 0.8 ? 20 :
(value?.score ?? 0) >= 0.5 ? 12 :
(value?.score ?? 0) >= 0.3 ? 5 : 0;
// 3. LikelihoodBonus(Persona recall_risk + 历史 execution)
const risk = input.persona?.features.find(f => f.key === 'recall_risk');
const riskBonus = Math.round((1 - (risk?.score ?? 0.5)) * 6);
const recentSuccessBonus = input.recentExecutions.some(e =>
['success_appointed', 'rescheduled'].includes(e.outcome)
) ? 4 : 0;
const likelihoodBonus = Math.min(10, riskBonus + recentSuccessBonus);
// 4. UrgencyBonus(daysSince 超 临床晋级临界 时加分)
const urgencyBonus = computeUrgencyBonus(input.daysSince /* + scenario-specific */);
// 5. SignalQualityDiscount(信号 confidence 低时降权)
// 如果都是 LLM 抽出来的低置信度信号,整体打折
const minConfidence = Math.min(...input.signalConfidences);
const confidenceFactor = minConfidence >= 0.9 ? 1.0 : minConfidence >= 0.7 ? 0.9 : 0.75;
const raw = (main + valueBonus + likelihoodBonus + urgencyBonus) * confidenceFactor;
const score = Math.max(0, Math.min(100, Math.round(raw)));
return {
score,
breakdown: {
main, base: input.base, timeWindowFactor: tw,
valueBonus, likelihoodBonus, urgencyBonus, confidenceFactor,
},
};
}
``` ```
**新增**:`SignalQualityDiscount` — LLM 抽出来的低置信信号别让它跟 ICD 码同等权重,这是公正的。 | 维度/因子 | 来源 | 取值 |
|---|---|---|
| **急迫性** ×0.4 | urgency_level 特征 | 紧急10/高7/中4/低1/无0(按末诊+复查超期)|
| **价值性** ×0.3 | 治疗类型+牙数 | 种植 单8/多9/半口10 · 正畸7 · 根管6 · 修复5-6 · 牙周5 · 拔3 · 补2 |
| **意愿度** ×0.3 | RFM依从×.375 + 主诉行为×.375 + 信任基础×.25 | RFM 八象限 / 咨询意向命中→8 / lifecycle+治疗史+1+转介+1+近1年到诊+1 |
| **新鲜度** ×(0.4-1) | daysSince vs 病种黄金窗 | 窗内 1.0,过窗线性衰减到 2×窗=0.4 —— **老诊断止损** |
| **置信度** ×(0.75-1) | 信号来源(code_source)| 医生诊断 1.0 / 影像AI·建议 0.9 / 更低 0.75 —— 防影像AI误判冲高分 |
### 8.3 张志远 v2 算分例子 **两处科学考量**:
- **新鲜度** = 旧 timeWindowFactor 的"过晚衰减"(入池不设硬上界,靠它软衰减止损;PAC 无丢单数据,这是止损替代)。
- **置信度** = 旧 SignalQualityDiscount(影像AI/LLM 抽的信号别跟医生诊断同权)。cluster 取最优来源置信度(max)。
> 张志远是 PAC 内部 mock 演示样本(不是宿主真实数据)。这里展示算分逻辑;W3 接 DW 真实数据后,瑞尔/瑞泰任一真实患者都按同样算分。 ### 8.3 算分例子(取自真实 `plan_reasons.breakdown`,94 分)
``` ```
patient: 张志远 / 42 / VIP金卡 / LTV ¥48,200 patient: 缺失 4 颗牙(11;14;22;24,潜在种植多颗),咨询过种植,重要价值客户,成熟客,有种植史,近期活跃
signals(独立 fact): 急迫性 = 紧急 → 10
diagnosis_record { code: 'K08', confidence: 1.0, toothPosition: '36', 价值性 = 种植多颗(4颗)→ 9
observed_at: 5 个月前(from 真实接诊事件,精确日期)} 意愿度 = RFM重要价值10×.375 + 主诉咨询过8×.375 + 信任(成熟9+种植史1)10×.25 = 9.0
recommendation_record { code: 'IMPLANT_RECOMMENDED', confidence: 0.92, 新鲜度 = 1.0(黄金窗内) 置信度 = 1.0(医生诊断)
extracted_by: 'llm', score = (10×.4 + 9×.3 + 9×.3) × 1.0 × 1.0 × 10 = 94
source_fact_id: 关联的 emr_record }
daysSince: 156 days (诊断到现在)
persona: { value=0.85, recall_risk=0.2 }
recentExecutions: 无
计算:
base = 60(缺牙→种植)
timeWindowFactor = 0.85(156 ∈ [90, 180))
main = 60 × 0.85 = 51
valueBonus = 20(value=0.85 ≥ 0.8)
likelihoodBonus = (1-0.2)×6 + 0 = 5
urgencyBonus = 5(156 天 > 120 邻牙倾斜临界)
confidenceFactor = 0.9(LLM 抽的 0.92 < 0.9 阈值,降权)
score = (51 + 20 + 5 + 5) × 0.9 = 73 ≈ 73
``` ```
UI 详情页: UI 详情页(breakdown 逐项):
``` ```
召回优先级 73 / 100 召回优先级 94 / 100
├─ 临床基线 60 × 0.85 = 51(缺失牙→种植 · 已过黄金期) ├─ 急迫性 10 ×0.4 = 4.0(急迫等级=紧急)
├─ 患者价值 +20(VIP 金卡 · LTV ¥48,200) ├─ 价值性 9 ×0.3 = 2.7(潜在种植 4 颗)
├─ 转化可能 +5 (黏性强 / 流失风险低) ├─ 意愿度 9 ×0.3 = 2.7(RFM重要价值 / 咨询过种植 / 成熟客+种植史)
├─ 临床紧迫 +5 (诊断 156 天 · 邻牙倾斜风险升高) ├─ 新鲜度 × 1.0(诊断在黄金窗内)
└─ 信号置信 × 0.9(关键信号靠 LLM 从病历文本抽,非结构化码) └─ 置信度 × 1.0(医生诊断)
``` ```
> ⚠️ 局限:意愿度 ≈ 倾向性(propensity),偏好"本来就会来的人";做对"该不该打"需测增益(uplift)= 试点随机对照组。
--- ---
## 九、实施路径 + 工作量 ## 九、实施路径 + 工作量
......
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