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

98 lines
4.9 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 时只接收宿主系统传入的用户上下文,不做登录注册。
- 问诊聊天只作为本次训练的短期 memory 使用,训练中断或退出不写入长期聊天历史。
- 检查申请、诊断提交、治疗提交属于本次训练过程数据,参与最终评分。
- 只有生成 AI 评价报告后,系统才写入长期训练记录 `training_record`
- 所有会话、检查、提交、评价和历史查询都按 `X-User-Id` 隔离。
## 2. 进入 Agent
| 数据 | 来源 | 存储位置 | 用途 |
|---|---|---|---|
| `user_id` | Header `X-User-Id` | `training_session.external_user_id``training_record.external_user_id``audit_logs.user_id` | 用户隔离 |
| `tenant_id` | Header `X-Tenant-Id` | `training_session.tenant_id``audit_logs.tenant_id` | 宿主系统组织上下文 |
| `class_id` | Header `X-Class-Id` | `training_session.class_id` | 班级/教学上下文 |
| `entry_scene` | Header `X-Entry-Scene` | `training_session.entry_scene``audit_logs.entry_scene` | 入口来源 |
| `role` | Header `X-Role` | `audit_logs.role` | 审计上下文 |
| `request_id` | 系统生成或 Header | `audit_logs.request_id` | 链路追踪 |
## 3. 创建会话
| 数据 | 存储位置 | 说明 |
|---|---|---|
| `case_id` | `training_session.case_id` | 关联 `case_base.id` |
| `training_type` | `training_session.case_type` | 当前来自病例类型 |
| `mode` | `training_session.training_mode` | `practice``teaching` |
| `score_type` | `training_session.score_type` | `percentage``five_point` |
| `session_code` | `training_session.session_code` | 会话业务编号 |
| `memory_key` | `training_session.memory_key` | Redis/进程内 memory key |
| `patient_opening` | runtime memory | AI 病人首句,不作为长期历史保存 |
## 4. 问诊过程
| 数据 | 存储位置 | 生命周期 |
|---|---|---|
| 医学生提问 | runtime memory | 本次会话有效,TTL 到期或评价完成后释放 |
| AI 病人回复 | runtime memory | 本次会话有效,TTL 到期或评价完成后释放 |
| SSE 响应耗时 | 前端状态、评价结构摘要 | 用于演示和问题排查 |
| LLM 模型名/fallback 状态 | 前端状态、评价结构摘要 | 用于确认真实模型或 fallback |
短期 memory 默认使用 RedisRedis 不可用时降级为进程内 memory。TTL 由 `RUNTIME_MEMORY_TTL_SECONDS` 控制;每次写入会刷新 TTL。
## 5. 检查/检验申请
| 数据 | 存储位置 | 说明 |
|---|---|---|
| `item_code` | `training_order.item_code` | 同一会话去重依据 |
| `item_name` | `training_order.item_name` | 检查名称 |
| `item_type` | `training_order.item_type` | `lab``imaging``vital_sign` 等 |
| `result_text` | `training_order.result_text` | 从 `case_exam_item` 读取的固定结果 |
| `result_structured` | `training_order.result_structured` | 结构化结果 |
| `is_key``is_abnormal` | `training_order` | 评分参考 |
检查结果只来自数据库 `case_exam_item`。LLM 不生成、不改写检查结果。
## 6. 诊断与治疗提交
| 数据 | 存储位置 | 说明 |
|---|---|---|
| `primary_diagnosis` | `training_submission.primary_diagnosis` | 主要诊断 |
| `differential_diagnoses` | `training_submission.differential_diagnoses` | 鉴别诊断 |
| `diagnosis_basis` | `training_submission.diagnosis_basis` | 诊断依据 |
| `treatment_principle` | `training_submission.treatment_principle` | 治疗原则 |
| `treatment_measures` | `training_submission.treatment_measures` | 治疗措施 |
| `risk_plan` | `training_submission.risk_plan` | 风险预案 |
| `communication` | `training_submission.communication` | 医患沟通 |
| `follow_up` | `training_submission.follow_up` | 随访安排 |
## 7. 评价报告
评价生成读取以下数据:
- `training_session`:模式、分数类型、病例 ID、memory key。
- runtime memory:本次问诊对话摘要。
- `training_order`:已申请检查和结果。
- `training_submission`:诊断和治疗提交。
- `case_base + traditional_case/teaching_case`:病例基础资料和标准参考。
- `scoring_rule`:基础评分规则。
- `knowledge_chunks`:科室/类型下命中的评分指南片段。
评价完成后写入:
| 数据 | 存储位置 |
|---|---|
| 总分、评分类型、等级 | `training_record.total_score``score_type``evaluation_level` |
| 结构化评分 | `training_record.ai_feedback_structured` |
| 证据摘要 | `training_record.thinking_chain` |
| 诊断路径摘要 | `training_record.diagnosis_path` |
| 扣分点 | `training_record.wrong_points` |
| 改进计划 | `training_record.recommendation_result` |
| PDF 路径 | `training_record.pdf_file_path` |
## 8. 审计日志
`audit_logs` 记录关键动作:进入 Agent、创建会话、问诊、申请检查、完成问诊、提交诊断、提交治疗、生成评价、导出 PDF。审计日志只记录元数据和对象 ID,不保存完整聊天全文。