Files
AIclinicalresearch/docs/03-业务模块/ASL-AI智能文献/05-开发记录/2025-11-18-两步测试完整报告.md
HaHafeng 66255368b7 feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
2026-01-16 13:42:10 +08:00

14 KiB
Raw Permalink Blame History

ASL 两步测试完整报告

测试日期: 2025-11-18
测试目的: 确定准确率不高的根本原因
测试方法: 两步测试法


📊 测试结果总览

第1步国内 vs 国际模型对比

模型组合 准确率 一致率 平均耗时 JSON稳定性
DeepSeek-V3 + Qwen-Max 40% 60% 16秒 100%
GPT-4o + Claude-4.5 0%* 80% 10秒 20%4/5失败

*国际模型因JSON格式错误导致失败非判断能力问题

第2步三种筛选风格对比

筛选风格 准确率 召回率(Included) 精确率(Excluded) 一致率
标准模式 60% 0% 100% 100%
宽松模式 20% 50% 0% 40%
严格模式 未测试 - - -

🎯 核心发现

发现1: 不是模型能力问题

证据:

  1. 国际顶级模型GPT-4o、Claude-4.5)准确率也不理想
  2. 速度更快10秒 vs 16秒但JSON输出不稳定中文引号问题
  3. 即使排除JSON错误判断结果与国内模型类似

结论: 模型智商足够,不是能力问题


发现2: 不是Prompt宽松/严格问题 ⚠️

测试结果:

标准模式(当前使用):

  • 排除准确率100%3/3应排除的全部排除
  • 召回率0%2/2应纳入的全部误判
  • 策略:严格执行排除标准

宽松模式(新设计):

  • 召回率50%1/2应纳入的识别出来
  • 精确率0%3/3应排除的全部误纳入
  • 策略:宁可多纳入,不错过

对比分析:

标准模式:过于保守 → 漏纳(假阴性高)
宽松模式:过于激进 → 误纳(假阳性高)

两种极端,都不理想!

结论: 单纯调整宽松/严格无法根本解决问题


发现3: 根本原因 = AI与人类对边界情况的理解差异 🎯

边界情况1: 系统评价/Meta分析

AI理解:

排除标准: "综述、病例报告、会议摘要"
→ Meta分析属于综述类
→ 应该排除 ✅

人类专家理解:

案例2: "Dual vs mono antiplatelet therapy... Meta-analysis"
→ 人类决策: Included纳入✅

为什么?
- 可能认为这是最新的Meta分析2020年发表
- 可能认为Meta分析有参考价值
- 或者用户对"综述"的定义不包括Meta分析

矛盾: AI严格执行规则人类有隐含的灵活标准


边界情况2: 地域要求

AI理解:

纳入标准: "研究人群为亚洲人群"
→ 案例1标题: "...North African participants..."
→ 北非≠亚洲
→ 应该排除 ❌

人类专家理解:

案例1: "TICA-CLOP STUDY...非心源性卒中...替格瑞洛 vs 氯吡格雷"
→ 人类决策: Included纳入✅

为什么?
- 可能认为研究方法有价值高质量RCT
- 可能认为药物机制不受地域影响
- 或者"亚洲人群"只是优先,不是必须?

矛盾: 规则说"亚洲人群",但实际执行更灵活


边界情况3: 研究设计类型

AI理解:

纳入标准: "研究设计为SR、RCT、RWE、OBS"
→ 案例3: "Study design and protocol"(研究方案)
→ 不是实际研究结果
→ 应该排除 ✅

人类专家理解:

案例3: "SERIC-IVT...RCT...Study design and protocol"
→ 人类决策: Excluded排除✅

这次AI和人类一致

💡 根本问题诊断

问题不在于:

  • 模型不够聪明
  • Prompt不够好
  • 宽松/严格程度不对

问题在于:

纳排标准本身存在隐含的、未明确说明的判断规则

示例:

显式规则AI能理解:

排除标准: "综述、病例报告、会议摘要"

隐含规则AI无法知道:

- 如果是2020年后的高质量Meta分析可以纳入
- 如果是研究方法有参考价值的非亚洲人群RCT可以纳入
- 如果对照组是另一种标准治疗(而非安慰剂),要根据具体情况判断

🔍 详细案例分析

案例1: 替格瑞洛 vs 氯吡格雷北非人群RCT

矛盾点: 人群地域

