OpenMed LangChain与LlamaIndex集成:带隐私过滤的RAG管道搭建指南
【免费下载链接】openmedLocal-first healthcare AI: clinical NER & HIPAA PII de-identification that runs 100% on-device. 2,200+ medical models, 21 languages, Apple MLX + Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed
OpenMed 是一个本地优先(local-first)的医疗 AI 工具包,提供临床命名实体识别(NER)与 HIPAA PII 去标识化能力,全部运行在设备端,患者数据不出内网。本文将带你用 OpenMed 的隐私过滤组件,为 LangChain 与 LlamaIndex 搭建一条"检索内容先脱敏、再进大模型"的 RAG 管道,让医疗问答在保护隐私的前提下正常运行。
为什么 RAG 管道需要隐私过滤
在医疗场景的 RAG(检索增强生成)管道中,有一个常被忽略的风险:检索出的临床文档会带着患者姓名、病历号、电话等敏感信息直接拼进 Prompt 发给大模型。一旦模型是云端服务,患者数据就离开了你的网络边界。
OpenMed 的思路是"检索照常,进模型前过一道本地脱敏":
- 脱敏在本地执行,不调用任何托管服务;
- 掩码是确定性的,同一输入得到同一输出,便于审计与测试;
- LangChain / LlamaIndex 均为可选依赖,不安装就不导入,不影响核心库体积。
一键安装步骤:安装可选依赖
按你的技术栈二选一(或都装)即可:
# LangChain 集成 pip install "openmed[langchain]" # LlamaIndex 集成 pip install "openmed[llamaindex]"对应源码位于 openmed/interop/langchain.py 与 openmed/interop/llamaindex.py,依赖声明见 pyproject.toml。
LangChain 集成:在 Prompt 前插入脱敏节点
官方提供了三种粒度的接入方式,全部在 openmed/interop/langchain.py 中定义:
| 工厂函数 | 适用场景 |
|---|---|
create_redaction_runnable() | RAG 管道中检索结果进 Prompt 前脱敏(最常用) |
create_redaction_node() | 链中任意阶段前插入脱敏节点,接受字符串、Document、消息列表等 |
create_redaction_transform() | 不依赖 LangChain 的轻量版,适合离线测试 |
最快配置方法:Retriever 之后接脱敏 Runnable
典型的 RAG 写法是"检索 → 脱敏 → 拼 Prompt → 模型",核心只有 4 行:
from openmed.interop.langchain import create_redaction_runnable redact_context = create_redaction_runnable() chain = ( { "context": retriever | redact_context, # 检索结果先过本地脱敏 "question": RunnablePassthrough(), } | prompt | model )脱敏默认使用掩码方式(如Patient [PERSON] called from [EMAIL].),并可通过LangChainRedactionConfig调整置信度阈值、语言、安全扫描开关等参数。完整示例可参考 docs/integrations-langchain.md。
💡 如果链中传的是字典,还可以用
input_key="context"只对可能含 PHI 的字段脱敏,用户提问字段原样保留。
LlamaIndex 集成:入库前与检索后双重防护
LlamaIndex 一侧提供两个组件(详见 docs/integrations-llamaindex.md):
检索后:Redaction Postprocessor(脱敏后置处理器)
在查询引擎的node_postprocessors里挂上它,检索到的节点在送入响应合成前会被逐节点复制并脱敏——原文档不被修改,节点分数与元数据结构保持不变:
from openmed.interop.llamaindex import create_redaction_postprocessor redact_nodes = create_redaction_postprocessor() query_engine = index.as_query_engine(node_postprocessors=[redact_nodes])入库前:Ingestion Transform(摄入转换)
更彻底的做法是在文档切分、向量化、入库之前完成脱敏,让后续所有环节(包括向量库)只见到安全文本。转换组件会自动:
- 保留节点的 chunk 元数据契约,替换节点/关系 ID 为确定性 UUID 假名,保证存储安全且可关联;
- 将数值型元数据(如日期戳)替换为确定性 token,白名单(如页码)可通过
numeric_metadata_allowlist放行; - 每次调用后提供
audit_metadata——只含节点数、变更值数、实体类别数等计数型审计摘要,绝不含原文、偏移或替换值。
pipeline = IngestionPipeline( transformations=[ redaction_transform, # 先脱敏 SentenceSplitter(chunk_size=512, chunk_overlap=32), embed_model, ], disable_cache=True, # 官方建议关闭摄入缓存 )性能参考:本地批量脱敏够快吗
OpenMed 的批量脱敏基准测试显示,批量处理(batch_size=16)相比单条处理,CPU/Torch 路径快约 3.3 倍、MLX 路径快约 2.2 倍,批量吞吐可达 200+ 文档/秒,本地跑 RAG 摄入完全够用:
更多基准数据见 docs/benchmarks/ 与 docs/assets/pii-batch-benchmark.svg。
进阶:脱敏保留的检索管道
如果你的需求不止"打码",而是希望外部模型只看到占位符、授权角色再按需还原原文,OpenMed 提供了完整的脱敏保留检索原语:RedactedIndex(脱敏索引)、RedactedRetriever(脱敏检索器)、EncryptedMappingVault(加密映射保险库)与AuthorizedReidentifier(授权重标识),均位于 openmed/interop/retrieval/。离线可运行的演示见 examples/redaction_preserving_retrieval.py。
关键要点清单 📋
- ✅ 脱敏节点放在retriever 之后、prompt 之前(LangChain)或切分/嵌入之前(LlamaIndex),顺序错了等于白做;
- ✅ 默认策略是确定性掩码 + HIPAA Safe Harbor 风格策略,可按需切换
strict_no_leak; - ✅ 所有适配器失败时只输出安全的错误信息,异常文本中不携带输入内容;
- ✅ 官方演示应用可直观查看效果:examples/privacy_filter_studio/、examples/privacy_filter_multilingual_studio/(支持多语言)。
按上述步骤,你只需各加几行代码,就能让 LangChain / LlamaIndex 的 RAG 管道在 100% 本地的前提下完成临床文本的隐私过滤——数据不出网,问答照常跑。
【免费下载链接】openmedLocal-first healthcare AI: clinical NER & HIPAA PII de-identification that runs 100% on-device. 2,200+ medical models, 21 languages, Apple MLX + Python, no cloud, no patient data leaving your network. Apache-2.0项目地址: https://gitcode.com/GitHub_Trending/ope/openmed
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考