Handling PII data in LangChain

LangChain 中处理 PII 数据

5 分钟阅读

这篇博文由 Francisco 撰写,他是 Pampa Labs 的创始人,该公司协助企业开发准确且经济高效的 LLM 应用程序。

简介

PII 代表“个人身份信息”,指的是可用于识别个人身份的个人数据。 近期,GDPR 等法规的出现,使得企业越来越重视寻找有效处理 PII 数据的解决方案。

使用 LLM 管理 PII 数据可能很棘手。在许多应用程序中,您知道何时处理 PII 数据,因为您会在表单中明确要求提供这些数据。 在聊天机器人的情况下,用户可能会在对话中自发地发送 PII 数据(例如,提供自己的姓名和姓氏),并且根据应用程序的不同,此信息可能会发送给 LLM 提供商并记录下来以用于质量目的。

以下是一些常见问题

  • 有哪些可用于屏蔽 PII 数据的选项?
  • LangSmith 呢?如果 LangSmith 记录了我的应用程序对话,它也会记录 PII 数据吗?
  • 如果我们将其发送给 OpenAI,我们是否面临 PII 数据泄露的风险?其他供应商呢?

虽然我们不打算对这些问题给出明确的答案,但通过介绍一些当今可用的选项,我们可以引发关于在使用 LLM 时处理 PII 数据的最佳方法的对话。

为什么您应该关注屏蔽 LLM 提供商的输入

OpenAI、Anthropic 和 Cohere 等 LLM 提供商都有自己的隐私政策,详细说明了他们在使用其 API 时如何使用发送给他们的数据。 例如,一些公司可能会使用这些数据来研究如何改进模型,甚至使用这些数据来训练新模型。 由于 LLM 有时可以明确记住他们在训练中学到的东西,这可能意味着他们未来版本的 LLM 可能会向其他用户重现您的 PII 数据。

鉴于这些隐私政策的重要性以及它们可能会随时间变化的事实,我们强烈建议用户在使用提供商的服务之前查看提供商的隐私政策。 例如,这是 OpenAI 的隐私政策。

为 LLM 提供商清理数据

第一个问题是:我们如何匿名化数据? LangChain 生态系统与一些工具集成,这些工具可以轻松地在应用程序中使用数据之前屏蔽数据。 让我们看看其中的一些

Microsoft Presidio

Microsoft Presidio 是一种工具,可促进输入文本中的 PII 识别和匿名化。 换句话说,它可以将文本的 PII 元素替换为通用等效项。 它非常方便,因为它可以替换信用卡号、电子邮件、电话、地址和全名等实体。

Presidio 分两步工作。 首先,它分析文本以搜索 PII 数据。 这可能是 Presidio 的关键差异化功能,因为它使用多种不同的方法来识别文本中的 PII 数据,包括基于规则的逻辑和 NER 机器学习模型。 第二步,它通过将其替换为通用等效项(即“<PERSON>”)来匿名化数据。 如果在 LangChain 中使用它,该库使用 faker 将实体替换为虚假值(“John Smith”),以使文本对于 LLM 来说更自然。

如果您想了解有关 Presidio 如何识别 PII 数据的更多详细信息,这里 您可以找到 Presidio 开箱即用的实体,以及用于检测它们的方法。

在 LangChain 中使用 Presidio 非常简单;只需在链中添加一个额外的步骤,在其中进行匿名化,如下所示

anonymizer = PresidioAnonymizer()
template = """Rewrite this text into an official, short email:
{anonymized_text}"""
prompt = PromptTemplate.from_template(template)
llm = ChatOpenAI(temperature=0)
chain = {"anonymized_text": anonymizer.anonymize} | prompt | llm
response = chain.invoke(text)

在 LangChain 文档中,我们可以找到关于如何使用 Microsoft Presidio 的完整教程,以及关于如何将 Presidio 与非英语语言一起使用的教程。 如果计划使用 Presidio,您还可以考虑将其与 LLMGuard 一起使用,后者包含一套用于 LLM 安全的工具,包括输入控制和防护(PII 数据匿名化、越狱)以及输出控制(恶意链接、毒性)。

OpaquePrompts

匿名化数据的另一个好选择是使用 OpaquePrompts。 OpaquePrompts 没有统一使用多种技术,而是使用一个 ML 模型来检测 PII 数据并对其进行适当的屏蔽。

使用 OpaquePrompts 的主要优点之一是它在 LangChain 中使用起来非常容易,我们只需使用一个 `OpaquePrompts` LLM 类,并使用 LangChain LLM(如 `OpenAI`)对其进行初始化。

chain = LLMChain(
  prompt=prompt,
  # llm=OpenAI(),
  llm=OpaquePrompts(base_llm=OpenAI()),
  memory=memory,
)

它的另一个不同之处在于它使用机密计算,这意味着即使是他们的匿名化服务也无法访问原始数据;对于寻求隐私的用户来说,这是一个很棒的功能。 最后,它会在从 LLM 获得响应后取消匿名化数据,因此用户将获得包含他们提及/请求的原始实体的答案。

为 LangSmith 清理数据

如果我们想使用 LangSmith 来记录我们应用程序的对话,我们可能会面临另一个挑战:以清理后的形式保存数据。 如果我们只是按照前面描述的方式使用上述工具,LLM 提供商将收到清理后的输入,但我们会将原始的、未清理的输入保存到 LangSmith。 我们如何避免这种情况?

选项 1:不保存输入或输出

如果我们想确保我们没有将任何 PII 数据保存到 LangSmith,我们可以直接从 LangSmith 隐藏我们所有查询的输入和输出。 这可以通过一些环境变量来完成,LangSmith 将使用这些环境变量来了解它是否需要记录输入/输出

LANGCHAIN_HIDE_INPUTS=true
LANGCHAIN_HIDE_OUTPUTS=true

通过这种方式,我们可以直接控制记录什么和不记录什么。 有关这方面的更多信息,请参阅文档

重要的是要注意,如果使用此功能,我们应考虑隐藏输入和输出,因为 LLM 可能会在其答案中提及 PII 数据点(“嗨,John Smith!很高兴见到你”)。

选项 2:保存前屏蔽

假设我们想使用 LangSmith 中的数据来调试我们的应用程序,或者我们正在考虑微调我们自己的模型。 在这种情况下,没有用户对话的日志会妨碍我们使用真实数据来提高应用程序的质量。

对于这种情况的另一种选择是在输入中添加掩码,以便 LLM 跟踪软件都收到带掩码的输入。 这可以通过在将输入作为输入发送到链之前屏蔽输入来实现。 这种方法的优点是允许我们跟踪并在以后使用对话数据,同时还保持数据对 LLM 提供商和 LangSmith 跟踪的清理。

结论

有效处理 PII 数据是构建安全可靠的数据应用程序的重要方面。 我们已经提出了一些针对此问题的拟议解决方案,但 LangChain 生态系统正在不断集成新的创新替代方案。 请继续关注 LangChain 新闻通讯,以便第一时间了解这方面的新进展!

如果您喜欢这篇博文,我们还将在下周举办关于此主题的网络研讨会 - 在此处注册加入!