Bootstrap

使用 Elastic、OpenLLMetry 和 OpenTelemetry 跟踪 LangChain 应用程序

作者:来自 Elastic Bahubali Shetti

Langchain 应用程序的使用正在增长。构建基于 RAG 的应用程序、简单的 AI 助手等的能力正在成为常态。观察这些应用程序更加困难。考虑到现有的各种选项,本博客展示了如何将 OpenTelemetry 检测与 OpenLLMetry 结合使用并将其导入 Elastic Observability APM。

LangChain 已迅速成为 AI 开发领域的关键框架,特别是用于构建由大型语言模型 (LLM) 支持的应用程序。随着开发人员对其的采用率飙升,对有效调试和性能优化工具的需求也变得越来越明显。其中一种必不可少的工具就是能够从 LangChain 应用程序获取和分析跟踪。跟踪提供了对执行流程的宝贵见解,帮助开发人员了解和改进他们的 AI 驱动系统。

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

因此,许多基于 Langchain 的应用程序将具有多个组件,而不仅仅是 LLM 交互。将 OpenTelemetry 与 Langchain 结合使用至关重要。除了 Langsmith 之外,OpenLLMetry 是跟踪 Langchain 应用的一个可用选项。

本博客将展示如何使用 OpenLLMetry 库 opentelemetry-instrumentation-langchain 将 Langchain 跟踪引入 Elastic。

先决条件:

Elastic Cloud 帐户 — 立即注册,并熟悉 Elastic 的 OpenTelemetry 配置

概述

在强调跟踪时,我创建了一个简单的 LangChain 应用程序,它执行以下操作:

  1. 在命令行上获取客户输入。(查询)
  2. 通过 LangChain 将这些发送到 Azure OpenAI LLM。
  3. 链工具设置为使用 Tavily 进行搜索
  4. LLM 使用输出将相关信息返回给用户。

如你所见,Elastic Observability 的 APM 识别了 LangChain App,并且还显示了完整的跟踪(通过手动检测完成):

如上图所示:

  1. 用户进行查询
  2. 调用 Azure OpenAI,但它使用工具(Tavily)获取一些结果
  3. Azure OpenAI 审核并向最终用户返回摘要

代码是手动检测的,但也可以使用自动检测。

OpenTelemetry 配置

在使用 OpenTelemetry 时,我们需要配置 SDK 以生成跟踪并配置 Elastic 的端点和授权。说明可在 OpenTelemetry Auto-Instrumentation 设置文档中找到。

OpenTelemetry 环境变量:

可以在 Linux 中(或在代码中)按如下方式设置 Elastic 的 OpenTelemetry 环境变量。

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,并且还提供了相应的授权标头。这些可以从 OpenTelemetry 下的 Elastic APM 配置屏幕轻松获取:

注意:不需要代理,我们只需将 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. 通过 LangChain 将这些发送到 Azure OpenAI LLM。
  3. 链工具设置为使用 Tavily 进行搜索
  4. LLM 使用输出将相关信息返回给用户。

手动检测

如果你想从应用程序中获取更多详细信息,则需要手动检测。要获得更多跟踪,请遵循我的 Python 检测指南。本指南将引导你完成设置必要的 OpenTeleMemtry ,此外,你还可以查看 OTel 中有关使用 Python 进行检测的文档。

请注意,环境变量 OTEL_EXPORTER_OTLP_HEADERS 和 OTEL_EXPORTER_OTLP_ENDPOINT 的设置如上一节所述。你还可以设置 OTEL_RESOURCE_ATTRIBUTES。

一旦你按照任一指南中的步骤启动跟踪器,你基本上只需添加你想要获取更多详细信息的跨度即可。在下面的示例中,只添加了一行代码用于跨度初始化。

查看下面的 with 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 的免费试用版。

原文:Tracing Langchain apps with Elastic, OpenLLMetry, and OpenTelemetry — Elastic Observability Labs

;