wongqihan/triagebench
GitHub: wongqihan/triagebench
TriageBench 通过反事实一致性测试来衡量临床大语言模型在患者性别、语言或邮编等无关属性改变时是否仍能保持相同的分诊决策。
Stars: 0 | Forks: 0
# TriageBench
TriageBench 用于衡量临床 AI 在你改变某些不应影响答案的患者信息(如性别、书写语言或 ZIP 代码)时,是否会做出**相同的分诊决策**。它保持症状完全相同,仅替换一个无关细节,并报告决策的偏离程度。它对一致性进行评分,但不评判哪种分诊判断在临床上是正确的。
## 运行说明
```
pip install --upgrade pip # editable installs need pip >= 21.3
pip install -e ".[all]"
export OPENAI_API_KEY=... # one key for the quickstart
triagebench run configs/quickstart.yaml # ~10 calls, done in seconds
```
这会在单次性别互换中运行一个模型。要运行完整的性别复现实验,请运行 `configs/triage_gender_age.yaml`;要运行八模型排行榜,请运行 `scripts/leaderboard.sh`。这两者都会调用其他提供商,因此也请设置 `ANTHROPIC_API_KEY`、`GEMINI_API_KEY` 和 `DEEPSEEK_API_KEY`。
## 为什么这很重要
如果分诊助手因为患者提到了 ZIP 代码(在症状不变的情况下)而提高或降低紧迫性,无论你认为哪种建议是正确的,这都是不安全的。这种失败是真实且巨大的:在三项研究中,TriageBench 发现一个已部署的模型在性别互换时,其急诊转诊率波动了 90 个百分点,在不同语言间波动了 33 个百分点,而仅凭一个简单的 ZIP 代码波动了 12 个百分点,且这一切都建立在症状完全相同的基础上。它使这种失败变得可衡量和可复现,因此你可以在模型接触患者之前发现它。
## 发现
指标是 **TriageGap**:模型在替换属性时的最高和最低决策率之间的差值,带有 95% 的置信区间。TriageGap 为 0 表示完全一致。

