- 使用环境变量或 Client 配置完全隐藏输入和输出。
- 隐藏元数据以删除或转换运行元数据。
- 使用正则表达式模式或匿名化库应用基于规则的掩码,有选择地编辑敏感信息。
- 通过函数级定制处理单个函数的输入和输出。
- 使用 Microsoft Presidio 和 Amazon Comprehend 等第三方匿名化工具进行高级 PII 检测。
- 批量处理运行操作,以一次性跨多个运行应用昂贵的掩码逻辑,从而减少每个运行的开销。LangSmith 在后台线程中处理运行,不会阻塞您的应用程序。
如果您的合规或隐私要求规定某些操作根本不应被跟踪(例如,具有零保留策略的客户端),请考虑使用条件跟踪来有选择地为特定请求禁用跟踪,而不是对数据进行掩码处理。
隐藏输入和输出
如果您想完全隐藏跟踪的输入和输出,可以在运行应用程序时设置以下环境变量: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:转换元数据字典的自定义函数。
extra 参数中的 metadata 字段,包括通过 @traceable 装饰器或 LangChain 集成创建的运行。
隐藏所有元数据
设置hide_metadata=True 以完全删除发送到 LangSmith 的运行中的所有元数据:
自定义转换
使用可调用函数有选择地过滤、编辑或修改发送到 LangSmith 之前的元数据:基于规则的输入和输出掩码
此功能在以下 LangSmith SDK 版本中可用:
- Python:0.1.81 及更高版本
- TypeScript:0.1.33 及更高版本
create_anonymizer / createAnonymizer 函数,并在实例化 Client 时传递新创建的匿名化器。匿名化器可以从正则表达式模式和替换值的列表构建,也可以从接受并返回字符串值的函数构建。
如果设置了 LANGSMITH_HIDE_INPUTS = true,则匿名化器将跳过输入。如果设置了 LANGSMITH_HIDE_OUTPUTS = true,则输出同样如此。
但是,如果输入或输出要发送给 Client,则 anonymizer 方法将优先于 hide_inputs 和 hide_outputs 中的函数。默认情况下,create_anonymizer 只会查看最多 10 层深度,这可以通过 max_depth 参数进行配置。
改进
anonymizer API 的性能已在我们的路线图中!如果您遇到性能问题,请通过 support.langchain.com 联系支持。
hide_inputs 和 hide_outputs 参数来实现相同的效果。您也可以使用这些参数更高效地处理输入和输出。
处理单个函数的输入和输出
process_outputs 参数在 Python 的 LangSmith SDK 0.1.98 及更高版本中可用。@traceable 装饰器的 process_inputs 和 process_outputs 参数提供函数级处理。
这些参数接受函数,允许您在将特定函数的输入和输出记录到 LangSmith 之前对其进行转换。这对于减少负载大小、删除敏感信息或自定义对象在 LangSmith 中为特定函数序列化和表示的方式非常有用。
以下是使用 process_inputs 和 process_outputs 的示例:
process_inputs 创建一个包含处理后输入数据的新字典,process_outputs 在记录到 LangSmith 之前将输出转换为特定格式。
对于异步函数,用法类似:
hide_inputs 和 hide_outputs)。
示例
您可以将基于规则的掩码与各种匿名化器结合使用,以清除输入和输出中的敏感信息。以下示例将涵盖使用正则表达式、Microsoft Presidio 和 Amazon Comprehend。正则表达式
下面的实现并不详尽,可能会遗漏某些格式或边缘情况。在生产环境中使用之前,请彻底测试任何实现。
在 LangSmith 中,未匿名化的运行将如下所示:
Microsoft Presidio
下面的实现提供了一个关于如何匿名化用户和 LLM 之间交换的消息中的敏感信息的通用示例。它并不详尽,也没有涵盖所有情况。在生产环境中使用之前,请彻底测试任何实现。
在 LangSmith 中,未匿名化的运行将如下所示:
Amazon Comprehend
下面的实现提供了一个关于如何匿名化用户和 LLM 之间交换的消息中的敏感信息的通用示例。它并不详尽,也没有涵盖所有情况。在生产环境中使用之前,请彻底测试任何实现。
在 LangSmith 中,未匿名化的运行将如下所示:
###面向高吞吐量掩码的批处理
本页之前介绍的方法会逐个处理每个运行。如果你的掩码逻辑涉及速率受限的 API 或模型推理(例如 Presidio 或 Amazon Comprehend 示例),逐个处理运行可能会造成瓶颈。process_buffered_run_ops 允许你在原始运行字典被序列化并发送到 API 之前拦截一批这样的字典,从而将成本分摊到多个运行上。LangSmith 会在后台线程中处理这些运行,不会阻塞你的应用程序。
LangSmith 会将运行保存在内存缓冲区中,并在满足以下任一条件时将它们作为一批数据刷新:
- 累积了
run_ops_buffer_size个运行操作,或者 - 自上次添加运行以来已过去
run_ops_buffer_timeout_ms毫秒(默认值:5000 毫秒)。
ValueError。
run_ops_buffer_size 计数的是单个运行 操作,而不是唯一的运行。每个被追踪的调用通常会产生两个操作:创建(当运行开始时)和更新(当运行结束并带有输出时)。请相应地设置缓冲区大小。例如,run_ops_buffer_size=1000 将缓冲大约 500 次被追踪的调用。正因为如此,同一个运行 ID 可能会在同一批次中出现两次:一次带有输入,一次带有输出。inputs,在运行开始时发送),要么是一个更新操作(包含 outputs,在运行结束时发送)。以下是单次被追踪调用的典型配对示例:
batch_detect_pii_entities 端点,该端点每次调用最多可接受 25 条文本。采用逐运行方式(hide_inputs)时,每次运行都需要调用一次 API。而在这里,首先收集整个缓冲区中所有消息的文本,然后以 25 条为一批发送给 Comprehend,从而在高吞吐量下显著减少 API 调用次数。
process_buffered_run_ops 和 run_ops_buffer_size 必须始终一起设置 — 只提供其中一个而不提供另一个会引发 ValueError。
Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

