chore: initialize medical consultation agent demo

This commit is contained in:
刘金宝
2026-06-01 09:25:26 +08:00
commit a7733243b2
139 changed files with 15764 additions and 0 deletions
+97
View File
@@ -0,0 +1,97 @@
# 数据采集与存储边界
## 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,不保存完整聊天全文。