在使用 LangSmith 追踪时,您可能需要防止敏感信息被记录,以维护隐私并遵守安全要求。LangSmith 提供了多种方法,在数据发送到后端之前进行保护:
如果您的合规性或隐私要求强制规定某些操作绝不应被追踪(例如,具有零保留策略的客户端),请考虑使用条件追踪来选择性地禁用特定请求的追踪,而不是掩码数据。

隐藏输入和输出

如果您想完全隐藏追踪的输入和输出,可以在运行应用程序时设置以下环境变量:
这适用于 LangSmith SDK(Python 和 TypeScript)和 LangChain。 您还可以为给定的 Client 实例自定义并覆盖此行为。可以通过在 Client 对象上设置 hide_inputs 和 hide_outputs 参数来实现(在 TypeScript 中为 hideInputs 和 hideOutputs)。 以下示例为 hide_inputs 和 hide_outputs 返回一个空对象,但您可以根据需要进行自定义:

隐藏元数据

hide_metadata 参数允许您在使用 LangSmith Python SDK 进行追踪时,控制运行元数据是否被隐藏或转换。元数据在创建运行时通过 extra 参数传递(例如,extra={"metadata": {...}})。hide_metadata 对于移除敏感信息、遵守隐私要求或减少发送到 LangSmith 的数据量很有用。您可以通过两种方式配置元数据隐藏:
  • 使用 SDK:
  • 使用环境变量:
hide_metadata 参数接受三种类型的值:
  • True:完全移除所有元数据(发送空字典)。
  • False 或 None:保持元数据原样(默认行为)。
  • Callable:一个自定义函数,用于转换元数据字典。
设置后,此参数会影响由 Client 创建或更新的所有运行中 extra 参数的 metadata 字段,包括通过 @traceable 装饰器或 LangChain 集成创建的运行。

隐藏所有元数据

设置 hide_metadata=True 可以完全移除发送到 LangSmith 的运行中的所有元数据:

自定义转换

使用可调用函数可以在数据发送到 LangSmith 之前,选择性地过滤、脱敏或修改元数据:

基于规则的输入和输出掩码

此功能在以下 LangSmith SDK 版本中可用:
  • Python:0.1.81 及以上版本
  • TypeScript:0.1.33 及以上版本
要对输入和输出中的特定数据进行掩码处理,您可以使用 create_anonymizer / createAnonymizer 函数,并在实例化 Client 时传入新创建的匿名化器。匿名化器可以从正则表达式模式列表和替换值构建,也可以从一个接受并返回字符串值的函数构建。
有关脱敏 API 密钥、令牌和其他凭据的信息,请参阅从追踪中脱敏密钥,获取即用型正则表达式模式和方案。
如果设置了 LANGSMITH_HIDE_INPUTS = true,则匿名化器将对输入跳过处理。同样,如果设置了 LANGSMITH_HIDE_OUTPUTS = true,则对输出也跳过。 但是,如果输入或输出需要发送给 Client,那么 anonymizer 方法将优先于 hide_inputs 和 hide_outputs 中找到的函数。默认情况下,create_anonymizer 最多只查看 10 层嵌套深度,这可以通过 max_depth 参数进行配置。
请注意,使用匿名化器可能会因为复杂的正则表达式或大型负载而导致性能下降,因为匿名化器在处理之前会将负载序列化为 JSON。
提升 anonymizer API 的性能已在我们的路线图中!如果您遇到性能问题,请通过 support.langchain.com 联系支持。
隐藏输入输出 旧版本的 LangSmith SDK 可以使用 hide_inputs 和 hide_outputs 参数来达到相同的效果。您也可以使用这些参数更高效地处理输入和输出。

为单个函数处理输入和输出

process_outputs 参数在 LangSmith SDK 版本 0.1.98 及以上版本中可用于 Python。
除了 Client 级别的输入和输出处理之外,LangSmith 还通过 @traceable 装饰器的 process_inputs 和 process_outputs 参数提供了函数级别的处理。 这些参数接受函数,允许您在特定函数的输入和输出被记录到 LangSmith 之前对其进行转换。这对于减小负载大小、移除敏感信息或自定义特定函数的对象序列化方式及其在 LangSmith 中的表示非常有用。 以下是使用 process_inputs 和 process_outputs 的示例:
在此示例中,process_inputs 创建一个包含处理后的输入数据的新字典,而 process_outputs 在记录到 LangSmith 之前将输出转换为特定格式。
建议避免在处理器函数中修改源对象。相反,应创建并返回包含处理后数据的新对象。
对于异步函数,用法类似:
当两者都定义时,这些函数级别的处理器优先于 Client 级别的处理器(hide_inputs 和 hide_outputs)。

