外观
Prompt 契约
Prompt 契约分为 Chat 回复和处方生成两套。Chat prompt 面向连续对话与知识问答,处方 prompt 面向结构化运动方案生成;两者共享非诊断边界,但输入结构、输出要求和 fallback 逻辑不同。
契约边界
| 项目 | Chat 回复 | 处方生成 |
|---|---|---|
| 主要文件 | response_generation.py | prescription_generation.py |
| 入口方法 | generate_intelligent_response(...)、generate_fallback_response(...) | generate_prescription_with_fallback(...) |
| 输入核心 | 用户问题、患者画像、RAG 上下文、来源、会话历史 | 用户档案、评估上下文、手术史、疾病史、近期对话 |
| 输出形态 | 自然语言回复 | 结构化 JSON 处方 |
| 安全边界 | 非诊断、紧急症状就医、知识不足不伪装引用 | 安全第一、循序渐进、输出后必须安全检查 |
| fallback | 从知识上下文整理建议,或基于一般常识回答 | 默认安全处方;再次失败时返回应急处方 |
文档只记录构造框架,不展示完整 prompt 文本,不写真实患者样例。
Chat System Prompt
Chat system prompt 由 ResponseGenerationService.build_system_prompt(...) 构造。
| 组成 | 内容 |
|---|---|
| 助手角色 | 动养AI健康助手,陪伴肿瘤康复患者做运动与健康管理。 |
| 回复长度 | 问候、感谢、闲聊和轻情绪表达保持 1-2 句;运动、症状、健康咨询再结构化展开;紧急或禁忌情况详细提示风险并建议就医。 |
| 表达风格 | 亲切自然,不刻板,不机械复述档案。 |
| 医疗边界 | 不进行医疗诊断;紧急症状建议立即就医。 |
| 对话连续性 | 自然延续历史,不重复已说过的内容。 |
| 患者画像 | 仅在用户有健康相关咨询时参考;闲聊不展开患者信息。 |
Chat 患者画像
render_patient_profile(...) 只使用已填写信息,生成一段产品化摘要,不调用 LLM。
| 信息域 | 字段来源 |
|---|---|
| 基础信息 | 姓名或昵称、年龄、性别、身高、体重、BMI。 |
| 肿瘤信息 | 癌种、亚型、治疗阶段、骨转移记录。 |
| 评估上下文 | 主要症状、疼痛分值、跌倒风险、器械、期望频次和时长、运动偏好。 |
| 体能信息 | fitness_level。 |
| 疾病史 | diseases 列表。 |
该摘要的用途是帮助模型个体化回答,不作为诊断结论。
Chat User Message
build_user_message(...) 把当前问题、RAG 证据和来源拼成 user message:
| 部分 | 规则 |
|---|---|
| 用户问题 | 直接写入当前 query。 |
| 专业知识 | 有 knowledge_context 时追加压缩后的 RAG 上下文。 |
| 来源列表 | 有 sources 时最多追加前 3 个来源。 |
| 会话历史 | 由 LLM client 的 chat_completion(...) 合并,不直接写进 user message。 |
当没有 RAG 证据时,Chat fallback 会在 system prompt 中加入“知识来源不足时可基于通用健康管理原则回答,但不要假装引用专业知识库”。
Chat Fallback
| 场景 | 行为 |
|---|---|
| LLM 失败但有知识上下文 | optimize_knowledge_response(...) 从上下文中抽取最多 3 条要点,追加来源和遵医嘱边界。 |
| RAG 召回为空 | 调用一般常识 fallback,返回内容带“基于一般常识回答”标记。 |
| 高风险输入 | 不进入 prompt 生成,直接返回安全建议。 |
处方 System Prompt
处方 system prompt 由 PrescriptionGenerationService.build_prescription_system_prompt(...) 构造。
| 组成 | 内容 |
|---|---|
| 角色 | 运动康复医师,为肿瘤康复患者制定个性化运动处方。 |
| 总原则 | 安全第一、循序渐进、严格按用户健康档案个性化。 |
| 用户摘要 | 性别、年龄、BMI、血压、心率、疾病史、手术史、体能水平。 |
| 评估摘要 | 症状、疼痛、共病、每周运动天数、步行耐力、跌倒史、偏好、器械、场景、期望频次和时长。 |
| 约束注入 | 根据器械、跌倒风险、疼痛分值和期望时长追加约束。 |
| 输出要求 | 仅返回 JSON,无额外文字。 |
处方约束注入
| 条件 | Prompt 约束 |
|---|---|
| 无器械 | 只用自重动作,禁用任何器械。 |
| 有器械 | 只使用已填写器械。 |
跌倒风险为 yes 或 unsure | 禁止高重心、单腿、复杂平衡动作,推荐坐姿或扶撑。 |
| 疼痛分值大于等于 4 | 全案强度不超过低,禁止对痛处高负荷牵拉。 |
| 填写期望时长 | 每次总时长约等于期望时长。 |
处方 User Message
build_prescription_user_message(...) 当前使用简洁指令:
| 部分 | 规则 |
|---|---|
| 生成目标 | 生成个性化运动康复方案。 |
| 项目数量 | 包含 3 个运动项目。 |
| 输出格式 | 严格输出 JSON。 |
| 专业知识 | 当前处方主链 use_rag_knowledge=false,不追加 RAG 知识上下文。 |
| 近期对话 | 如果存在对话历史,取最近 3 条用户/AI 对话摘要。 |
处方 JSON 形状
处方 prompt 要求模型返回固定结构,后端随后解析并补齐字段:
| 字段 | 说明 |
|---|---|
prescription_id | 处方标识;缺失时后端补齐。 |
generated_at | 生成时间;缺失时后端补齐。 |
exercises | 运动项目列表,包含名称、时长、强度、组数、次数、休息、注意事项、指导和 MET。 |
daily_schedule | morning / afternoon / evening 的动作安排。 |
safety_guidelines | 安全指导。 |
contraindications | 禁忌或暂停条件。 |
处方后处理
| 阶段 | 行为 |
|---|---|
| JSON 提取 | 从模型文本中截取首尾 {...};没有 JSON 时进入默认结构。 |
| 字段补齐 | validate_and_complete_prescription(...) 补齐必需字段和默认运动项。 |
| 安全检查 | check_prescription_safety(...) 检查强度、疾病冲突、安全字段缺失和空运动项。 |
| 默认处方 | LLM 失败时按年龄和心脏病史生成低风险默认运动方案。 |
| 应急处方 | 默认处方也失败时返回“休息和咨询医生”形状。 |
来源锚点
- Chat prompt:
apps/backend_service/app/core/rag/response_generation.py - Prescription prompt:
apps/backend_service/app/core/rag/prescription_generation.py - Chat use case:
apps/backend_service/app/use_cases/chat/send_message.py - Prescription service:
apps/backend_service/app/services/prescription_service.py