使用 OpenTelemetry 对基于 LLM 的应用程序进行可观测性介绍

博客文章在发布后不会更新。这篇文章已经发布一年多了,其内容可能已过时,部分链接可能无效。在依赖任何信息之前,请务必核实。

大型语言模型 (LLM) 目前非常受欢迎,特别是考虑到它们的应用范围广泛,从简单的聊天机器人到帮助软件工程师编写代码的 Copilot 机器人。鉴于 LLM 在生产环境中的使用日益广泛,用户学习如何理解和监控这些模型的行为非常重要。

在下面的示例中,我们将使用 PrometheusJaeger 作为由自动 instrument 的 LLM 监控库 OpenLIT 生成的指标和跟踪的目标后端。我们将使用 Grafana 作为可视化 LLM 监控数据的工具。你可以选择任何你喜欢的后端来存储 OTel 指标和跟踪。

为什么 LLM 应用的可观测性很重要

监控 LLM 应用至关重要,原因有以下几点。

  1. 对于使用量和成本跟踪,跟踪 LLM 的使用频率至关重要。
  2. 跟踪延迟很重要,因为模型的响应时间可能因传递给 LLM 的输入而异。
  3. 速率限制是一个普遍的挑战,特别是对于外部 LLM,因为应用程序越来越依赖于这些外部 API 调用。当达到速率限制时,它可能会阻碍应用程序使用这些 LLM 执行其基本功能。

通过密切关注这些方面,你不仅可以节省成本,还可以避免达到请求限制,从而确保你的 LLM 应用能够达到最佳性能。

你应该关注哪些信号?

在应用程序中使用大型语言模型 (LLM) 与传统的机器学习 (ML) 模型不同。主要的是,LLM 通常通过外部 API 调用访问,而不是在本地或内部运行。捕获事件序列(使用跟踪)至关重要,特别是在 RAG(检索增强生成)应用程序中,在 LLM 使用之前和之后可能存在事件。此外,通过(通过指标)分析聚合数据,可以快速了解请求、token 和成本,这对于优化性能和管理成本很重要。以下是关键的监控信号:

追踪

  • 请求元数据:鉴于 LLM 的各种参数(如 temperaturetop_p)会极大地影响响应质量和成本,因此在 LLM 的上下文中这一点很重要。需要监控的具体方面包括:

    • Temperature:表示模型输出所需的创造性或随机性水平。更改此参数会显著影响生成内容的性质。

    • top_p:通过从一定百分比的最可能单词中选择来决定模型的选择性。较高的“top_p”值意味着模型会考虑更广泛的单词,使文本更具多样性。

    • 模型名称或版本:对于跟踪随时间的变化至关重要,因为 LLM 的更新可能会影响性能或响应特性。

    • Prompt 详细信息:发送给 LLM 的确切输入,与内部 ML 模型(输入可能更受控制且同质)不同,LLM 的输入可能差异很大,并且会影响输出的复杂性和成本。

  • 响应元数据:鉴于与 LLM 的 API 交互,跟踪响应的具体细节对于成本管理和质量评估至关重要。

    • Tokens:直接影响成本,并且是响应长度和复杂性的衡量标准。

    • 成本:对于预算至关重要,因为基于 API 的成本会随着请求数量和每个请求的复杂性而增加。监控这些指标可以提醒你注意可能表明 LLM 使用效率低下或需要优化的意外增加。

    • 响应详细信息:与 Prompt 详细信息类似,但从响应的角度来看,可以深入了解模型的输出特性以及潜在的低效或意外成本区域。

指标

  • 请求量:发送到 LLM 服务的请求总数。这有助于理解需求模式并识别使用中的任何异常,例如突然的峰值或下降。
  • 请求持续时间:处理请求并从 LLM 接收响应所需的时间。这包括网络延迟和 LLM 生成响应所需的时间,从而深入了解 LLM 服务的性能和可靠性。
  • 成本和 Token 计数器:跟踪随时间累积的总成本和消耗的 token 对于预算和成本优化策略至关重要。监控这些指标可以提醒你注意可能表明 LLM 使用效率低下或需要优化的意外增加。

示例设置

先决条件

在我们开始之前,请确保你的环境中正在运行以下内容:

  • Prometheus
  • Jaeger
  • Grafana

设置 OpenTelemetry Collector

首先,安装 OpenTelemetry Collector

配置 Collector

接下来,你需要告诉 Collector 将数据发送到哪里。以下是将指标发送到 **Prometheus** 和跟踪发送到 **Jaeger** 的简单配置:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
  memory_limiter:
    # 80% of maximum memory up to 2G
    limit_mib: 1500
    # 25% of limit up to 2G
    spike_limit_mib: 512
    check_interval: 5s

exporters:
  prometheusremotewrite:
    endpoint: 'YOUR_PROMETHEUS_REMOTE_WRITE_URL'
    add_metric_suffixes: false
  otlp:
    endpoint: 'YOUR_JAEGER_URL'

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [otlp]
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [prometheusremotewrite]

Instrument 你的 LLM 应用与 OpenLIT

OpenLIT 是一个基于 OpenTelemetry 的库,旨在通过为各种大型语言模型和 VectorDB 提供自动 instrument 来简化基于 LLM 的应用程序的监控。

它符合 OpenTelemetry 社区制定的 GenAI 语义约定,并通过不依赖特定供应商的 span 或事件属性或 OTLP 端点的环境变量来进行配置,提供了一个标准化的解决方案,从而确保了顺畅的集成过程。

安装库

要安装 OpenLIT Python 库,请运行此命令:

pip install openlit

然后,将这些行添加到你的 LLM 应用中:

import openlit

openlit.init(
  otlp_endpoint="YOUR_OTELCOL_URL:4318",
)

你也可以通过 OTEL_EXPORTER_OTLP_ENDPOINT 传递 OpenTelemetry Collector 的 URL。

import openlit

openlit.init()
export OTEL_EXPORTER_OTLP_ENDPOINT = "YOUR_OTELCOL_URL:4318"

可视化指标和跟踪

在你的 OpenTelemetry Collector 开始将指标发送到 Prometheus 并将跟踪发送到 Jaeger 后,请按照以下步骤在 Grafana 中进行可视化。你可以使用任何你喜欢的工具来可视化这些数据。

添加 Prometheus 作为数据源

  1. 在 Grafana 中,导航到 **Connections** > **Data Sources**。
  2. 点击 **Add data source** 并选择 **Prometheus**。
  3. 在设置中,输入你的 Prometheus URL,例如 http://<your_prometheus_host>,以及任何其他必需的详细信息。
  4. 选择 **Save & Test**。

添加 Jaeger 作为数据源

  1. 在 Grafana 中,导航到 **Connections** > **Data Sources**。
  2. 点击 **Add data source** 并选择 **Jaeger**。
  3. 在设置中,输入你的 Jaeger URL,例如 http://<your_jaeger_host>,以及任何其他必需的详细信息。
  4. 选择 **Save & Test**。

添加仪表盘

为了方便起见,你可以使用 OpenLIT 的仪表盘

本指南展示了如何使用 OpenTelemetry、Prometheus、Jaeger 和 Grafana 来监控你的 LLM 应用。

如果你有任何问题,请通过我的 GitHub @ishanjainn 或 Twitter @ishan_jainn 联系我。