# 数据采集与存储边界 ## 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 默认使用 Redis,Redis 不可用时降级为进程内 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,不保存完整聊天全文。