# Anpheros 症状引擎：方法论

> 任何语言的自由文本症状如何转化为 WHO ICD-10 和 ICD-11 概念：AI 规范器、存在性和经历者检测、WHO 审核的词汇表、评估结果、相似案例匹配和局限性。

Source: https://developers.anpheros.com/zh/guides/symptom-engine

**Anpheros 症状引擎将用户用自己的话和语言描述感受的内容，转化为国际临床概念：稳定的 Anpheros 标识符、WHO ICD-10 代码、WHO ICD-11 代码和身体系统，以及症状是存在、已解决、假设还是关于他人的信息。它在 Anpheros Daily 背后运行，将结果作为 HL7 FHIR R4 Observations 发布在 Anpheros Platform 上，并通过 REST 和 FHIR API 将相同的术语暴露给任何应用程序。** 本页将介绍其工作原理、检查方式、测量内容以及局限性。

## 概览

| | |
|---|---|
| Concepts | 274 (197 症状, 77 发现), 标识符 `SYM-0001`…, 永不重复 |
| Classifications | WHO ICD-10 (2019 版) 和 WHO ICD-11 MMS (2025-01), 包含每个映射的等效性 |
| Body systems | 13, 取自 ICD-11 第 21 章块 (神经、消化、呼吸、皮肤…) |
| Languages | 20 种语言的名称；以个人母语提供的自由文本 |
| Warning signs | 32, 针对 14 个概念, 直接引用自 CDC 和 NIDDK |
| Normalizer evaluation | 5 种语言 (罗马尼亚语、英语、西班牙语、德语、法语): 主要代码 97.5–100 %, 存在性和主题 92.5–98 %, 否定症状报告为存在 0 % (所有语言) |
| Clinical review | 尚无: 每次响应时 `clinical_review: false` |
| Standards | HL7 FHIR R4 (`CodeSystem`, `ValueSet`, `ConceptMap`, `Observation`), ICD-10, ICD-11, LOINC 用于实验室结果 |

## 1. 管道

一个症状会经历四个步骤。用户的文本永远不会被更改；每一步都会在其旁边添加数据。

1. **捕获 (Capture)。** 原始录入会以其书写时的状态存储，包含记录的时间、手机时区、语言，以及可选的强度（1-10）、发病时间和结束时间。下游任何操作都不会重写它。
2. **标准化 (Normalization) (AI)。** 一个大型语言模型（Google Gemini on Vertex AI）会读取文本，并为它提到的每个症状返回：一个主要的 ICD-10 代码、可选的次要代码、一个简短标签，以及两个属性：*断言 (assertion)*（存在、缺失、已解决、假设、不确定）和 *主体 (subject)*（本人或他人）。该模型只能从 Anpheros 词汇表中选择代码；任何其他答案、遗漏的条目或无效的主要代码都算作一次失败的尝试，绝不会被视为“未知症状”。
3. **概念映射 (Concept mapping) (确定性)。** ICD-10 代码会被映射到 Anpheros 概念，并从中映射到 ICD-11 和身体系统。此步骤使用固定的表格，而非 AI，因此相同的代码始终会产生相同的概念。
4. **发布 (Publication)。** 只有 **存在 (present)** 且 **关于本人 (about the person)** 的症状，在标准化成功后，才会成为本人记录中的 FHIR Observations。如果后续的编辑或重新标准化改变了这一点，该 Observation 将被撤回；版本历史会保留。

## 2. 存在、时间与经历者

临床文本经常提及患者没有的症状。临床自然语言处理称之为*否定*、*时态*和*经历者*检测（NegEx 和 ConText 方法家族）。引擎通过模型的 assertion 和 subject 属性处理这三个相同的问题：

| 书写内容 | Assertion / subject | 是否被发布为患者的症状？ |
|---|---|---|
| "I've had a headache since Tuesday" | present / self | yes |
| "my head doesn't hurt any more" | resolved / self | no |
| "I might get a fever tomorrow" | hypothetical / self | no |
| "my mother has a cough" | present / other | no |

