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 获取实时答案。