Files
fastapi/docs/02_database_design.md
T
2026-06-01 09:25:26 +08:00

88 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据库设计
## 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 流程复测。