LangSmith 与流行的用于构建 LLM 应用程序的开源框架 LangChain(支持 Python 和 JavaScript)实现了无缝集成。

安装

为 Python 或 JS 安装以下包(代码示例中使用了 OpenAI 集成)。 有关所有可用软件包的完整列表,请参阅 LangChain 文档。

快速入门

1. 配置您的环境

如果您的账户位于美国以外的区域(默认为美国),还需要将 LANGSMITH_ENDPOINT 设置为您所在区域对应的 API URL。如果不这样做,您的 API 密钥将无法识别,请求将无法通过身份验证。
Region
GCP US
GCP EU
GCP APAC
AWS US
例如,欧盟账户应设置:export LANGSMITH_ENDPOINT="https://eu.api.smith.langchain.com"。
如果您正在使用 LangChain.js 并结合 LangSmith,且不在无服务器环境中,我们还建议您显式设置以下变量以减少延迟:export LANGCHAIN_CALLBACKS_BACKGROUND=true如果您处于无服务器环境中,我们建议设置相反的值,以便在函数结束前完成追踪:export LANGCHAIN_CALLBACKS_BACKGROUND=false

2. 记录追踪

将追踪记录到 LangSmith 不需要额外代码。只需像往常一样运行您的 LangChain 代码即可。

3. 查看您的追踪

默认情况下,追踪记录将被记录到名为 default 的项目中。

选择性追踪

上一节 展示了如何通过设置单个环境变量来追踪应用程序中所有 LangChain 可运行对象的调用。虽然这是一种方便的入门方式,但您可能只想追踪特定的调用或应用程序的特定部分。 在 Python 中有两种方法可以实现:手动传入一个 LangChainTracer 实例作为回调,或使用 tracing_context 上下文管理器。 在 JS/TS 中,您可以将 LangChainTracer 实例作为回调传递。

记录到特定项目

静态设置

正如在追踪概念指南中提到的,LangSmith 使用项目(Project)的概念来对追踪进行分组。如果未指定,追踪器项目默认设置为 default。您可以通过设置 LANGSMITH_PROJECT 环境变量来为整个应用程序运行配置自定义项目名称。这应在执行应用程序之前完成。
LANGSMITH_PROJECT 标志仅在 JS SDK 版本 >= 0.2.16 中受支持,如果您使用的是旧版本,请改用 LANGCHAIN_PROJECT。

动态设置

这主要建立在上一节的基础上,并允许您为特定的 LangChainTracer 实例或在 Python 中作为 tracing_context 上下文管理器的参数设置项目名称。

向追踪添加元数据和标签

您可以通过在 RunnableConfig 中提供任意元数据和标签来注释您的追踪。这对于将附加信息(如执行环境或发起用户)关联到追踪非常有用。有关如何按元数据和标签查询追踪和运行的信息,请参阅查询追踪 (SDK)。
当您将元数据或标签附加到一个可运行对象(无论是通过 RunnableConfig 还是在运行时通过调用参数)时,它们会被该可运行对象的所有子可运行对象继承。

自定义运行名称

您可以通过在 Config 中提供名称来自定义给定运行(run)在调用或流式传输您的 LangChain 代码时的名称。此名称用于在 LangSmith 中标识运行,并可用于过滤和分组运行。该名称也用作 LangSmith 用户界面中运行的标题。这可以通过在构造时在 RunnableConfig 对象中设置 run_name,或者在 JS/TS 中的调用参数中传递 run_name 来实现。
run_name 参数仅更改您调用的可运行对象(例如链、函数)的名称。它不会自动重命名当您调用像 ChatOpenAI (gpt-5.4-mini) 这样的 LLM 对象时自动创建的嵌套运行。在此示例中,外部运行在 LangSmith 中将显示为 MyCustomChain,而嵌套的 LLM 运行仍然显示模型的默认名称。要为 LLM 运行指定更有意义的名称,您可以:
  • 将模型包装在另一个可运行对象中,并为该步骤分配 run_name。
  • 使用追踪装饰器或辅助函数(例如 Python 中的 @traceable,或 JS/TS 中来自 langsmith 的 traceable)在模型调用周围创建一个自定义运行。

在追踪中覆盖模型名称

在追踪 LangChain 模型调用时,LangSmith 会自动捕获 API 调用中使用的模型标识符。但是,出于组织目的或区分不同模型配置,您可能希望在追踪中显示一个不同的、更具描述性的名称。您可以在构造或配置 LangChain 模型时传递 ls_model_name 元数据参数 来实现这一点。 这在以下情况下特别有用:
  • 使用自托管或本地模型,其模型 ID 可能不具描述性。
  • 使用相同模型的不同配置,并希望在追踪中区分它们。
  • 为模型创建别名,使追踪对您的团队更具可读性。
  • 在不同部署环境中标准化模型名称。