亲属的抱怨永远不会自动转化为家族史。

## 3. 词汇表及其检查方式

词汇表涵盖 ICD-10 第十八章（R00–R94，自 2026.10.3 版本起，还包括其非残余子类别，如 R06.0 呼吸困难），以及在 WHO 将症状归类到其他章节时，使用 WHO 代码：便秘 K59.0，耳鸣 H93.1，复视 H53.2，视物模糊 H53.8，瘙痒 L29.9，关节痛 M25.5，背痛 M54，睡眠问题 G47。

- **ICD-10。** 每个代码和英文标题均根据 WHO ICD-10 2019 版本浏览器进行了检查，包括每个代码的包含和排除说明。当说明将某个症状移至其他位置时（例如，R19.4 排除便秘），词汇表将遵循 WHO 的规定。
- **ICD-11。** 每个概念都映射到 WHO 简单制表中的 ICD-11 MMS 2025-01 代码，并与官方 WHO ICD-10 → ICD-11 映射表进行比较。引擎使用第 21 章的*症状*代码，而不是疾病代码（头痛 → MB4D，而不是 8A8Z“头痛疾病”）；21 个偏离 WHO 统计表的条目及其原因均在发布文件中列出。67 个映射是等效的，其余的被标记为更宽泛、更狭窄或不精确。
- **记录的选择。** 人们书写的“偏头痛”被编码为头痛 (R51)，未指明的腹泻被编码为 R19，因为备选的 WHO 代码（G43、A09）是诊断；引擎记录报告的症状，而非诊断。
- **翻译。** 英文名称是 WHO 的标题。18 种其他语言的名称是机器翻译，经过逐词审查，并借助 AI，与 WHO 标题进行比对（`review: ai_reviewed`）；在意义不匹配代码的语言中，有五种语言被重写。尚未有专业医学翻译人员对其进行审查。
- **警告标志。** 直接引用自 CDC（中风、心脏病发作）和 NIDDK（腹泻、便秘）的公共领域页面，逐字引用，从不意译，并附有来源、许可和非诊断的说明。当引用中提到 9-1-1 时，说明中会补充欧洲的 112。

## 4. 评估

该正常化器在 100 个合成案例的固定数据集上进行评估，这些案例使用罗马尼亚语（大多数当前用户使用的语言）编写，每个案例都附带预期的主要代码、断言和主题。其中 32 个案例故意不出现：被否定、已解决、假设、不确定或关于另一个人。使用当前提示（版本 3，2026 年 10 月 15 日）的结果如下：

| 指标 | 结果 | 目标 |
|---|---|---|
| 主要代码正确 | 100 % | ≥ 85 % |
| 断言和主题均正确 | 98 % | — |
| 否定症状报告为存在 | 0 % | ≤ 3 % |

两个错误是行政条目（“周二与心脏病专家预约”、“我想减掉 5 公斤”），被归类为假设而非存在；两者都不是症状。该测试集未经临床医生审查，因此分数仅供参考。

**其他语言（2026 年 10 月 16 日）。** 涵盖所有类别的 40 个案例被翻译成英语、西班牙语、德语和法语，并附有相同的预期答案；非正式案例以每种语言自己的非正式风格重写。模型指令保持不变。

| 语言 | 案例 | 主要代码 | 存在和主题 | 否定报告为存在 |
|---|---|---|---|---|
| 罗马尼亚语 | 100 | 100 % | 98 % | 0 % |
| 英语 | 40 | 100 % | 97.5 % | 0 % |
| 西班牙语 | 40 | 97.5 % | 92.5 % | 0 % |
| 德语 | 40 | 100 % | 97.5 % | 0 % |
| 法语 | 40 | 100 % | 95 % | 0 % |

大多数剩余错误是相同的行政条目（“周二的心脏病专家预约”、“体检，一切正常”）或在两种不存在状态之间进行选择（“今天没有发烧”被视为已解决而非不存在）；其中没有一个发布了症状。唯一的编码差异是西班牙语的“escalofríos y malestar”（发冷和不适），被编码为不适 (R53)，发冷 (R68) 作为次要代码，而不是反之。

