# 数据库设计 ## 1. 当前确定方案 医疗问诊 Agent 使用独立数据库 `medical_consultation_agent`。病例来源以源库结构为准,当前业务不再依赖旧的 `cases`、`case_exam_items`、`training_sessions`、`session_orders`、`session_submissions`、`evaluation_records`、`evaluation_report_exports`、`rubric_templates`。 旧表已清理。后续开发直接面向新表: | 分类 | 表 | 说明 | |---|---|---| | 病例来源 | `case_base` | 病例主表,来自源库字段 | | 病例来源 | `traditional_case` | 练习模式病例扩展 | | 病例来源 | `teaching_case` | 教学互动模式病例扩展 | | 评分规则 | `scoring_rule` | 病例级基础评分规则 | | 检查项目 | `case_exam_item` | 本业务新增,保存固定检查/检验结果 | | 训练运行 | `training_session` | 本业务新增,保存一次训练会话状态 | | 训练运行 | `training_order` | 本业务新增,保存一次训练中的检查申请 | | 训练运行 | `training_submission` | 本业务新增,保存诊断和治疗提交 | | 训练结果 | `training_record` | 完整训练结束后的长期评价记录 | | 知识库 | `knowledge_sources`、`knowledge_documents`、`knowledge_chunks` | 评分指南检索和引用 | | 提示词 | `prompt_templates` | Markdown 提示词模板元数据 | | 用户档案 | `user_learning_profiles` | 用户历史评价聚合 | | 审计 | `audit_logs` | 关键行为审计 | ## 2. 病例读取逻辑 练习模式读取: ```text case_base + traditional_case + case_exam_item + scoring_rule ``` 教学互动模式读取: ```text case_base + teaching_case + case_exam_item + scoring_rule ``` 当前模式只保留 `practice` 和 `teaching`。历史的 `novice` 请求在后端归一为 `practice`,查看提示功能保留在练习模式中,由用户点击后触发。 ## 3. 评价生成逻辑 评价生成时读取以下数据: 1. `training_session`:当前训练会话、模式、分数类型。 2. Redis/进程内短期 memory:本次对话过程。 3. `training_order`:用户申请过的检查结果。 4. `training_submission`:用户提交的诊断和治疗方案。 5. `scoring_rule`:病例基础评分规则。 6. `knowledge_chunks`:科室/任务下命中的评分指南或人文关怀参考。 7. 提示词模板:评分 Agent 使用的结构化输出约束。 LLM 返回结构化评价后,只写入 `training_record`。中断、退出、未完成诊断或未完成治疗的训练不写入 `training_record`。 ## 4. 短期记忆和长期记录 | 数据 | 存储位置 | 生命周期 | |---|---|---| | 医生和 AI 病人的多轮对话 | Redis 或进程内 memory | 单次会话有效,TTL 到期或评价完成后释放 | | 检查申请结果 | `training_order` + runtime memory | 当前训练长期可查,参与评分 | | 诊断/治疗提交 | `training_submission` | 当前训练长期可查,参与评分 | | AI 评价报告 | `training_record.ai_feedback_structured` | 完整训练后长期保存 | | PDF 路径 | `training_record.pdf_file_path` | 导出后长期保存 | ## 5. 用户隔离 宿主系统进入 Agent 时传入 `X-User-Id`。后端以该值写入 `external_user_id`: | 表 | 用户字段 | |---|---| | `training_session` | `external_user_id` | | `training_order` | `external_user_id` | | `training_submission` | `external_user_id` | | `training_record` | `external_user_id` | `training_record.user_id` 保留源库数字用户字段。宿主传入字符串 user_id 时,业务隔离以 `external_user_id` 为准。 ## 6. 初始化和清理脚本 | 脚本 | 作用 | |---|---| | `backend/scripts/migrate_to_new_schema.py` | 创建新表、写入 Demo 种子数据、补齐表中文注释 | | `backend/scripts/drop_legacy_tables.py` | 删除已不再使用的旧表 | | `backend/scripts/init_demo_db.py` | 新表体系的 Demo 数据初始化入口 | | `backend/scripts/import_source_case_sql.py` | 安全导入接口解析后的病例 SQL,只做字段映射导入,不执行源 SQL 的建表和删表语句 | 验证结果:旧表已清理,`old_remaining=[]`;新表已完成完整 Demo 流程复测。