每一层的输入 / 输出 / 关键代码 / prompt 设计。所有判断都可追溯到 fact 和 knowledge。
不调 LLM。读 generator 的 30 天多模态 CSV + 健康参考范围, 跑 5 类统计检测, 输出 DataFact[]。
data_v2/P01/sensor/*.csv (4 任务 × 30 天 = 120 文件)data_v2/P01/ema.jsonl (90 条 EMA)data_v2/P01/surveys.jsonl (5 周量表)data/baseline 4.8/normal_reference_ranges.csv# Outlier
z = (current - baseline_mean) / baseline_sd
if abs(z) > 2.0: → "异常 (升/降)至 X (基线 Y±Z, z=±N)"
# Trend (30 天)
slope, _, r, p, _ = linregress(days, values)
if p < 0.05 and abs(r) > 0.3: → "X 在过去 N 天呈 (升/降) 趋势"
# Comparison (前后对比)
pct = (m2 - m1) / m1 * 100
if abs(pct) > 10: → "X 由 m1 变为 m2 (Δ=±%)"
# Difference (双任务代价 DTC)
dtc = (single - dual) / single * 100
if dtc > 20: → "双任务代价 N% (单任务 X, 双任务 Y)"
# Extreme (跨模态签名)
if EDA↑ + HR↑ + IMU↑ at same timestamp:
→ "cross_modal_signature: sundowning/agitation"
关键设计: Analyzer 是确定性的, 同样输入永远同样 fact。所有定量计算都在这一层完成, LLM 永远拿到的是"已计算好的事实"。
35 条 JSON 知识条目, 涵盖 GDS 分期 + 4 模态传感器标志物 + BPSD 七症状 + MCR + 步态常模 + 药物。每条带 evidence.level (A-D) + PMID。
{
"id": "BPSD_SUNDOWNING_001",
"category": "bpsd",
"modality": ["eda","ppg","imu"],
"applicable_stages": ["mci","mild_ad","moderate_ad"],
"clinical": {
"prevalence": "20-45%",
"features": "下午 4-6 点症状加重"
},
"detection": {
"sensor_signature": "EDA + HR 渐进性升高",
"thresholds": {"time_window": "16:00-18:00"}
},
"intervention": {
"first_line": "光照治疗"
},
"evidence": {
"level": "C",
"sources": [{"citation": "Canevelli 2016", "pmid": "..."}]
}
}
# 按 fact 决定查什么
for fact in facts:
if fact.modality == "imu":
kb.query(modality="imu",
category="sensor")
if fact.pattern == "sundowning":
kb.query_bpsd("mci")
if patient.stage:
kb.query_staging(stage)
# 返回 markdown 块
# 拼到 Agent prompt
接 IMU / PPG / EDA / Audio 的传感器 fact + 模态相关知识 → 输出 biological insight (步态 / HRV / 自主神经)。
≈ 神经内科 + 康复 + 言语治疗师
接 EMA / 活动模式 / EDA 反应性 / BPSD 事件 fact + BPSD 知识 → 输出 psychological / behavioral insight。负责信号消歧 (HR↑ 是激越还是运动?)。
≈ 精神科 + 行为分析师
不接原始 fact, 只接前两位 insight + 量表 + clinical note → 输出 分期倾向 + 鉴别诊断 + 干预优先级 + 转诊建议。
≈ MDT 主持的高年资神经科医生
{
"id": "ins_physio_001",
"observation": "客观传感器观察 (≤30字)",
"clinical_implication": "临床含义 (≤50字, 必须基于 KB)",
"domain": "biological|psychological|behavioral",
"supporting_facts": ["F03", "F05"], ← 强制引用 fact_id
"supporting_knowledge": ["SENSOR_IMU_001"], ← 强制引用 KB id
"confidence": 0.0-1.0,
"differential": "需鉴别的项 (如有)"
}
关键设计: 每条 insight 必须列出 supporting_facts + supporting_knowledge。这让医生可以反查任意结论 → 找到原始数值和文献依据。Agent 不许虚构数字 (system_prompt 强制), 不许引用未提供的知识。
Threader 按 alert + confidence 排序 → Insight Card 用两段式 (观察 + 加粗的临床含义) 渲染 → Chart Spec 自动生成 Recharts JSON 配置。
## 步态衰退轨迹
步速在过去 21 天持续下降,
从 1.05 m/s 降至 0.82 m/s,
接近 Verghese MCR 阈值 (0.8 m/s)。
**这是 AD 前驱期最典型的步速拐点表现,
与海马-前额叶环路早期受累一致
(Buracchio 2010)。**
{
"id": "chart_001",
"linked_insight": "ins_physio_002",
"type": "line",
"data": [
{"day": 0, "speed": 1.05},
{"day": 30, "speed": 0.78}
],
"annotations": [
{"type":"hline", "value":0.95,
"label":"baseline"},
{"type":"hline", "value":0.80,
"label":"MCR threshold",
"style":"dashed-red"}
]
}
T+0 Analyzer (无 LLM): ~2 s
T+2.5s PhysioAgent + BehaviorAgent (并发): ~4 s
T+6.5s ClinicalAgent (串行): ~4 s
T+10s Narrator: ~3 s
总计 ~13 秒
4 次 LLM 调用, 平均每次 1500 input + 500 output
≈ 6000 input + 2000 output per evaluation
sonnet-4: ~$0.025 / 次
每周 1 次稳定期评估 → ~$1.3 / 月 / 患者