显示给人们的名称遵循其语言：应用程序以用户的语言（首先是俗名）显示概念名称，并以应用程序的 20 种语言显示存在说明（“已解决”、“其他人”）。

**生产环境（2026 年 10 月 16 日）**，在词汇表与 WHO 检查后，所有存储的症状都进行了重新规范化。在真实用户的记录上：所有症状都已规范化，0 个存在症状仍标记为“不清楚”，0 个不存在的症状被发布为患者本人（已发布的 Observations 的独立审计）。

## 5. 相似病例（开发中）

下一个组件通过症状和异常实验室结果来比较个体，以在获得明确同意的情况下，推荐报告非常相似的个体。

- **Profile（个人资料）。** 以 Anpheros 概念表示的过去 90 天内自我报告的症状，以及以 LOINC 代码表示的过去 180 天内超出实验室打印的参考范围的实验室结果。个人资料独立于语言和国家：罗马尼亚语的实验室报告和英语的实验室报告映射到相同的 LOINC 代码。
- **Score（分数）。** 加权 Jaccard 指数：共享体征数 / 两个个体所有体征的总数。非常常见的症状（头痛、腹痛、疲劳、发烧、咳嗽、头晕……）权重为 0.25，特异性症状权重为 1，异常实验室结果权重为 1.5。对于 50 名参与者，权重还会根据体征在人群中的稀有度（逆文档频率）进行缩放。同一身体系统中的两个不同体征可获得部分分数。
- **Rule（规则）。** 只有当至少有三个共享的特异性症状，或两个特异性症状加上一个共享的异常实验室结果时，才会考虑一对。仅凭常见主诉绝不会使两个人“相似”。分数达到 0.70 时提供邀请；个人在分数达到 0.80 时可以看到相似病例。
- **Privacy（隐私）。** 仅限成年账户持有者，需要明确同意（GDPR 第 9 条），可随时撤销，并立即删除。个人可以看到计数和共享的体征，但永远看不到其他人的身份。

此功能不建议诊断或疾病。

## 6. 应用程序如何使用它

- **Anpheros Daily** (iOS, Android, Mac, web): 用户记录的每个症状都会经过上述流程；用户可以查看和更正结果。
- **Anpheros Platform**: 症状以 FHIR `Observation` 的形式存储，并带有类别 `urn:anpheros:observation-category|symptom`，包括代码和用户自己的文本。任何获得用户同意的应用程序都可以读取它们。
- **您的应用程序**: 使用 `GET /v1/terminology/symptoms` 搜索概念，扩展 FHIR `ValueSet`，使用 `ConceptMap` 将代码翻译成 ICD-10 和 ICD-11，并根据 `anpheros-symptom` profile 验证 Observations。有关请求和响应，请参阅 [Symptom data API](https://developers.anpheros.com/zh/guides/symptom-data-api)。
- **AI 助手和代理** 通过 [Context API](https://developers.anpheros.com/zh/guides/ai-agents-medical-data) 读取相同的结构化数据，而不是自由文本，因此它们的回答可以引用代码。

## 7. 限制

- 该引擎仅对症状进行命名和编码，不进行诊断、原因排序或将症状与疾病关联。
- 尚无临床医生审查过词汇表、翻译或警告信号。
- 评估集是合成的；20 种语言中有 15 种尚无评估集。
- ICD-11 由 WHO 根据 CC BY-ND 3.0 IGO 许可；代码和标题保持不变。

## 相关

- [症状数据 API](https://developers.anpheros.com/zh/guides/symptom-data-api)：概念、FHIR 术语和患者报告的症状
- [Anpheros Search](https://developers.anpheros.com/zh/guides/anpheros-search)：在同一个公共目录中，将相同的症状与病症和治疗方法结合在一起，每个条目都附有其来源
- [FHIR 代码系统](https://developers.anpheros.com/zh/guides/fhir-code-systems)
- [纵向患者数据 API](https://developers.anpheros.com/zh/guides/longitudinal-patient-data-api)
