作者:来自 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 应用程序进行检测
- 熟悉使用 OpenTelemetry 的 Python SDK
- 你最喜欢的 LLM 上的帐户,带有 API 密钥
概述
在强调跟踪时,我创建了一个简单的 LangChain 应用程序,它执行以下操作:
- 在命令行上获取客户输入。(查询)
- 通过 LangChain 将这些发送到 Azure OpenAI LLM。
- 链工具设置为使用 Tavily 进行搜索
- LLM 使用输出将相关信息返回给用户。
如你所见,Elastic Observability 的 APM 识别了 LangChain App,并且还显示了完整的跟踪(通过手动检测完成):
如上图所示:
- 用户进行查询
- 调用 Azure OpenAI,但它使用工具(Tavily)获取一些结果
- 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 库。
- 在命令行上获取客户输入。(查询)
- 通过 LangChain 将这些发送到 Azure OpenAI LLM。
- 链工具设置为使用 Tavily 进行搜索
- 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 的其他资源:
- 使用 Elastic 上的 OpenTelemetry 实现独立性
- 使用 Elastic 和 OpenTelemetry 在 Kubernetes 上实现现代可观察性和安全性
- 使用 OpenTelemetry 和 Elastic 进行日志记录的 3 种模型
- 将免费和开放的 Elastic APM 添加为 Elastic Observability 部署的一部分
- 使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型
- 使用 OpenTelemetry 和 Elastic 为你的可观察性平台提供面向未来的保障
- 检测资源:
还可以登录 cloud.elastic.co 试用 Elastic 的免费试用版。
原文:Tracing Langchain apps with Elastic, OpenLLMetry, and OpenTelemetry — Elastic Observability Labs