当您在模型的元数据中传递 ls_model_name 时,此名称将出现在涉及该模型实例的所有追踪的 LangSmith 界面中。这适用于任何 LangChain 聊天模型或 LLM,并被使用该模型的所有运行(包括作为链的一部分时)继承。
ls_model_name 元数据参数也用于成本跟踪。当与 ls_provider 参数结合使用时,LangSmith 可以自动计算自托管或自定义模型的成本。有关所有可用元数据参数的更多信息,请参阅元数据参数参考。

自定义运行 ID

您可以通过在 Config 中提供 ID 来自定义给定运行(run)在调用或流式传输您的 LangChain 代码时的 ID。此 ID 用于在 LangSmith 中唯一标识运行,并可用于查询特定运行。该 ID 对于跨不同系统链接运行或实现自定义跟踪逻辑非常有用。这可以通过在构造时在 RunnableConfig 对象中设置 run_id,或者在调用参数中传递 run_id 来实现。
此功能目前不直接支持 LLM 对象。
请注意,如果您在追踪的根部(即顶级运行)执行此操作,该运行 ID 将被用作 trace_id。

获取 LangChain 调用的运行 (span) ID

当您调用一个 LangChain 对象时,可以手动指定该调用的运行 ID。此运行 ID 可用于在 LangSmith 中查询该运行。 在 JS/TS 中,您可以使用 RunCollectorCallbackHandler 实例来访问运行 ID。

确保在退出前提交所有追踪

在 LangChain Python 中,LangSmith 的追踪在后台线程中进行,以避免阻碍您的生产应用程序。这意味着您的进程可能在所有追踪成功发送到 LangSmith 之前就已结束。这在无服务器环境中尤其常见,您的虚拟机可能在链或代理完成后立即被终止。 您可以通过将 LANGCHAIN_CALLBACKS_BACKGROUND 环境变量设置为 "false" 来使回调同步。 对于这两种语言,LangChain 提供了方法,以便在退出应用程序之前等待追踪提交完成。下面是一个示例:

不设置环境变量进行追踪

正如其他指南中提到的,以下环境变量允许您配置追踪是否启用、API 端点、API 密钥和追踪项目:
  • LANGSMITH_TRACING
  • LANGSMITH_API_KEY
  • LANGSMITH_ENDPOINT
  • LANGSMITH_PROJECT
然而,在某些环境中,无法设置环境变量。在这些情况下,您可以通过编程方式设置追踪配置。 这主要建立在上一节的基础上。

使用 LangChain (Python) 进行分布式追踪

LangSmith 支持与 LangChain Python 进行分布式追踪。这允许您跨不同的服务和应用程序链接运行 (span)。其原理类似于 LangSmith SDK 的分布式追踪指南。

LangChain (Python) 和 LangSmith SDK 之间的互操作性

如果您在应用程序的某些部分使用 LangChain,而在其他部分使用 LangSmith SDK(参见自定义插桩),您仍然可以无缝地追踪整个应用程序。 LangChain 对象在 traceable 函数内被调用时会被追踪,并绑定为 traceable 函数的子运行。
这将生成以下追踪树:Trace tree python interop

LangChain.JS 和 LangSmith SDK 之间的互操作性

在 traceable 内追踪 LangChain 对象(仅限 JS)

从 langchain@0.2.x 开始,LangChain 对象在 @traceable 函数内使用时会被自动追踪,并继承 traceable 函数的客户端、标签、元数据和项目名称。 对于低于 0.2.x 的旧版 LangChain,您需要手动传递一个从 @traceable 中的追踪上下文创建的 LangChainTracer 实例。

通过 traceable / RunTree API 追踪 LangChain 子运行(仅限 JS)

我们正在努力改进 traceable 和 LangChain 之间的互操作性。在将 LangChain 与 traceable 结合使用时存在以下限制:
  1. 修改通过 RunnableLambda 上下文的 getCurrentRunTree() 获取的 RunTree 将导致无操作(no-op)。
  2. 不鼓励遍历通过 RunnableLambda 的 getCurrentRunTree() 获取的 RunTree,因为它可能不包含所有 RunTree 节点。
  3. 不同的子运行可能具有相同的 execution_order 和 child_execution_order 值。因此在极端情况下,某些运行可能会根据 start_time 以不同的顺序结束。
在某些用例中,您可能希望将 traceable 函数作为 RunnableSequence 的一部分运行,或通过 RunTree API 命令式地追踪 LangChain 运行的子运行。从 LangSmith 0.1.39 和 @langchain/core 0.2.18 开始,您可以直接在 RunnableLambda 内调用 traceable 包装的函数。
Trace Tree 或者,您可以使用 RunTree.fromRunnableConfig 将 LangChain 的 RunnableConfig 转换为等效的 RunTree 对象,或者将 RunnableConfig 作为 traceable 包装函数的第一个参数传递。
如果您更喜欢视频教程,请查看 LangSmith 入门课程 中的替代追踪方式视频。