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 支持,这可能导致追踪断开。
解决方法
- 升级 Python 版本(推荐) 如果可能,升级到 Python 3.11 或更高版本以实现自动上下文传播。
-
手动上下文传播 如果无法升级,你需要手动传播追踪上下文。方法因你的设置而异:
a) 使用 LangGraph 或 LangChain 将父级
config传递给子调用:b) 直接使用 LangSmith 直接传递运行树:c) 将装饰代码与 LangGraph/LangChain 结合使用 使用组合技术进行手动交接:
使用 threading 进行上下文传播
通常,你会开始追踪,并希望在单个追踪内对子任务应用一些并行性。Python 标准库的ThreadPoolExecutor 默认会破坏追踪。
原因
Python 的 contextvars 在新线程中开始时是空的。以下是两种处理以保持追踪连续性的方法:解决方法
-
使用 LangSmith 的 ContextThreadPoolExecutor
LangSmith 提供了一个
ContextThreadPoolExecutor,可以自动处理上下文传播: -
手动提供父运行树
或者,你可以手动将父运行树传递给内部函数:
get_current_run_tree() 获取当前运行树,并使用 langsmith_extra 参数将其传递给内部函数。
这两种方法都确保内部函数调用即使在单独的线程中执行,也能正确地聚合在初始追踪堆栈下。
将这些文档连接到 Claude、VSCode 等,通过 MCP 获取实时答案。

