使用 OpenTelemetry 和 SigNoz 实现 LLM 可观测性

1,158 阅读11分钟

译自 LLM Observability with OpenTelemetry and SigNoz
作者:Jaikanth J

在快速发展的大型语言模型 (LLM) 领域,确保最佳性能和可靠性比以往任何时候都更加重要。这就是“LLM 可观察性”概念发挥作用的地方。这不仅仅是监控输出;这是为了深入了解这些复杂系统的内部运作方式。

大型语言模型 (LLM) 代表了人工智能的变革性进步,提供了通过复杂的语言理解和生成来解决问题的广泛功能。

Langchain 是构建 LLM 应用程序的流行框架之一,它与流行的 LLM 模型 API 集成,如 OpenAI 的 GPT-4、Google 的 Gemini、Meta 的 Llama2 或 Anthropic 的 Claude 等。它还与向量数据库集成,并为进行类似代理的实现。

说到经济高效的监控解决方案,嵌入高基数自定义指标(例如准确性、延迟或详细模型属性)是非常有价值的。高基数指标是指具有广泛且独特的值范围的数据,这可以显着增强跟踪分析。然而,与传统可观测平台相关的成本可能令人望而却步,通常类似于隐含的“数据税”。

OpenTelemetry 与 SigNoz 等解决方案相结合,为整合这些精细的见解提供了一种有吸引力且经济的替代方案。高基数自定义指标的成本在 Datadog 等工具中可能会失控。 OpenTelemetry 和 SigNoz 是建立强大的 LLM 可观察性的完美组合。

在这篇文章中,我们介绍:

为什么我们需要 LLM 可观察性?

法学硕士是复杂的系统,无数流程同时发生。如果没有适当的可观察性,理解这些内部动态就变成了一场猜谜游戏,导致效率低下和潜在的错误。

我们需要 LLM 可观察性用于以下用例:

  • 模型性能和准确性见解: 提供有关 LLM 准确性和处理能力的关键数据,指导改进以实现卓越的模型可靠性和性能。
  • 实时性能跟踪: 实现 LLM 操作的即时反馈,确保最高系统效率并适应不同的性能要求。
  • 资源利用和效率: 识别计算需求和低效率,优化资源分配以提高成本效益和系统吞吐量。
  • 问题检测和故障排除: 有助于快速识别和解决 LLM 基础设施内的复杂问题,减少停机时间并改善用户体验。

在本教程中,我们将使用 OpenTelemetry 和 SigNoz 来设置 LLM 可观察性。在开始之前,让我们先简要概述一下 OpenTelemetry。

OpenTelemetry 用于 LLM 可观测性

OpenTelemetry 是一组 API、SDK、库和集成,旨在标准化遥测数据(日志、指标和跟踪)的生成、收集和管理。它由云原生计算基金会支持,是可观测领域领先的开源项目。

OpenTelemetry 因其全面且灵活的遥测数据收集方法而非常适合仪器法学硕士应用的可观测性。它提供了一个统一的解决方案来收集和管理指标、日志和跟踪,这对于观察法学硕士等复杂系统至关重要。

使用 OpenTelemetry 实现 LLM 可观测性的一些主要优势如下:

  1. 统一仪器:OpenTelemetry 提供了一个单一、统一的解决方案来收集全方位的遥测数据。这种统一的方法简化了检测流程,使其更易于维护和更新。
  2. 供应商中立性:OpenTelemetry 的主要优势之一是其供应商中立的设计。这意味着它可以与广泛的监控和分析平台配合使用。这种灵活性允许组织在不同后端之间切换,而无需重新检测其应用程序。
  3. 社区驱动和开源:作为社区驱动和开源,OpenTelemetry 受益于广泛的开发人员和公司的贡献。这带来了持续改进、创新功能和强大且经过充分测试的产品。
  4. 定制和可扩展性:OpenTelemetry 被设计为可扩展的,允许开发人员对其进行定制以满足他们的特定需求。这包括添加新的遥测源、与其他工具集成以及修改数据收集和处理行为。
  5. 面向未来:随着技术和标准的发展,OpenTelemetry 的积极开发和广泛采用确保其始终紧跟软件监控和遥测领域的最新趋势和实践。

您使用 OpenTelemetry 收集的数据与供应商无关,并且可以导出到任何后端,但哪个后端最适合 OpenTelemetry?

OpenTelemetry 和 SigNoz - LLM 可观测性

OpenTelemetry 不提供任何后端。生成遥测数据后,需要将其发送到后端进行存储和可视化。 SigNoz 是一个OpenTelemetry 原生 APM,从第一天起就支持 OpenTelemetry。

