LangChain 已迅速成为 AI 开发领域的关键框架,尤其是在构建由大型语言模型 (LLM) 提供支持的应用程序方面。随着其在开发者中的采用率飙升,对有效的调试和性能优化工具的需求也日益显现。其中一项必不可少的工具就是能够获取和分析 LangChain 应用程序的追踪信息。追踪提供了关于执行流程的宝贵见解,帮助开发者理解和改进其 AI 驱动系统。
追踪 LangChain 有几种选择。一种是 Langsmith,它非常适合详细追踪和对大型语言模型 (LLM) 请求的完整分解。但是,它特定于 Langchain。OpenTelemetry (OTel) 现在被广泛接受为追踪的行业标准。作为主要的云原生计算基金会 (CNCF) 项目之一,它拥有与 Kubernetes 一样多的提交,并正在获得主要独立软件供应商 (ISV) 和云提供商的支持,为该框架提供支持。
因此,许多基于 LangChain 的应用程序将拥有超出 LLM 交互的多个组件。将 OpenTelemetry 与 LangChain 结合使用至关重要。除了 Langsmith 之外,OpenLLMetry 也是追踪 Langchain 应用的一种可用选项。
本博客将展示如何使用 OpenLLMetry 库将 LangChain 追踪信息导入 Elastic。
先决条件:
-
一个 Elastic Cloud 账户 — 立即注册,并熟悉 Elastic 的 OpenTelemetry 配置
-
有一个需要检测的 LangChain 应用
-
您喜欢的 LLM 上的账户,以及 API 密钥
概述
在突出显示追踪时,我创建了一个简单的 LangChain 应用,它执行以下操作:
-
获取命令行上的客户输入。(查询)
-
通过 LangChain 将这些输入发送到 Azure OpenAI LLM。
-
链工具设置为使用 Tavily 进行搜索
-
LLM 使用输出,并将相关信息返回给用户。
如您所见,Elastic 可观测性的 APM 识别了 LangChain 应用,并显示了完整的追踪信息(通过手动检测完成)。
如上图所示:
- 用户发出查询
- 调用 Azure OpenAI,但它使用一个工具(Tavily)来获取一些结果
- Azure OpenAI 查看并返回摘要给最终用户
代码是手动检测的,但也可以使用自动检测。
OpenTelemetry 配置
在使用 OpenTelemetry 时,我们需要配置 SDK 来生成追踪信息,并配置 Elastic 的端点和授权。说明可以在 OpenTelemetry 自动检测设置文档 中找到。
OpenTelemetry 环境变量:
Elastic 的 OpenTelemetry 环境变量可以如下在 Linux 中设置(或在代码中设置)。
OTEL_EXPORTER_OTLP_ENDPOINT=12345.apm.us-west-2.aws.cloud.es.io:443
OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20ZZZZZZZ"
OTEL_RESOURCE_ATTRIBUTES="service.name=langchainChat,service.version=1.0,deployment.environment=production"
如您所见:
注意:不需要代理,我们只需直接将 OTLP 追踪消息发送到 Elastic 的 APM 服务器。
OpenLLMetry 库:
OpenTelemetry 的自动检测可以通过检测包扩展到其他框架的追踪。
首先,您必须安装以下包:
这个库是由 OpenLLMetry 开发的。
然后,您需要将以下内容添加到代码中。
from opentelemetry.instrumentation.langchain import LangchainInstrumentor
LangchainInstrumentor().instrument()
检测
添加库并设置环境变量后,您可以使用自动检测。使用自动检测,以下操作将:
opentelemetry-instrument python tavilyAzureApp.py
OpenLLMetry 库确实在无需大量手动检测的情况下正确提取了流程,只需要添加 OpenLLMetry 库。
-
获取命令行上的客户输入。(查询)
-
通过 Lang 链将这些信息发送到 Azure OpenAI LLM。
-
链工具设置为使用 Tavily 进行搜索
-
LLM 使用输出,并将相关信息返回给用户。
手动检测
如果您想从应用程序中获取更多详细信息,则需要进行手动检测。要获得更多追踪信息,请遵循我的 Python 检测指南。本指南将指导您设置必要的 OpenTelemetry 部分,此外,您还可以查看 OTel 用于在 Python 中进行检测的文档。
注意环境变量:
遵循任一指南中的步骤并启动追踪器后,您实际上只需要添加您想要获取更多详细信息的跨度即可。在下面的示例中,仅添加一行代码用于跨度初始化。
查看与…一起放置的位置
# Creates a tracer from the global tracer provider
tracer = trace.get_tracer("newsQuery")
async def chat_interface():
print("Welcome to the AI Chat Interface!")
print("Type 'quit' to exit the chat.")
with tracer.start_as_current_span("getting user query") as span:
while True:
user_input = input("\nYou: ").strip()
if user_input.lower() == 'quit':
print("Thank you for chatting. Goodbye!")
break
print("AI: Thinking...")
try:
result = await chain.ainvoke({"query": user_input})
print(f"AI: {result.content}")
except Exception as e:
print(f"An error occurred: {str(e)}")
if __name__ == "__main__":
asyncio.run(chat_interface())
如您所见,通过手动检测,我们得到了以下跟踪
它指出了我们何时进入查询函数。
结论
在本博客中,我们讨论了以下内容:
-
如何使用 OpenTelemetry 手动检测 LangChain
-
如何正确初始化 OpenTelemetry 并添加自定义跨度
-
如何在无需收集器的情况下轻松使用 Elastic 设置 OTLP ENDPOINT 和 OTLP HEADERS
-
在 Elastic Observability APM 中查看跟踪
希望这能提供一个易于理解的使用 OpenTelemetry 检测 LangChain 的过程,以及将跟踪轻松发送到 Elastic 的方法。
OpenTelemetry 与 Elastic 的附加资源
-
让您的可观察性平台面向未来 使用 OpenTelemetry 和 Elastic
-
检测资源
还可以登录cloud.elastic.co 以免费试用 Elastic。