Skip to main content
在使用 LangSmith SDK、LangGraph 和 LangChain 进行追踪时,追踪上下文应自动正确传播,以便在父追踪中执行的代码能在 UI 中按预期位置显示。 如果您发现子运行跳转到了独立的追踪中(并显示在顶层),可能是由以下已知的“边缘情况”之一导致的。

Python

以下概述了使用 Python 构建时导致追踪“分裂”的常见原因。

使用 asyncio 的上下文传播

在 Python 版本 < 3.11 中使用异步调用(尤其是流式调用)时,可能会遇到追踪嵌套问题。这是因为 Python 的 asyncio 仅在 3.11 版本中才完全支持上下文传递

原因

LangChain 和 LangSmith SDK 使用 contextvars 隐式传播追踪信息。在 Python 3.11 及以上版本中,这可以无缝工作。然而,在较早版本(3.8、3.9、3.10)中,asyncio 任务缺乏适当的 contextvar 支持,可能导致追踪断开。

解决方法

  1. 升级 Python 版本(推荐) 如果可能,升级到 Python 3.11 或更高版本,以获得自动的上下文传播。
  2. 手动传播上下文 如果无法升级,您需要手动传播追踪上下文。具体方法取决于您的设置: a) 使用 LangGraph 或 LangChain 将父级 config 传递给子调用:
    b) 直接使用 LangSmith 直接传递运行树:
    c) 将装饰代码与 LangGraph/LangChain 结合使用 结合使用多种技术进行手动传递:

使用线程的上下文传播

通常,在启动追踪后,可能希望在一个追踪内对子任务应用某种并行处理。Python 标准库的 ThreadPoolExecutor 默认会破坏追踪。

原因

Python 的 contextvars 在新线程中初始为空。以下是两种保持追踪连续性的方法:

解决方法

  1. 使用 LangSmith 的 ContextThreadPoolExecutor LangSmith 提供了 ContextThreadPoolExecutor,可自动处理上下文传播:
  2. 手动提供父运行树 或者,您可以手动将父运行树传递给内部函数:
    在这种方法中,我们使用 get_current_run_tree() 获取当前运行树,并通过 langsmith_extra 参数将其传递给内部函数。
两种方法都能确保内部函数调用即使在单独线程中执行,也能正确聚合到初始追踪栈下。