SigNoz 支持 OpenTelemetry 语义约定,并为 OpenTelemetry 支持的所有三种不同类型的信号提供可视化。大多数流行的可观测性供应商声称他们支持 OpenTelemetry 数据,但许多情况下现实情况有所不同

SigNoz 也是开源的,如果您使用 OpenTelemetry 和 SigNoz,您的整个可观测性堆栈将是开源的。

背景已经足够了,现在让我们开始演示。

先决条件

设置 SigNoz

您需要一个后端,您可以将收集到的数据发送到该后端以进行监控和可视化。SigNoz是 OpenTelemetry 原生 APM,非常适合可视化 OpenTelemetry 数据。

SigNoz 云是运行 SigNoz 的最简单方法。您可以在此处注册  免费帐户,并在 30 天内无限制地使用所有功能。

您还可以自行安装和自行托管 SigNoz。查看有关安装自托管 SigNoz 的文档。

LangChain LLM 应用程序

  • 使用 OpenTelemetry SDK 进行手动检测:允许进行精细控制和洞察,但实施起来非常耗时。
  • 使用 OpenLLMetry SDK 进行自动检测:除了自动检测 API 和 DB 调用之外,此版本的 SDK 还检测 Langchain 应用程序,例如 OpenAI 调用和 Vector DB 检索。向我们在Traceloop构建 OpenLLMetry 的朋友们表示大力的感谢。

使用 OpenTelemetry SDK

OpenTelemetry 是一个用于云原生软件的开源可观测框架。它提供了用于捕获跟踪、指标和日志的工具,这对于理解应用程序的行为至关重要。以下是将 OpenTelemetry 手动集成到 LLM 应用程序中的指南。

安装:要将 OpenTelemetry 集成到您的 LLM 应用程序中,请首先安装必要的 SDK。您可以使用以下命令来执行此操作:

pip install opentelemetry-sdk

**设置:**设置环境变量以将数据发送到 SigNoz:

export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT="ingest.{region}.signoz.cloud"
export OTEL_EXPORTER_OTLP_HEADERS="signoz-access-token=<SIGNOZ_INGESTION_KEY>"

您可以在设置 —> 摄取设置下获取 SigNoz 云帐户的摄取详细信息。

集成:获得 SDK 后,您需要将 OpenTelemetry 库合并到应用程序的代码库中。这涉及创建表示应用程序执行的操作的跟踪和跨度。以下代码片段演示了如何围绕对 OpenAI 服务的 API 请求创建跨度:

from opentelemetry import trace
from opentelemetry.trace import SpanKind

tracer = trace.get_tracer(__name__)

with tracer.start_span("OpenAI_API_Request", kind=SpanKind.CLIENT) as span: 
    # Code to perform the API request goes here
    response = perform_api_request()
    span.set_attribute("response.status_code", response.status_code)

在此代码块中,我们使用该start_span方法创建一个新的跨度。该跨度名为“OpenAI_API_Request”,表示它代表的操作。在 Span 的上下文中,我们发出 API 请求,然后将响应状态代码记录为 Span 的属性。这种粒度级别可以进行深入的监控和故障排除。

使用 OpenLLMetry

虽然手动仪表可以提供细粒度的控制,但它可能非常耗时。这就是自动检测的用武之地。我们在Traceloop的朋友构建了 OpenLLMetry,一个 OpenTelemetry 库,用于快速检测 Langchain 应用程序。出于我们的目的,我们假设 OpenLLMetry 是具有内置功能的 OpenTelemetry,可以检测 LLM 生态系统中的组件。

安装:要开始使用 OpenLLMetry,请安装 SDK 并在应用程序中对其进行初始化:

pip install traceloop-sdk

设置:设置以下环境变量或将它们添加到 dotenv 文件中。

export TRACELOOP_BASE_URL=ingest.{region}.signoz.cloud
export TRACELOOP_HEADERS="signoz-access-token=<SIGNOZ_INGESTION_KEY>"

在应用程序入口点开始时初始化 SDK。

from traceloop import Traceloop

Traceloop.init(app_name="Signoz PDF Chat")

设置属性:使用 OpenLLMetry,您可以设置关联属性,以帮助将跟踪与特定用户或会话关联起来。您可以这样做:

import uuid
from traceloop import Traceloop
@app.post('/chat')
async def ask(question: str, user: User):
    Traceloop.set_association_properties({
        "user_id": user.username,
        "chat_id": str(uuid.uuid4()), 
    })
    
    chain = load_qa_chain(ChatOpenAI(temperature=0), chain_type="stuff") 
    return chain.run(input_documents=docs, question=query)

此代码将当前跟踪上下文与用户 ID 和唯一的聊天会话 ID 相关联。这种元数据对于调试特定于用户或会话的问题非常宝贵。

示例代码

