- Implement 5 core API endpoints (create task, get progress, get results, update decision, export Excel) - Add FulltextScreeningController with Zod validation (652 lines) - Implement ExcelExporter service with 4-sheet report generation (352 lines) - Register routes under /api/v1/asl/fulltext-screening - Create 31 REST Client test cases - Add automated integration test script - Fix PDF extraction fallback mechanism in LLM12FieldsService - Update API design documentation to v3.0 - Update development plan to v1.2 - Create Day 5 development record - Clean up temporary test files
9.5 KiB
ASL Prompt质量分析报告 v1.0.0
测试时间: 2025-11-18
测试版本: v1.0.0-MVP
测试模型: DeepSeek-V3 + Qwen3-72B
测试样本数: 10篇
📊 测试结果概览
| 质量指标 | 实际值 | 目标值 | 状态 | 差距 |
|---|---|---|---|---|
| 准确率 | 60.0% | ≥85% | ❌ | -25% |
| 一致率 | 70.0% | ≥80% | ❌ | -10% |
| 平均置信度 | 0.95 | - | ✅ | - |
| 需人工复核率 | 30.0% | ≤20% | ❌ | +10% |
混淆矩阵
预测纳入 预测排除 不确定
实际纳入 2 1 0
实际排除 0 4 0
不确定 0 0 0
- 真阳性(TP): 2篇 - 正确识别应纳入的文献
- 假阴性(FN): 1篇 - 误将应纳入的文献判为排除
- 真阴性(TN): 4篇 - 正确识别应排除的文献
- 假阳性(FP): 0篇 - 无误将应排除的判为纳入
🔍 错误案例分析
❌ 错误1: test-001 (假阴性)
标题: Efficacy and Safety of Empagliflozin in Patients with Type 2 Diabetes
期望: include
实际: exclude
判断: 两个模型一致判断为exclude
原因分析:
- 文献虽然是RCT,PICO的P、I、C、S都完全匹配
- 但主要结局是HbA1c、体重、血压等代谢指标
- 未报告心血管结局数据(MACE、心衰住院、心血管死亡)
- 两个模型都敏锐地识别出缺乏结局指标O
结论: 这实际上可能是模型正确、期望值有误的情况。根据PICO标准,如果文献不报告心血管结局,应该排除。建议修正测试样本的expectedDecision为exclude。
❌ 错误2: test-007 (PICO维度冲突)
标题: Pharmacokinetics and Pharmacodynamics of Empagliflozin in Healthy Volunteers
期望: exclude
实际: pending (冲突)
两模型结论: 都是exclude
PICO判断对比:
| 维度 | DeepSeek | Qwen | 冲突? |
|---|---|---|---|
| P | mismatch | mismatch | ✅ 一致 |
| I | partial | match | ❌ 冲突 |
| C | match | match | ✅ 一致 |
| S | partial | match | ❌ 冲突 |
| 结论 | exclude | exclude | ✅ 一致 |
问题: 虽然最终结论一致,但I和S维度判断不同,导致系统判定为冲突
原因分析:
- I维度: DeepSeek认为健康志愿者研究的SGLT2抑制剂只是partial,因为不是治疗性应用;Qwen认为只要是SGLT2抑制剂就match
- S维度: DeepSeek认为Phase 1研究只是partial RCT;Qwen认为有随机、安慰剂对照就是match
优化方向: 需要明确Prompt中关于"研究设计"和"干预措施"的判断标准
❌ 错误3: test-008 (C维度冲突)
标题: Comparative Effectiveness of SGLT2 Inhibitors versus DPP-4 Inhibitors
期望: exclude
实际: pending (冲突)
两模型结论: 都是exclude
PICO判断对比:
| 维度 | DeepSeek | Qwen | 冲突? |
|---|---|---|---|
| P | match | match | ✅ 一致 |
| I | match | match | ✅ 一致 |
| C | partial | mismatch | ❌ 冲突 |
| S | mismatch | mismatch | ✅ 一致 |
| 结论 | exclude | exclude | ✅ 一致 |
问题: C维度判断不同(DPP-4抑制剂是partial还是mismatch)
原因分析:
- DeepSeek认为DPP-4抑制剂算partial,因为它是降糖疗法的一种
- Qwen认为必须是安慰剂或常规疗法,DPP-4不符合
优化方向: 需要明确"常规降糖疗法"的定义范围
❌ 错误4: test-010 (I维度重大冲突)
标题: Sotagliflozin (双重SGLT1/SGLT2抑制剂)
期望: uncertain
实际: pending (冲突)
模型结论: DeepSeek=exclude, Qwen=include
PICO判断对比:
| 维度 | DeepSeek | Qwen | 冲突? |
|---|---|---|---|
| P | match | match | ✅ 一致 |
| I | mismatch | match | ❌ 严重冲突 |
| C | match | match | ✅ 一致 |
| S | match | match | ✅ 一致 |
| 结论 | exclude | include | ❌ 严重冲突 |
问题: 这是最严重的冲突案例,两个模型对conclusion完全相反
原因分析:
- DeepSeek严格解释:Sotagliflozin是双重抑制剂,与纯SGLT2抑制剂不同,判为mismatch → exclude
- Qwen宽松解释:Sotagliflozin包含SGLT2抑制作用,判为match → include
- 实际上这种边界情况应该是uncertain,需要人工判断
优化方向:
- 在Prompt中明确"SGLT2抑制剂"是否包括双重抑制剂
- 对于边界情况,引导模型倾向于uncertain而非直接include/exclude
💡 核心问题总结
1. PICO维度判断标准模糊
问题: match / partial / mismatch的界限不够清晰
影响:
- 导致两个模型对同一维度判断不同
- 即使最终结论一致,也会被系统标记为冲突
解决方案:
- 在Prompt中增加具体的判断标准和示例
- 使用Few-shot示例展示边界情况的判断逻辑
2. 边界情况处理不一致
典型案例:
- 健康志愿者 vs 患者
- 双重抑制剂 vs 单一抑制剂
- DPP-4 vs 安慰剂/常规疗法
问题:
- 两个模型对边界情况的判断策略不同
- DeepSeek倾向于保守(更多mismatch)
- Qwen倾向于宽松(更多match)
解决方案:
- 在Prompt中明确边界情况的处理原则
- 引导模型在不确定时使用"uncertain"
3. 结局指标(O)未纳入judgment
问题:
- 当前Prompt只要求判断P、I、C、S四个维度
- 但结局指标(O)也是重要的纳排标准
- test-001就是因为缺乏心血管结局而被正确排除
解决方案:
- 考虑在judgment中增加O维度
- 或在reason中明确要求说明结局指标是否符合
4. 冲突检测过于严格
问题:
- 目前只要PICO任一维度不同就判定为冲突
- 即使conclusion一致(如test-007、test-008)
影响:
- 提高了人工复核率(30% > 20%)
- 降低了系统的自动化程度
解决方案:
- 优化冲突检测逻辑:只有conclusion不同才算严重冲突
- PICO维度的小差异可以降级为"需注意"而非"冲突"
🎯 Prompt优化建议
优先级1: 增加Few-shot示例
在Prompt中增加3-5个标准案例,展示:
- 明确的纳入案例(RCT + 心血管结局)
- 明确的排除案例(综述、动物实验、病例报告)
- 边界情况1(双重抑制剂 → uncertain)
- 边界情况2(健康志愿者 → exclude)
- 边界情况3(缺乏结局指标 → exclude)
优先级2: 明确PICO判断标准
为每个维度提供具体的判断规则:
P (研究人群):
- match: 成人2型糖尿病患者
- partial: 包含2型糖尿病但混合其他人群(如1型糖尿病)
- mismatch: 健康志愿者、动物模型、1型糖尿病
I (干预措施):
- match: empagliflozin, dapagliflozin, canagliflozin, ertugliflozin等单一SGLT2抑制剂
- partial: 联合用药但包含SGLT2抑制剂
- mismatch: 双重SGLT1/SGLT2抑制剂(如sotagliflozin)、其他药物
C (对照):
- match: 安慰剂、常规降糖疗法(胰岛素、二甲双胍、磺脲类)
- partial: 包含安慰剂+标准治疗
- mismatch: 活性对照(DPP-4抑制剂、GLP-1受体激动剂等)
S (研究设计):
- match: 随机对照试验(RCT)、双盲、安慰剂对照
- partial: 准随机试验
- mismatch: 观察性研究、队列研究、病例对照、综述、动物实验、病例报告
优先级3: 强化uncertain的使用
在Prompt中明确指导:
- 当信息不足以做出判断时,使用uncertain
- 当遇到边界情况(如双重抑制剂)时,倾向于uncertain
- 当PICO维度有2个及以上partial时,考虑uncertain
优先级4: 增加O维度检查
在Prompt中增加要求:
- 检查是否报告了心血管结局数据
- 如果缺乏结局数据,即使PICO其他维度匹配也应排除
📈 预期改进效果
实施上述优化后,预期指标改善:
| 指标 | 当前 | 预期 | 改善幅度 |
|---|---|---|---|
| 准确率 | 60% | 85-90% | +25-30% |
| 一致率 | 70% | 85-90% | +15-20% |
| 需人工复核率 | 30% | 15-20% | -10-15% |
改善策略:
- Few-shot示例 → +15%准确率 +10%一致率
- 明确判断标准 → +5%准确率 +10%一致率
- 优化冲突检测 → -10%复核率
- 增加O维度检查 → +5%准确率
📝 下一步行动
立即行动 (本周)
- 创建v1.0.1 Prompt版本,增加Few-shot示例
- 修正test-001的期望值(include → exclude)
- 优化冲突检测逻辑(只检测conclusion冲突)
短期行动 (下周)
- 增加更多测试样本(目标20-30篇)
- 测试不同温度参数的影响
- 对比GPT-5和Claude-4.5的表现
中期行动 (V1.0阶段)
- 实施智能质量控制策略
- 建立Few-shot示例库
- 实现自动质量审计
✅ 测试成功案例
值得肯定的是,以下6篇文献都被正确判断:
- ✅ test-002: RCT + 心血管结局 → 正确纳入
- ✅ test-003: 系统综述 → 正确排除
- ✅ test-004: 动物实验 → 正确排除
- ✅ test-005: RCT + 心血管结局(CREDENCE) → 正确纳入
- ✅ test-006: 回顾性队列 → 正确排除
- ✅ test-009: 病例报告 → 正确排除
成功因素:
- 这些案例都是典型的纳入/排除场景
- PICO维度边界清晰
- 两个模型判断完全一致
这表明Prompt的基本框架是正确的,只需要针对边界情况进行优化即可。
报告生成时间: 2025-11-18
报告版本: v1.0.0
下次评估计划: v1.0.1 Prompt优化后重新测试