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 应用
-
熟悉如何使用 OpenTelemetry 的 Python SDK
-
您最喜欢的 LLM 上的帐户,以及 API 密钥
概述
在强调跟踪时,我创建了一个简单的 LangChain 应用,该应用执行以下操作:
-
获取命令行上的客户输入。(查询)
-
通过 LangChain 将这些输入发送到 Azure OpenAI LLM。
-
链工具设置为使用 Tavily 进行搜索
-
LLM 使用输出,将相关信息返回给用户。
如您所见,Elastic Observability 的 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 chain 将这些发送到 Azure OpenAI LLM。
-
链工具设置为使用 Tavily 进行搜索
-
LLM 使用输出,将相关信息返回给用户。
手动仪表化
如果您想从应用程序中获取更多详细信息,您需要手动仪表化。要获取更多跟踪,请遵循我的Python 仪表化指南。本指南将引导您完成设置必要的 OpenTelemetry 位。此外,您还可以查看 OTel 中关于在 Python 中进行仪表化的文档。
请注意,环境变量
在您按照任一指南中的步骤并启动跟踪器后,您基本上只需在要获取更多详细信息的位置添加 span。在下面的示例中,仅添加了一行代码用于 span 初始化。
请查看 with 的位置
# 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 并添加自定义 span
-
如何使用 Elastic 轻松设置 OTLP ENDPOINT 和 OTLP HEADERS,而无需收集器
-
在 Elastic Observability APM 中查看跟踪
希望这篇文档能提供一个简单易懂的 LangChain 集成 OpenTelemetry 的步骤,并展示将追踪数据发送到 Elastic 有多容易。
关于 OpenTelemetry 与 Elastic 的更多资源
-
集成资源
您还可以登录 cloud.elastic.co 免费试用 Elastic。