*每个模型在每项探针的两种条件下的急诊转诊率。贴在侧壁上的圆点固定在 0% 或 100%,无法显示出差距。如果模型有波动空间,线条会显示当改变一个无关细节时,其决策的偏离程度。*
| 探针 | 改变的内容(案例保持一致) | 最大差距 | 模型 | 论文 |
|---|---|---|---|---|
| 性别 | 男性 vs 女性,25 岁,神经科案例 | **90 pp**(男性 96.7% vs 女性 6.7% 急诊) | Claude Sonnet 4.6 | [arXiv:2606.03641](https://arxiv.org/abs/2606.03641) |
| 语言 | 以 8 种语言编写的相同案例 | **33 pp**(法语 33% vs 日语 0% 急诊) | Gemini 3.5 Flash | [arXiv:2606.01204](https://arxiv.org/abs/2606.01204) |
| 社会经济地位 | 富裕 vs 贫困 ZIP 代码,以及明确的社会地位 | **50 pp** 来自明确地位,**12 pp** 来自仅含 ZIP 代码 | Gemini 3.5 Flash | 提交中 |
**性别。** 在一组完全相同的神经系统症状中,Claude Sonnet 4.6 将 96.7% 的 25 岁男性送往急诊室,而女性仅有 6.7%,这一 90 个百分点的差距在 65 岁时彻底消失。原因是诊断替代:模型倾向于寻求与性别相关的诊断(特发性颅内高压,在流行病学上与年轻女性相关),而这种诊断的紧迫性较低,同时给予男性会触发急诊转诊的全面检查。GPT-5.4-mini 表现出相同的模式,差距为 60 个百分点,而 Gemini 对女性的转诊率为 0%,对男性则高达三分之一。
**语言。** 用不同语言书写相同的神经科病例,使 Gemini 3.5 Flash 的急诊转诊率从日语的 0% 变为法语的 33%,英语为 30%。模型将语言视为患者所在国家的代理指标,并应用该国的医疗保健规范,而不是重新评估症状。告知模型患者在美国,将日语的转诊率从 0% 提升至 47%;而告知模型一位说英语的患者在东京,则将转诊率从 30% 降至 7%,这证实了模型理解了症状,而地点推断才是影响决策的关键。
**社会经济地位。** 明确的社会地位信号(保险、职业、住房)使所有三个模型向保护性方向偏移了 37 到 50 个百分点:低 SES(社会经济地位)患者被送往急诊室的频率更高,这与“就医机会”先验逻辑一致,即模型将急诊室视为无法轻易获得后续随访预约患者的安全网。更引人注目的结果是,仅凭一个简单的 ZIP 代码,在六个美国大都市区的汇总数据中,Gemini 3.5 Flash 的转诊率就偏移了 11.7 个百分点(p = 6.5 × 10⁻⁸,六个城市方向一致),而 Claude Sonnet 4.6 对 ZIP 代码完全没有反应(0.0 个百分点),GPT-5.4-mini 几乎没有反应(2.5 个百分点,且不一致)。更强大的模型只会在信号被明确表述时才会发生偏移,而部署级别的模型却能从仅仅五个数字中将其解码。一行简单的系统提示指令将 Gemini 的 ZIP 代码差距从 11.2 个百分点削减至 3.2 个百分点,但并未完全消除。完整的论文正在提交中,将在发布时在此处链接。
**在偏见显现之前,模型在基本问题上就存在分歧。** 在同一个红旗神经系统病例上,八个模型的急诊转诊率跨度从 0% 到 100%:有两个模型转诊了每一位患者,有一个一个都没转诊。TriageBench 不评判哪种判断是正确的,但在一个明确的单一病例中出现 100 个百分点的跨度本身就是一个可靠性问题,这也是为什么属性差距在中段模型中表现得最为明显的原因。一个已经固定在 0% 或 100% 的模型已经没有空间来揭示性别、语言或 ZIP 代码的影响了。
## 工作原理
探针(probe)包含三件事:一个固定的临床场景、一个其各水平在决策上等价的被替换属性,以及一个用于读取模型决策的解析器。每个探针都是一个简短的 YAML 配置加上一个小型的 Python 模块。有关设计,请参阅 `SPEC.md`;有关参考实现,请参阅 `experiments/triage/`。
```
triagebench run configs/.yaml # run + report (cached, resumable)
triagebench report configs/.yaml # rebuild tables/charts, no API calls
triagebench leaderboard configs/leaderboard/*.yaml -o leaderboard/leaderboard.json
triagebench models # list the model registry
```
使用 `./scripts/leaderboard.sh` 复现完整的八模型排行榜,它会运行 `configs/leaderboard/` 中的三个探针,并将 TriageGap 矩阵写入 `leaderboard/leaderboard.md`。每次调用都会被缓存,因此重复运行没有任何成本,而添加一个模型只需在 `models.yaml` 中添加一行。
## 可复现性
- 每个 API 调用都基于 `(model, messages, temperature, run_index)` 进行缓存,因此每次重复运行都是独立的样本,且崩溃的运行会从中断处恢复。
- 每个原始响应都会记录到 JSONL 中且永远不会被丢弃,因此任何结果都可以在日后针对任何人提出的指标进行重新评分。
- 每个结论都附有置信区间,而隐式 ZIP 代码的结论还增加了六对独立城市的符号一致性验证。
- 测试针对 stub provider 运行完整的运行程序、缓存和指标路径,且不需要任何 API 密钥。使用 `pip install -e ".[dev]"` 安装测试依赖项并运行 `pytest -q`。
有关完整的方法论,请参阅 `SPEC.md`,包括在开发过程中发现并修复的一个缓存 bug。
## 目录结构
```
triagebench/ core: model adapter, runner, cache, metrics, plotting
experiments/ one package per probe (triage is the flagship)
configs/ YAML probe definitions
configs/leaderboard/ the three probes behind the public board
scripts/ leaderboard.sh and helpers
SPEC.md what TriageBench measures and the credibility gates
```
## 引用
如果你使用了 TriageBench,请引用相关的研究:
```
@misc{wong2026ses,
title = {Socioeconomic Inference in LLM Medical Triage: Same Symptoms, Different ZIP Code},
author = {Wong, Qi Han},
year = {2026},
note = {arXiv preprint}
}
```
## 许可证
MIT
标签:DLL 劫持, Petitpotam, Python, 公平性测试, 医疗AI, 大语言模型, 安全规则引擎, 无后门, 模型评估, 逆向工具