Bahubali Shetti

使用 Elastic、OpenLLMetry 和 OpenTelemetry 追踪 LangChain 应用

LangChain 应用的使用日益增长。构建基于 RAG 的应用、简单的 AI 助手等等正成为常态。然而,观察这些应用却更加困难。鉴于现有的各种选择,本博客将展示如何将 OpenTelemetry 检测与 OpenLLMetry 结合使用,并将数据导入 Elastic 可观测性 APM。

Tracing LangChain apps with Elastic, OpenLLMetry, and OpenTelemetry

LangChain 已迅速成为 AI 开发领域的关键框架,尤其是在构建由大型语言模型 (LLM) 提供支持的应用程序方面。随着其在开发者中的采用率飙升,对有效的调试和性能优化工具的需求也日益显现。其中一项必不可少的工具就是能够获取和分析 LangChain 应用程序的追踪信息。追踪提供了关于执行流程的宝贵见解,帮助开发者理解和改进其 AI 驱动系统。

追踪 LangChain 有几种选择。一种是 Langsmith,它非常适合详细追踪和对大型语言模型 (LLM) 请求的完整分解。但是,它特定于 Langchain。OpenTelemetry (OTel) 现在被广泛接受为追踪的行业标准。作为主要的云原生计算基金会 (CNCF) 项目之一,它拥有与 Kubernetes 一样多的提交,并正在获得主要独立软件供应商 (ISV) 和云提供商的支持,为该框架提供支持。

因此,许多基于 LangChain 的应用程序将拥有超出 LLM 交互的多个组件。将 OpenTelemetry 与 LangChain 结合使用至关重要。除了 Langsmith 之外,OpenLLMetry 也是追踪 Langchain 应用的一种可用选项。

本博客将展示如何使用 OpenLLMetry 库将 LangChain 追踪信息导入 Elastic。

opentelemetry-instrumentation-langchain
.

先决条件:

概述

在突出显示追踪时,我创建了一个简单的 LangChain 应用,它执行以下操作:

  1. 获取命令行上的客户输入。(查询)

  2. 通过 LangChain 将这些输入发送到 Azure OpenAI LLM。

  3. 链工具设置为使用 Tavily 进行搜索

  4. LLM 使用输出,并将相关信息返回给用户。

如您所见,Elastic 可观测性的 APM 识别了 LangChain 应用,并显示了完整的追踪信息(通过手动检测完成)。

如上图所示:

  1. 用户发出查询
  2. 调用 Azure OpenAI,但它使用一个工具(Tavily)来获取一些结果
  3. 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"

如您所见:

OTEL_EXPORTER_OTLP_ENDPOINT
设置为 Elastic,并提供了相应的授权标头。这些可以很容易地从 Elastic 的 APM 配置屏幕(在 OpenTelemetry 下)中获得。

注意:不需要代理,我们只需直接将 OTLP 追踪消息发送到 Elastic 的 APM 服务器。

OpenLLMetry 库:

OpenTelemetry 的自动检测可以通过检测包扩展到其他框架的追踪。

首先,您必须安装以下包:

pip install opentelemetry-instrumentation-langchain

这个库是由 OpenLLMetry 开发的。

然后,您需要将以下内容添加到代码中。

from opentelemetry.instrumentation.langchain import LangchainInstrumentor
LangchainInstrumentor().instrument()

检测

添加库并设置环境变量后,您可以使用自动检测。使用自动检测,以下操作将:

opentelemetry-instrument python tavilyAzureApp.py

OpenLLMetry 库确实在无需大量手动检测的情况下正确提取了流程,只需要添加 OpenLLMetry 库。

  1. 获取命令行上的客户输入。(查询)

  2. 通过 Lang 链将这些信息发送到 Azure OpenAI LLM。

  3. 链工具设置为使用 Tavily 进行搜索

  4. LLM 使用输出,并将相关信息返回给用户。

手动检测

如果您想从应用程序中获取更多详细信息,则需要进行手动检测。要获得更多追踪信息,请遵循我的 Python 检测指南。本指南将指导您设置必要的 OpenTelemetry 部分,此外,您还可以查看 OTel 用于在 Python 中进行检测的文档

注意环境变量:

OTEL_EXPORTER_OTLP_HEADERS
OTEL_EXPORTER_OTLP_ENDPOINT
如上节所述进行设置。您也可以设置
OTEL_RESOURCE_ATTRIBUTES
.

遵循任一指南中的步骤并启动追踪器后,您实际上只需要添加您想要获取更多详细信息的跨度即可。在下面的示例中,仅添加一行代码用于跨度初始化。

查看与…一起放置的位置

tracer.start_as_current_span("getting user query") as span
如下所示

# 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())

如您所见,通过手动检测,我们得到了以下跟踪

它指出了我们何时进入查询函数。

async def chat_interface()

结论

在本博客中,我们讨论了以下内容:

  • 如何使用 OpenTelemetry 手动检测 LangChain

  • 如何正确初始化 OpenTelemetry 并添加自定义跨度

  • 如何在无需收集器的情况下轻松使用 Elastic 设置 OTLP ENDPOINT 和 OTLP HEADERS

  • 在 Elastic Observability APM 中查看跟踪

希望这能提供一个易于理解的使用 OpenTelemetry 检测 LangChain 的过程,以及将跟踪轻松发送到 Elastic 的方法。

OpenTelemetry 与 Elastic 的附加资源

还可以登录cloud.elastic.co 以免费试用 Elastic。

分享这篇文章