# 医疗数据溯源详解

> 每次写入 FHIR R4 记录时，溯源都会记录作者类型、人员、组织、源系统、版本等信息。本指南将介绍如何通过标头设置溯源信息，如何读取溯源信息，以及它如何标记提供给 AI 模型的数据。

Source: https://developers.anpheros.com/zh/guides/medical-data-provenance

**溯源记录了医疗数据的来源：谁编写了它，代表哪个组织，来自哪个系统，何时编写，以及每个版本发生了什么变化。** 在一个收集患者、设备、诊所、实验室和 AI 数据的数据记录中，溯源是使数据值值得信赖的关键：没有溯源，在家中输入的血压读数和在诊所测量的血压读数看起来是相同的。在 Anpheros 中，每次写入 HL7 FHIR R4 记录都会自动生成一个 FHIR `Provenance` 资源。本页将解释该资源包含的内容、如何正确填写以及如何读取它。

## 为什么溯源很重要

- **临床信任。** 医生对实验室结果的权衡与患者输入的值或 AI 从照片中提取的数字不同。
- **AI 安全。** 模型接收到一条记录后，必须知道哪些是事实，哪些是另一模型编写的注释。没有标签，模型会一视同仁。
- **更正和争议。** 当一个值发生变化时，每个人都需要知道它之前是什么，谁更改了它以及为什么。
- **问责制。** 根据 GDPR 和欧洲健康数据空间 (European Health Data Space) 的规定，组织必须能够展示其如何处理个人的健康数据。
- **共享。** 当患者允许第二家诊所读取其记录时，该诊所需要知道第一家诊所写入了哪些数据。

## Anpheros 每次写入时记录的内容

| 问题 | 记录位置 | 设置方式 |
|---|---|---|
| 作者类型？ | `agent.who.identifier` (author type) | 在 `/v1` 中设置 `author_type`，或在 `X-Anpheros-Author-Type` 头信息中设置：`patient`, `practitioner`, `device`, `import`, `ai` |
| 哪个病人？ | `agent.who.reference` | `X-Anpheros-Author-Ref: Practitioner/<id>`，或 `X-Anpheros-Acting-As` |
| 为哪个组织？ | `agent.onBehalfOf` | `PractitionerRole` 的组织，或 `X-Anpheros-On-Behalf-Of: Organization/<id>` |
| 来自哪个系统？ | 角色为 `source` 的 `entity` | `X-Anpheros-Source-System: <name>` |
| 该系统中的哪个记录？ | origin id | `X-Anpheros-Origin-Id: <id>` |
| 何时，发生了什么？ | `recorded`, `activity` (CREATE, UPDATE, DELETE) | 自动 |
| 哪个版本？ | `target` 指向 `<Resource>/<id>/_history/<version>` | 自动 |

如果您未指明作者，平台将记录 `import`。平台绝不会假定 `patient`，因为错误地将值归因于病人，比诚实地标记为导入的值更糟糕。

## 完整的来源记录

一位心脏病专家在诊所就诊时，通过诊所的软件记录心率：

```bash
curl -X POST https://platform.anpheros.com/fhir/R4/Observation -H "Authorization: Bearer $KEY" \
     -H "Content-Type: application/fhir+json" \
     -H "X-Anpheros-Author-Type: practitioner" \
     -H "X-Anpheros-Acting-As: PractitionerRole/$ROLE" \
     -H "X-Anpheros-Source-System: ccn-emr" \
     -d '{ "resourceType": "Observation", "status": "final", "code": {"coding": [{"system": "http://loinc.org", "code": "8867-4"}]}, … }'
```

平台记录的来源信息：

```json
{"resourceType": "Provenance",
 "target": [{"reference": "Observation/8660eb7c-…/_history/1"}],
 "recorded": "2026-10-12T20:41:47.469000Z",
 "activity": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/v3-DataOperation", "code": "CREATE"}]},
 "agent": [{"type": {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/provenance-participant-type", "code": "author"}]},
            "who": {"reference": "PractitionerRole/e6d8c227-…",
                    "identifier": {"system": "https://anpheros.com/fhir/CodeSystem/author-type", "value": "practitioner"}},
            "onBehalfOf": {"reference": "Organization/c3a56a4b-…", "display": "Clinica Cardio Nord"}}],
 "entity": [{"role": "source", "what": {"identifier": {"system": "ccn-emr"}}}]}
```

医生的角色、他们的诊所、作者类型和源系统都包含在标准的 FHIR 中。`PractitionerRole` 必须存在于您项目的目录中并且处于激活状态。命名他人从业者的请求将被拒绝：

```json
{"resourceType": "OperationOutcome", "issue": [{"severity": "error", "code": "invalid",
  "diagnostics": "Unknown or inactive Practitioner in X-Anpheros-Acting-As."}]}
```

