docs(health-profile): 添加防编造加固修订记录到导出健康档案设计文档

补充了关于导出摘要出现虚构病例问题的详细分析和修复方案,
包括检索策略优化、空数据兜底处理和prompt重写等三层防护措施。
```
This commit is contained in:
link2026
2026-05-30 20:06:12 +08:00
parent dad9d43486
commit 7ad41c5f09
26 changed files with 9062 additions and 7697 deletions

View File

@@ -21,10 +21,13 @@ enum DiaryAssistPrompts {
///
static func suggest(content: String, coveredDimensions: [String] = []) -> String {
let covered = coveredDimensions.filter { !$0.isEmpty }
let coveredLine = covered.isEmpty ? "" : covered.joined(separator: "")
let excludeRule = covered.isEmpty
let coveredSet = Set(covered)
let allowed = dimensions.filter { !coveredSet.contains($0) }
let allowedLine = allowed.isEmpty ? "(已基本问全)" : allowed.joined(separator: "")
// :1.7B
let scopeRule = covered.isEmpty
? ""
: "\n- 本轮【严禁】选择这些已覆盖维度:\(covered.joined(separator: ""));只能从其余维度里挑"
: "\n- 已问过的维度【不要再问】:\(covered.joined(separator: ""))。本轮只能从这些还没问的维度里挑:\(allowedLine)"
return """
你是社区医生的小助手。患者写了一段身体状态的健康记录,信息可能不够完整。
@@ -41,7 +44,7 @@ enum DiaryAssistPrompts {
8. 生活方式 —— 睡眠、饮食、运动习惯、压力
硬性规则:
- 本轮每个问题必须来自【不同】维度,严禁两条落在同一维度(例如不能两条都问"")。\(excludeRule)
- 本轮每个问题必须来自【不同】维度,严禁两条落在同一维度(例如不能两条都问"")。\(scopeRule)
- 只问【最新记录】里还没写明的事。方括号 `[xxx]` 表示该话题已被提出、只是细节待填,【不要】再作为新问题重复它。
- 不给诊断、不给用药建议、不写「建议就医」。
- q ≤ 20 字,像真人医生在问;fill 是采纳后追加到原文的中文补充句,可含方括号占位符如 [时间] [部位]。
@@ -66,7 +69,7 @@ enum DiaryAssistPrompts {
]}
现在输出 JSON。
已覆盖维度(必须避开):\(coveredLine)
本轮可选维度:\(allowedLine)
【最新记录】:
\(content)

View File

@@ -62,15 +62,20 @@ enum HealthExportPrompts {
? "# 就诊摘要"
: "# 就诊摘要 — \(intentLabelCN)"
return """
正在帮患者撰写一份给社区医生看的就诊摘要。要求:
- 严格输出 Markdown,标题用 # / ##,不要 markdown 围栏
- 只用「数据」中给出的信息,数据缺失就写「无记录」
- 不要给诊断意见、用药建议或「建议就医」之类的话
- 引用数值时保留单位 + 参考范围,异常项前加 ⚠️
- 全文中文,简洁,医生 30 秒内能扫完
- 不要复述「数据」二字,不要输出 JSON
是健康数据整理员。任务是把下面【真实数据】(JSON)里**已经存在**的内容,
原样整理成一份给社区医生看的就诊摘要。这是**抽取 / 搬运**任务,不是创作。
结构(严格按以下 6 段):
【最重要的铁律 —— 违反即失败】
- 只能使用【真实数据】JSON 里**真实出现过**的内容。
- 严禁编造或推测任何数字、日期、症状、药物、检查结果、诊断,哪怕看起来很合理。
- JSON 里没有的信息,对应小节一律写「无记录」,不要补全、不要举例、不要套用常见病例模板。
- 数值必须原样照搬(含单位与参考范围);status 为 high/low/abnormal 的指标前加 ⚠️。
- 「主诉」「患者疑问」可参考【患者原话】,但不得加入原话与数据里都没有的症状。
输出格式:
- 严格 Markdown,标题用 # / ##,不要 markdown 围栏,不要输出 JSON,不写「数据」二字。
- 不给诊断意见、用药建议或「建议就医」。全文中文,简洁,医生 30 秒能扫完。
- 严格按以下 6 段(顺序与标题固定):
\(labelLine)
## 主诉
## 患者背景
@@ -79,12 +84,33 @@ enum HealthExportPrompts {
## 在服药与过敏
## 患者疑问
数据:
—— 格式示例(只示范「无记录」与数值写法,内容请勿照抄)——
真实数据:{"profile":{},"symptoms":[],"indicators":[{"name":"","value":"38.5","unit":"","range":"36-37.2","status":"high","date":"2026-05-01"}],"reports":[],"diaries":[],"time_window":{"from":"2026-04-02","to":"2026-05-02"}}
输出:
# 就诊摘要 — 近期健康摘要
## 主诉
无记录
## 患者背景
无记录
## 近期症状(按时间倒序)
无记录
## 关键指标(异常项优先)
⚠️ 体温 38.5 ℃(参考 36-37.2,2026-05-01)
## 在服药与过敏
无记录
## 患者疑问
无记录
—— 示例结束(以上咳嗽/体温等仅示范格式,切勿出现在你的输出里)——
现在,严格根据下面这份【真实数据】生成;数据里没有的就写「无记录」,**禁止编造**:
【真实数据】:
\(dataJSON)
患者原话:\(userPrompt)
患者原话:\(userPrompt)
现在请生成 Markdown(直接输出,不要思考过程,不要 <think> 标签):
再次强调:只整理上面【真实数据】里真实出现过的内容,禁止编造任何数字/日期/症状/药物。
直接输出 Markdown,不要思考过程,不要 <think> 标签:
/no_think
"""
}