维度 AI判断 人类判断 差异原因
P人群 北非≠亚洲 非心源性卒中符合 地域重要性理解不同
I干预 替格瑞洛 vs 氯吡格雷 抗血小板药物 一致
C对照 ⚠️ 另一种药物(非安慰剂) 有对比意义 对照类型理解不同
S设计 RCT RCT 一致
结论 Exclude/Uncertain Include ⬆️ 冲突

AI理由标准模式:

"研究对象为北非人群,而非亚洲人群"

AI理由宽松模式:

"虽然是北非人群但RCT质量高结果可为亚洲研究提供参考"
→ 决策: Include (与人类一致!)

启示: 宽松模式对这个案例有效!


案例2: 双抗 vs 单抗 Meta分析

矛盾点: 研究类型

维度 AI判断 人类判断 差异原因
P人群 非心源性卒中/TIA 符合 一致
I干预 双抗 vs 单抗 抗血小板 一致
C对照 ⚠️ 阿司匹林(非安慰剂) 单抗也算 对照理解不同
S设计 Meta分析=综述) SR纳入 研究类型理解不同
结论 Exclude Include ⬆️ 冲突

AI理由:

"该文献是系统评价和Meta分析触发排除标准'综述'"

人类可能的考虑:

  • 纳入标准明确包含"SR"(系统评价)
  • Meta分析可能被认为是高质量证据
  • 发表时间2020年数据较新

启示: "SR"和"综述"的定义存在歧义!


案例3: 远程缺血预处理 + 溶栓

矛盾点: 干预类型

维度 AI判断 人类判断 差异原因
P人群 急性缺血性卒中 符合 一致
I干预 物理干预(非药物) 不符合 一致
C对照 ⚠️ Sham-RIC ? -
S设计 研究方案(非结果) 方案不纳入 一致
结论 Exclude Exclude 一致

这是唯一AI和人类完全一致的排除案例


案例4: 隐源性卒中抗栓治疗 Meta分析

矛盾点: 研究类型 + 卒中类型

维度 AI判断 人类判断 差异原因
P人群 ⚠️ 隐源性卒中 隐源性≠非心源性? 卒中分类理解不同
I干预 抗栓药物 符合 一致
S设计 Meta分析=综述) 应排除 一致
结论 Include宽松 Exclude ⬆️ 冲突

AI理由宽松模式:

"隐源性卒中属于非心源性范畴,系统评价可能包含亚洲人群研究,建议纳入"

人类理由:

可能认为隐源性卒中不符合"非心源性"定义或Meta分析应排除

启示: "隐源性"vs"非心源性"的医学定义需要明确!


案例5: 替奈普酶 vs 阿替普酶 Meta分析

矛盾点: 研究类型

与案例2类似AI认为应排除Meta分析=综述),但宽松模式判断有分歧。


📈 数据统计

准确率分解

筛选模式 应纳入2篇 应排除3篇 总准确率
标准模式 0/2 (0%) 3/3 (100%) 3/5 (60%)
宽松模式 1/2 (50%) 0/3 (0%) 1/5 (20%)

错误类型分析

标准模式错误:

  • 假阴性(漏纳): 2篇案例1、案例2
  • 假阳性(误纳): 0篇
  • 特点: 过于保守,宁可错杀

宽松模式错误:

  • 假阴性(漏纳): 1篇案例2因模型冲突
  • 假阳性(误纳): 3篇案例2、案例4、案例5
  • 特点: 过于激进,宁可放过

🎯 最终结论

结论1: 模型能力充分

国内外顶级模型DeepSeek、Qwen、GPT-4o、Claude在理解能力上没有本质差异准确率不高不是模型智商问题

结论2: Prompt优化有限 ⚠️

单纯调整Prompt的宽松/严格程度,只能在召回率精确率之间权衡,无法根本提高准确率:

标准Prompt: 召回率↓ 精确率↑ (保守)
宽松Prompt: 召回率↑ 精确率↓ (激进)

两者都无法达到理想的"召回率↑ 精确率↑"

结论3: 根本问题 = 规则歧义 🎯

核心矛盾:

  1. 纳排标准存在隐含的判断规则

    • 显式规则AI可以理解
    • 隐含规则AI无法知道
  2. 边界情况定义不明确

    • "亚洲人群"是必须还是优先?
    • "综述"是否包括Meta分析
    • "非心源性"是否包括隐源性?
  3. 不同专家可能有不同理解

    • 专家A: 严格执行规则
    • 专家B: 灵活考虑价值
    • AI只能学习一种理解方式

💡 解决方案

方案1: 用户自定义边界情况 推荐