目录的设置在 [如何将诊所系统与 FHIR 后端集成](https://developers.anpheros.com/zh/guides/integrate-clinic-systems-fhir) 中有介绍。

## 版本：不会静默覆盖

每次更新都会为资源创建一个新版本及其新的 Provenance。在上面的心率从 92 校正为 88 后：

```bash
curl https://platform.anpheros.com/fhir/R4/Observation/$OBS/_history -H "Authorization: Bearer $KEY"
```

返回版本 2 (88) 和版本 1 (92)。REST 视图总结了每个版本的 Provenance：

```bash
curl https://platform.anpheros.com/v1/patients/$PID/provenance/Observation/$OBS -H "Authorization: Bearer $KEY"
```

```json
{"data": [
  {"version": 1, "activity": "CREATE", "recorded": "2026-10-12T20:41:47.469000Z", "author_type": "practitioner", "author": "PractitionerRole/e6d8c227-…", "source_system": "ccn-emr", "fhir": "Provenance/6ed91529-…"},
  {"version": 2, "activity": "UPDATE", "recorded": "2026-10-12T20:41:47.500000Z", "author_type": "practitioner", "fhir": "Provenance/3fbf270f-…"}],
 "total": 2}
```

删除是软删除：已删除的资源将从搜索结果中消失，但其历史记录和 Provenance 仍然保留。

## 读取溯源信息

```bash
# who wrote this resource (all versions)
GET /fhir/R4/Provenance?target=Observation/{id}
# everything a practitioner recorded
GET /fhir/R4/Provenance?agent=PractitionerRole/{id}
# the same, summarised, per resource
GET /v1/patients/{pid}/provenance/Observation/{id}
```

## AI 上下文中的来源信息

[上下文 API](https://developers.anpheros.com/zh/guides/llm-healthcare-data) 将来源信息带入其提供给模型的每个条目中，如 `author_type` 和 `source` 所示。文本形式如下：

```
- Type 2 diabetes mellitus (E11), active, onset 2024-10-15 [import/anpheros-sandbox]
- Metformin 1000 mg 1 tablet twice daily with meals, active [patient/anpheros-sandbox]
- Glucose [Mass/volume] in Blood: 2026-09-16: 140.0 mg/dL [device/anpheros-sandbox]
```

使用 `author_type: ai` 编写的测量值不会出现在这些事实中。它们单独列在 `ai_notes` 下，并标记为未经验证，因此模型不会将早期模型的猜测误认为是测量值。告诉模型标签的含义并要求它引用它们；[如何使用 FHIR 后端构建 AI 医疗应用程序](https://developers.anpheros.com/zh/guides/build-ai-healthcare-app) 展示了一个执行此操作的提示。

## 患者所见

出处信息也是患者所见。患者的记录显示了谁添加了每一项内容，其连接列表显示了每个应用程序谁访问了什么，当执业医师进行操作时会显示其姓名（“Dr. Ana Popescu · Clinica Cardio Nord 阅读了您的实验室结果”）。请参阅 [同意与访问模型](https://developers.anpheros.com/zh/guides/consent)。

## 确保溯源信息有用的规则

1. **始终设置作者类型。** 这只需要一个字段，并且是记录中最重要的标签。
2. **当由个人编写时，请命名该个人。** 对于临床人员，请使用 `X-Anpheros-Acting-As`。
3. **命名源系统**，并在存在源系统自身 ID 时，将其作为 origin id 传递。
4. **通过更新进行更正，切勿删除后重新创建。** 更新会保留旧值与新值之间的链接。
5. **将 AI 输出标记为 `ai`**，包括模型从文档中提取的值。从文档派生的值也可以使用 `derived_from` 指回该文档。

## 常见问题解答

### 什么是医疗保健中的数据溯源？
记录健康数据来源和历史：谁创建或更改了它，代表谁，来自哪个系统以及何时。在 HL7 FHIR 中，它由 `Provenance` 资源表示，该资源指向它所描述资源的精确版本。

### 溯源与审计日志相同吗？
不。溯源描述数据：谁编写了每个版本。审计日志描述访问：谁在何时、在什么同意下读取或写入了什么。Anpheros 同时保留两者；患者可以看到连接到其记录的每个应用程序的访问日志。

### 我可以编写自己的溯源资源吗？
Anpheros 会为每次创建、更新和删除操作编写一个溯源，所以您通常不需要。使用上面的标头使其精确。客户端提供的溯源必须针对单个患者的资源。

## 相关资源

- [同意和访问模型](https://developers.anpheros.com/zh/guides/consent)
- [如何将诊所系统与 FHIR 后端集成](https://developers.anpheros.com/zh/guides/integrate-clinic-systems-fhir)
- [如何规范化医疗数据](https://developers.anpheros.com/zh/guides/normalize-medical-data)
- [医疗数据互操作性](https://developers.anpheros.com/zh/guides/interoperability)
- [安全、隐私和数据驻留](https://developers.anpheros.com/zh/guides/security)