import uuid
from langchain.document_loaders import PyPDFLoader
from langchain.vectorstores import Chroma
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.document_loaders import UnstructuredPDFLoader
from langchain.chat_models import ChatOpenAI
from langchain.chains.question_answering import load_qa_chain
from traceloop.sdk import Traceloopfrom dotenv import load_dotenv
load_dotenv() 

Traceloop.init(app_name="Signoz PDF Chat")

loader = UnstructuredPDFLoader("book.pdf") 
pages = loader.load_and_split() 
embeddings = OpenAIEmbeddings() 
docsearch = Chroma.from_documents(pages, embeddings).as_retriever() 

queries = [ 
    "What is the name of the author?",
    "What is the name of the book?",
    "Who is Rich Dad?",
    "Who is Poor Dad?",
    "Give me a summary of the book?",
    "What is the 3 key takeaways from the book?"
] 
for queryroot in queries: 
    for querysuffix in enumerate([' Concise Answer', 'Answer in (~250 words)', 'Long Answer (~750 words)']): 
        # Sets Properties to be used in the dashboard
        Traceloop.set_association_properties({ "user_id": "John McClane", "chat_id": str(uuid.uuid4()) }) 
        query = queryroot + querysuffix
        docs = docsearch.get_relevant_documents(query) 
        chain = load_qa_chain(ChatOpenAI(temperature=0), chain_type="stuff") 
        output = chain.run(input_documents=docs, question=query) 
        print(output)

有关更多信息以及使用函数名称以外的名称来丰富工作流程,请参阅OpenLLMetry 文档

使用 SigNoz 仪表板

完成上述设置后,您将能够访问 SigNoz 仪表板中的指标。您可以转到该 Dashboards 选项卡并尝试添加新面板。您可以在此处了解如何在 SigNoz 中创建仪表板 。

您可以使用 SigNoz 中的查询生成器轻松创建图表  。以下是  将新面板添加到仪表板的步骤。

使用 SigNoz 设置 LLM 可观察性

设置用于测量 Langchain 应用程序性能的仪表板,显示重要指标,例如 LLM 调用总数、延迟、代币吞吐量等。

您还可以创建仪表板来监控运行 Langchain 应用程序的成本。

LLM 成本可观察性仪表板

用于监控 Langchain 应用程序运行成本的仪表板。

带有变量的

为了满足不同团队的需求,SigNoz 通过使用仪表板变量支持动态仪表板视图。例如,应用程序团队可能需要查看特定于“服务”或“用户”的指标。

要利用此功能,您可以创建变量和相应的选项(请参阅管理变量)。本文附带的仪表板 JSON 示例也有很好的示例。

SigNoz 中的动态仪表板,您可以在其中筛选特定服务或用户

SigNoz 中的动态仪表板,您可以在其中筛选特定服务或用户。

在此处了解如何在仪表板中创建变量

阈值

为了帮助操作员快速识别关键点,您可以在 SigNoz 仪表板中的可视化效果上设置阈值。这些阈值可以作为可接受的性能水平的基准或作为潜在问题的警告。

设置阈值作为可接受性能水平的基准

设置阈值作为可接受的性能水平的基准。

警报

通过为任何指标创建警报来增强监控。 SigNoz 使您能够通过 Slack、Teams 或 PagerDuty 等各种渠道发送通知,确保对关键情况的快速响应。在此处的综合指南中了解设置警报的过程。

针对重要指标设置警报,以便在您首选的通知渠道中收到通知。

针对重要指标设置警报,以便在您首选的通知渠道中收到通知。

预建仪表板

如果您想快速开始监控 Langchain 应用程序,您可以使用 SigNoz 的两个预构建仪表板:性能仪表板成本仪表板。您可以使用“导入 JSON”按钮加载 SigNoz 仪表板并开始使用。

Langchain 应用程序性能仪表板的 JSON
Langchain 应用程序成本仪表板的 JSON

注意性能仪表板适用于任何 Langchain 应用程序。成本仪表板的“用户成本”面板仅在user_id传输属性时才起作用。有关更多详细信息,请参阅示例应用程序或示例代码以了解如何设置关联属性。

结论

在本文中,我们探讨了 LLM 可观察性的重要性并介绍了 OpenTelemetry。我们演示了如何使用手动和自动 OpenTelemetry 检测来检测示例 Langchain 应用程序。为了设置 LLM 可观察性,我们选择了 SigNoz,这是一种全栈开源工具,可将日志、指标和跟踪整合到一个界面中。

OpenTelemetry 正在迅速成为开源可观测性的全球标准。它的使用提供了多种好处,包括所有遥测信号的统一标准以及不受供应商锁定的束缚,使其成为法学硕士应用程序的理想选择。

SigNoz 是一个开源的OpenTelemetry 原生 APM,可作为满足您所有可观测性需求的全面后端解决方案。