实现思路:

  1. 用户输入PICOS + 纳排标准

  2. 系统生成20种边界情况

    • "北非人群的高质量RCT" → 纳入/排除?
    • "2020年发表的Meta分析" → 纳入/排除?
    • "对照组为另一种药物" → 纳入/排除?
    • "隐源性卒中" → 纳入/排除?
    • ...
  3. 用户确认每种情况的处理方式

    • 纳入
    • 排除
    • 不确定(人工复核)
  4. 系统基于确认生成定制Prompt

    特殊规则:
    - 如果是北非人群但RCT质量高 → 纳入
    - 如果是2020年后的Meta分析 → 纳入
    - 如果对照是另一种药物 → 根据具体情况
    

优点:

  • 让用户明确自己的判断标准
  • 消除AI与人类的理解差异
  • 适用于任何研究主题
  • 可持续学习优化

方案2: 三种筛选风格 + 用户选择 已实现

已完成:

  • 宽松模式Prompt
  • 标准模式Prompt
  • 严格模式Prompt
  • 后端支持style参数

待完成:

  • 前端UI用户选择筛选风格
  • API接口调整

使用场景:

  • 初筛: 宽松模式(宁可多纳入)
  • 正常筛选: 标准模式(平衡)
  • 精筛: 严格模式(宁可错杀)

方案3: Few-shot学习中期

实现思路:

  1. 用户纠正AI判断

    • AI: Exclude
    • 用户: 应该是Include
    • 原因: 虽然是北非人群但RCT质量高
  2. 系统记录案例

    Case 1: 北非RCT高质量 → Include
    Case 2: 欧洲队列研究 → Exclude
    Case 3: 全球Meta分析2020+ → Include
    
  3. 将案例作为Few-shot示例加入Prompt

    以下是一些参考案例:
    
    案例1: 北非人群RCT...
    → 决策: Include
    → 理由: 虽非亚洲但方法严谨
    
    案例2: ...
    

优点:

  • 从用户纠正中学习
  • 持续改进准确率
  • 个性化优化

📅 实施建议

立即行动(本周)

选择方案2: 三种筛选风格

理由:

  • 已完成后端实现
  • 快速可用2-3天前端开发
  • 让用户自己选择策略

开发任务:

  1. 前端添加筛选风格选择器
  2. API传递style参数
  3. 用10-20篇真实数据测试
  4. 文档说明三种风格的差异

中期行动Week 2-3

实现方案1: 边界情况确认

Phase 1: 基础版

  • LLM分析PICOS生成10种边界情况
  • 用户手动确认
  • 系统根据确认调整Prompt

Phase 2: 智能版

  • 系统学习用户的纠正
  • 自动更新边界规则
  • 持续优化准确率

长期优化V1.0+

实现方案3: Few-shot学习

  • 案例库管理
  • 自动Few-shot示例选择
  • 多用户经验共享

🎯 期望效果

短期实现方案2后

指标 当前 目标 说明
初筛召回率 0% 70%+ 使用宽松模式
精筛精确率 100% 95%+ 使用严格模式
用户满意度 ? 80%+ 灵活选择

中期实现方案1后

指标 当前 目标 说明
整体准确率 40-60% 85%+ 定制化Prompt
边界情况准确率 0-50% 80%+ 明确规则
人工复核率 ? <15% 减少不确定

📝 关键启示

  1. AI不是万能的

    • AI可以执行明确的规则
    • AI无法理解隐含的判断标准
    • 需要人类明确规则
  2. 标准必须明确

    • 隐含规则必须显式化
    • 边界情况必须定义清楚
    • 歧义是准确率低的根本原因
  3. 用户参与至关重要

    • 用户最了解自己的需求
    • 让用户定义边界情况
    • AI + 人类 = 最佳方案

报告人: AI Assistant
审核人: [待用户确认]
日期: 2025-11-18
版本: v1.0 Final


附录

A. 测试数据详情

  • 测试文献数: 5篇
  • 应纳入: 2篇案例1、案例2
  • 应排除: 3篇案例3、案例4、案例5
  • 测试模型: 6个DeepSeek-V3, Qwen-Max, GPT-4o, Claude-4.5
  • 测试Prompt: 2种标准、宽松

B. 完整测试日志

详见:

  • backend/scripts/test-stroke-screening.ts
  • backend/scripts/test-stroke-screening-international-models.ts
  • backend/scripts/test-stroke-screening-lenient.ts

C. Prompt版本

  • v1.0.0: 标准Prompt当前使用
  • v1.1.0-lenient: 宽松Prompt新增
  • v1.1.0-standard: 标准Prompt优化
  • v1.1.0-strict: 严格Prompt新增