Bahubali Shetti

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

LangChain 应用的使用正在增长。构建基于 RAG 的应用、简单的 AI 助手等功能正变得常态化。观测这些应用更加困难。鉴于市面上存在多种选择,这篇博客展示了如何使用 OpenTelemetry 仪表化和 OpenLLMetry,并将其摄入到 Elastic Observability 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 Observability 的 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 chain 将这些发送到 Azure OpenAI LLM。

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

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

手动仪表化

如果您想从应用程序中获取更多详细信息,您需要手动仪表化。要获取更多跟踪,请遵循我的Python 仪表化指南。本指南将引导您完成设置必要的 OpenTelemetry 位。此外,您还可以查看 OTel 中关于在 Python 中进行仪表化的文档

请注意,环境变量

OTEL_EXPORTER_OTLP_HEADERS
OTEL_EXPORTER_OTLP_ENDPOINT
已按照上述部分中的说明进行设置。您还可以设置
OTEL_RESOURCE_ATTRIBUTES
.

在您按照任一指南中的步骤并启动跟踪器后,您基本上只需在要获取更多详细信息的位置添加 span。在下面的示例中,仅添加了一行代码用于 span 初始化。

请查看 with 的位置

tracer.start_as_current_span("获取用户查询") 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 并添加自定义 span

  • 如何使用 Elastic 轻松设置 OTLP ENDPOINT 和 OTLP HEADERS,而无需收集器

  • 在 Elastic Observability APM 中查看跟踪

希望这篇文档能提供一个简单易懂的 LangChain 集成 OpenTelemetry 的步骤,并展示将追踪数据发送到 Elastic 有多容易。

关于 OpenTelemetry 与 Elastic 的更多资源

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

分享这篇文章