示例

您可以将基于规则的掩码与各种匿名化器结合使用,以清除输入和输出中的敏感信息。以下示例将涵盖使用正则表达式、Microsoft Presidio 和 Amazon Comprehend 的方法。

正则表达式

下面的实现并非详尽无遗,可能遗漏某些格式或边缘情况。在生产环境中使用前,请彻底测试任何实现。
您可以在数据发送到 LangSmith 之前,使用正则表达式对输入和输出进行掩码处理。下面的实现对电子邮件地址、电话号码、全名、信用卡号码和社会安全号码 (SSN) 进行掩码。
匿名化后的运行在 LangSmith 中将如下所示: 匿名化运行 非匿名化运行在 LangSmith 中将如下所示: 非匿名化运行

Microsoft Presidio

下面的实现提供了一个如何匿名化用户与 LLM 交换的消息中的敏感信息的通用示例。它并非详尽无遗,也未涵盖所有情况。在生产环境中使用前,请彻底测试任何实现。
Microsoft Presidio 是一个数据保护和去标识化 SDK。下面的实现使用 Presidio 在数据发送到 LangSmith 之前对输入和输出进行匿名化。有关最新信息,请参阅 Presidio 的官方文档。 要使用 Presidio 及其 spaCy 模型,请安装以下内容:
同时,安装 OpenAI:
匿名化后的运行在 LangSmith 中将如下所示: 匿名化运行 非匿名化运行在 LangSmith 中将如下所示: 非匿名化运行

Amazon Comprehend

下面的实现提供了一个如何匿名化用户与 LLM 交换的消息中的敏感信息的通用示例。它并非详尽无遗,也未涵盖所有情况。在生产环境中使用前,请彻底测试任何实现。
Comprehend 是一项自然语言处理服务,可以检测个人身份信息。下面的实现使用 Comprehend 在数据发送到 LangSmith 之前对输入和输出进行匿名化。有关最新信息,请参阅 Comprehend 的官方文档。 要使用 Comprehend,请安装 boto3:
同时,安装 OpenAI:
您需要在 AWS 中设置凭据,并使用 AWS CLI 进行身份验证。请遵循 AWS Comprehend 设置说明。
匿名化后的运行在 LangSmith 中将如下所示: 匿名化运行 非匿名化运行在 LangSmith 中将如下所示: 非匿名化运行

高吞吐量掩码的批处理

本页面上前面的方法是逐个处理每个运行的。如果您的掩码逻辑涉及速率受限的 API 或模型推理(例如 Presidio 或 Amazon Comprehend 示例),那么一次处理一个运行可能会成为瓶颈。process_buffered_run_ops 允许您在原始运行字典序列化并发送到 API 之前拦截一批原始运行字典,从而可以将成本分摊到多个运行上。LangSmith 在后台线程中处理这些运行,不会阻塞您的应用程序。 LangSmith 将运行保存在内存缓冲区中,并在以下任一情况发生时将它们作为一批进行刷新:
  • 累积了 run_ops_buffer_size 个运行操作,或者
  • 自上次添加运行以来已经过去了 run_ops_buffer_timeout_ms 毫秒(默认值:5000 毫秒)。
您的函数接收一批原始运行字典作为列表,并且必须返回一个长度相同、顺序相同且运行 ID 不变的列表。违反任一约束都会引发 ValueError。
run_ops_buffer_size 计算的是单个运行操作,而不是唯一的运行。每个被追踪的调用通常产生两个操作:一个创建(当运行开始时)和一个更新(当它以输出结束时)。请相应地设置缓冲区大小。例如,run_ops_buffer_size=1000 将缓冲大约 500 个被追踪的调用。因此,同一个运行 ID 可能会出现在同一批次中两次:一次带有输入,一次带有输出。
缓冲区仅在达到大小限制或超时时自动刷新。始终在程序退出前调用 client.flush(),以避免丢失缓冲的运行。
批次中的每个运行字典要么是一个创建操作(带有 inputs,在运行开始时发送),要么是一个更新操作(带有 outputs,在运行结束时发送)。以下是单个被追踪调用的典型操作对:
以下示例使用了 Comprehend 的 batch_detect_entities 端点,该端点每次调用最多接受 25 个文本。使用逐运行方法(hide_inputs)时,每个运行需要进行一次 API 调用。而在这里,首先收集整个缓冲区中的所有消息文本,然后按 25 个一组发送给 Comprehend,这在高吞吐量下显著减少了 API 调用次数。
process_buffered_run_ops 和 run_ops_buffer_size 必须始终一起设置 — 只提供其中一个会引发 ValueError。