Skip to content

安全过滤

安全过滤在 AI 链路中优先级最高。当前系统同时存在四类安全机制:Chat 输入安全过滤、RAG 内部安全短路、评估红黄绿规则引擎、处方结构安全检查。它们覆盖的场景不同,不应混写成一个“模型安全提示”。

安全层次

层次入口主要文件输出
Chat 内容安全SendChatMessageUseCase.execute()app/core/safety_filter.pySafetyCheckResult、安全免责声明、可选 suggested_response
RAG 内部安全短路RAGEngine.safe_search_and_generate()app/core/rag_engine.py + safety_filter.py高风险时跳过检索并返回安全建议。
评估红黄绿规则/api/assessment/safety-check/api/safety/risk-assessmentsafety_engine.pysafety_rules.pysafety_policy.pyGREEN / YELLOW / RED 与 action。
处方安全检查PrescriptionGenerationServicesafety_filter.check_prescription_safety()处方风险等级、warnings、是否需要 human review。

Chat 输入安全

SafetyFilter.check_content_safety(...) 会扫描用户输入和可选用户上下文:

风险类型典型触发风险等级系统行为
医疗诊断症状或疾病 + “是不是 / 诊断 / 确诊 / 什么病”等诊断意图MEDIUM / HIGH添加诊断边界;高风险时给出不能诊断的建议文本。
危险运动极限运动、大重量、倒立、跳跃、冲击、爆发力等MEDIUM,特殊年龄或病史可升高加入危险运动 warning。
紧急症状胸痛、呼吸困难、昏厥、大出血、抽搐等CRITICAL要求停止运动并就医,requires_human_review=true
药物建议药物、剂量、胰岛素、降压药、副作用、禁忌等HIGH添加药物咨询边界。
自残倾向自杀、轻生、结束生命等表达CRITICAL返回危机支持建议,requires_human_review=true

SendChatMessageUseCase 的处理规则:

  1. 先调用 safety filter。
  2. is_safe=false 且存在 suggested_response,直接返回安全建议。
  3. 该路径不调用 RAG,也不调用 LLM。
  4. 返回中 requires_acknowledgment=truerag_context=["安全检查"]
  5. 如果不是高危短路,但属于健康建议语境,会追加泛化安全提示。

RAG 安全短路

RAG 内部也会执行 safety check,避免绕过 Chat use case 的调用方直接进入检索生成。契约测试覆盖以下行为:

条件行为
高风险且有 suggested_response不执行 hybrid pipeline。
返回字段保留 querysuggested_responseknowledge_context=""sources=[]safety_check
免责声明根据 flags 或泛化规则生成 safety_disclaimer
人工复核safety_check.requires_human_review=true 时向上游保留该字段。

这层保护确保后续新增 RAG 调用方时,高风险输入仍有本地拦截能力。

评估红黄绿规则

safety_engine.evaluate(...) 使用规则表判断运动前安全检查结果:

规则条件等级行为
G1 发热发热或不确定RED建议先就医或确认感染控制后再运动。
G2 急性期/不稳定期急性期、不稳定或不确定RED暂不生成运动康复方案。
G3 心肺危险症状胸痛、气短等危险信号或不确定RED建议立即就医排除风险。
G4 严重副作用严重不能耐受治疗副作用RED先处理副作用。
G5 极度虚弱极度疲劳或虚弱RED建议线下评估。
G6 医嘱禁忌医生明确禁止或不确定RED遵医嘱暂停运动。
M1 术后伤口术后/恢复期且伤口异常或不确定RED暂缓运动。
M2 跌倒风险高龄或相关风险上下文,且有跌倒风险YELLOW限制为坐姿/卧姿运动。
M3 贫血治疗相关上下文且 Hb < 80 或贫血不确定RED确认后再运动或禁止运动。

最终 action:

等级action_required
REDconsult_doctor
YELLOWconservative_mode
GREENnull

处方安全检查

check_prescription_safety(...) 针对生成后的处方结构做二次检查:

检查项行为
高强度运动高 / high / 剧烈 强度加入 warning,风险至少为 MEDIUM
年龄年龄大于 70 时加入高龄运动风险提示。
心血管病史心脏、心血管、高血压相关条件会提升到 HIGH
骨关节问题骨折、关节、脊椎相关条件会提升风险。
糖尿病提醒运动时监测血糖。
安全字段缺失缺少 safety_guidelinescontraindications 时加入 warning。
无运动项目风险至少为 MEDIUM

风险为 HIGHCRITICAL 时,返回 requires_human_review=true

非诊断边界

AI 回复和运动处方均不能替代医生诊断。系统允许提供一般运动健康建议、知识库证据解释和风险提示,但遇到以下内容必须收缩:

内容边界
诊断判断不判断“是不是某病”,建议咨询医生。
急症信号不继续运动建议,先停止运动并就医。
药物剂量不给药物剂量或替代用药方案。
高风险运动只给安全边界,不鼓励挑战极限。
处方生成模型生成结果必须通过结构校验与安全检查后再保存。

测试入口

测试覆盖点
tests/test_safety_filter.py医疗诊断、急症、危险运动、药物、自残、免责声明。
tests/test_safety_logic.pyG/M 红黄绿规则。
tests/use_cases/test_send_chat_message_use_case.pyChat 高风险短路、RAG suggested response、免责声明追加。
tests/test_rag_hybrid_contract.pyRAG 高风险输入不进入 hybrid pipeline。
tests/core/test_safety_policy_contract.pySafety policy 公共契约。

来源锚点

  • Content safety: apps/backend_service/app/core/safety_filter.py
  • Rules: apps/backend_service/app/core/safety_rules.py
  • Policy data: apps/backend_service/app/core/safety_policy.py
  • Safety engine: apps/backend_service/app/core/safety_engine.py
  • Chat use case: apps/backend_service/app/use_cases/chat/send_message.py
  • Prescription generation: apps/backend_service/app/core/rag/prescription_generation.py
  • API: apps/backend_service/app/api/safety.pyapps/backend_service/app/api/assessment.py