使用 OpenTelemetry 对基于 LLM 的应用程序进行可观测性介绍
博客文章在发布后不会更新。这篇文章已经发布一年多了,其内容可能已过时,部分链接可能无效。在依赖任何信息之前,请务必核实。
大型语言模型 (LLM) 目前非常受欢迎,特别是考虑到它们的应用范围广泛,从简单的聊天机器人到帮助软件工程师编写代码的 Copilot 机器人。鉴于 LLM 在生产环境中的使用日益广泛,用户学习如何理解和监控这些模型的行为非常重要。
在下面的示例中,我们将使用 Prometheus 和 Jaeger 作为由自动 instrument 的 LLM 监控库 OpenLIT 生成的指标和跟踪的目标后端。我们将使用 Grafana 作为可视化 LLM 监控数据的工具。你可以选择任何你喜欢的后端来存储 OTel 指标和跟踪。
为什么 LLM 应用的可观测性很重要
监控 LLM 应用至关重要,原因有以下几点。
- 对于使用量和成本跟踪,跟踪 LLM 的使用频率至关重要。
- 跟踪延迟很重要,因为模型的响应时间可能因传递给 LLM 的输入而异。
- 速率限制是一个普遍的挑战,特别是对于外部 LLM,因为应用程序越来越依赖于这些外部 API 调用。当达到速率限制时,它可能会阻碍应用程序使用这些 LLM 执行其基本功能。
通过密切关注这些方面,你不仅可以节省成本,还可以避免达到请求限制,从而确保你的 LLM 应用能够达到最佳性能。
你应该关注哪些信号?
在应用程序中使用大型语言模型 (LLM) 与传统的机器学习 (ML) 模型不同。主要的是,LLM 通常通过外部 API 调用访问,而不是在本地或内部运行。捕获事件序列(使用跟踪)至关重要,特别是在 RAG(检索增强生成)应用程序中,在 LLM 使用之前和之后可能存在事件。此外,通过(通过指标)分析聚合数据,可以快速了解请求、token 和成本,这对于优化性能和管理成本很重要。以下是关键的监控信号:
追踪
请求元数据:鉴于 LLM 的各种参数(如
temperature和top_p)会极大地影响响应质量和成本,因此在 LLM 的上下文中这一点很重要。需要监控的具体方面包括:Temperature:表示模型输出所需的创造性或随机性水平。更改此参数会显著影响生成内容的性质。
top_p:通过从一定百分比的最可能单词中选择来决定模型的选择性。较高的“top_p”值意味着模型会考虑更广泛的单词,使文本更具多样性。
模型名称或版本:对于跟踪随时间的变化至关重要,因为 LLM 的更新可能会影响性能或响应特性。
Prompt 详细信息:发送给 LLM 的确切输入,与内部 ML 模型(输入可能更受控制且同质)不同,LLM 的输入可能差异很大,并且会影响输出的复杂性和成本。
响应元数据:鉴于与 LLM 的 API 交互,跟踪响应的具体细节对于成本管理和质量评估至关重要。
Tokens:直接影响成本,并且是响应长度和复杂性的衡量标准。
成本:对于预算至关重要,因为基于 API 的成本会随着请求数量和每个请求的复杂性而增加。监控这些指标可以提醒你注意可能表明 LLM 使用效率低下或需要优化的意外增加。
响应详细信息:与 Prompt 详细信息类似,但从响应的角度来看,可以深入了解模型的输出特性以及潜在的低效或意外成本区域。
LLM 工作组建议在事件上捕获这些详细信息,而不是在 span 属性上,因为许多后端系统可能难以处理这些通常很大的有效载荷。
指标
- 请求量:发送到 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 作为数据源
- 在 Grafana 中,导航到 **Connections** > **Data Sources**。
- 点击 **Add data source** 并选择 **Prometheus**。
- 在设置中,输入你的 Prometheus URL,例如
http://<your_prometheus_host>,以及任何其他必需的详细信息。 - 选择 **Save & Test**。
添加 Jaeger 作为数据源
- 在 Grafana 中,导航到 **Connections** > **Data Sources**。
- 点击 **Add data source** 并选择 **Jaeger**。
- 在设置中,输入你的 Jaeger URL,例如
http://<your_jaeger_host>,以及任何其他必需的详细信息。 - 选择 **Save & Test**。
添加仪表盘
为了方便起见,你可以使用 OpenLIT 的仪表盘。
本指南展示了如何使用 OpenTelemetry、Prometheus、Jaeger 和 Grafana 来监控你的 LLM 应用。
如果你有任何问题,请通过我的 GitHub @ishanjainn 或 Twitter @ishan_jainn 联系我。