Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card
Anpheros 症状引擎:方法论
任何语言的自由文本症状如何转化为 WHO ICD-10 和 ICD-11 概念:AI 规范化器,存在性和经历者检测,WHO 检查的词汇表,评估结果,相似病例匹配和限制。
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. 管道
一个症状会经历四个步骤。用户的文本永远不会被更改;每一步都会在其旁边添加数据。
- 捕获 (Capture)。 原始录入会以其书写时的状态存储,包含记录的时间、手机时区、语言,以及可选的强度(1-10)、发病时间和结束时间。下游任何操作都不会重写它。
- 标准化 (Normalization) (AI)。 一个大型语言模型(Google Gemini on Vertex AI)会读取文本,并为它提到的每个症状返回:一个主要的 ICD-10 代码、可选的次要代码、一个简短标签,以及两个属性:断言 (assertion)(存在、缺失、已解决、假设、不确定)和 主体 (subject)(本人或他人)。该模型只能从 Anpheros 词汇表中选择代码;任何其他答案、遗漏的条目或无效的主要代码都算作一次失败的尝试,绝不会被视为“未知症状”。
- 概念映射 (Concept mapping) (确定性)。 ICD-10 代码会被映射到 Anpheros 概念,并从中映射到 ICD-11 和身体系统。此步骤使用固定的表格,而非 AI,因此相同的代码始终会产生相同的概念。
- 发布 (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搜索概念,扩展 FHIRValueSet,使用ConceptMap将代码翻译成 ICD-10 和 ICD-11,并根据anpheros-symptomprofile 验证 Observations。有关请求和响应,请参阅 Symptom data API。 - AI 助手和代理 通过 Context API 读取相同的结构化数据,而不是自由文本,因此它们的回答可以引用代码。
7. 限制
- 该引擎仅对症状进行命名和编码,不进行诊断、原因排序或将症状与疾病关联。
- 尚无临床医生审查过词汇表、翻译或警告信号。
- 评估集是合成的;20 种语言中有 15 种尚无评估集。
- ICD-11 由 WHO 根据 CC BY-ND 3.0 IGO 许可;代码和标题保持不变。
相关
- 症状数据 API:概念、FHIR 术语和患者报告的症状
- Anpheros Search:在同一个公共目录中,将相同的症状与病症和治疗方法结合在一起,每个条目都附有其来源
- FHIR 代码系统
- 纵向患者数据 API
Try it free in the sandbox · first FHIR call in 5 minutesFree · 30 synthetic patients · no card