Fork me on GitHub

2025年12月

学习 LiteLLM 的防护栏机制

随着大语言模型在生产环境中的广泛应用,内容安全、隐私保护和合规性变得越来越重要。用户可能会无意中输入敏感信息,模型也可能生成不当内容,而提示词注入攻击更是对系统安全构成直接威胁。LiteLLM 的防护栏机制正是为了应对这些挑战而设计,这也是我们今天学习的主题。

防护栏概述

防护栏(Guardrails) 是 LiteLLM 中用于内容安全检查和数据保护的核心机制,它可以在 LLM 调用的不同阶段对输入和输出内容进行检查、过滤或修改,确保应用在安全合规的前提下运行。它的核心价值在于:

  • 阻止有害请求:在请求到达模型之前识别并拦截恶意内容,包括仇恨言论、暴力内容等
  • 保护敏感信息:自动识别和掩码 PII(个人身份信息)和 PHI(受保护健康信息)
  • 防御攻击行为:识别提示词注入、越狱等攻击手段
  • 规范内容输出:确保模型输出符合安全和合规要求

它支持与 20+ 专业内容审核供应商 集成,也支持完全自定义的防护逻辑,能够在 pre_call、during_call、post_call 等多个时机灵活介入,实现对 LLM 应用的全方位安全防护。

下面是 LiteLLM 支持的供应商一览:

  • Aim Security
  • Aporia
  • Azure Content Safety
  • AWS Bedrock Guardrails
  • DynamoAI
  • EnkryptAI
  • Gray Swan Cygnal
  • Guardrails AI
  • IBM Guardrails
  • Javelin
  • Lakera AI
  • Lasso Security
  • Google Cloud Model Armor
  • Noma Security
  • OpenAI Moderation
  • Pangea AI Guard
  • Presidio (PII/PHI Masking)
  • PANW Prisma AIRS
  • Pillar Security
  • Zscaler AI Guard

OpenAI Moderation 实战

我们之前在学习 Dify 的内容审查设置时曾简单介绍过 OpenAI Moderation API,这里不妨回顾下之前学习的内容。

OpenAI Moderation API 是 OpenAI 提供的内容审核服务,能够识别和阻止有害内容,包括仇恨言论、骚扰、自伤、性内容和暴力等类别。该 API 支持两种模型:

  1. omni-moderation-latest(推荐):最新的多模态模型,支持更多分类选项和文本+图像输入
  2. text-moderation-latest(遗留):仅支持文本输入的旧版模型

OpenAI Moderation 可以识别出下面这些有害内容:

openai-moderation-categories.png

防护栏定义

下面我们就以 OpenAI Moderation 为例,演示一下如何在 LiteLLM 中集成防护栏。首先在 config.yaml 文件中定义你的防护栏:

guardrails:
  # 输入内容审核
  - guardrail_name: "openai-input-moderation"
    litellm_params:
      guardrail: openai_moderation
      mode: "pre_call"
      api_key: os.environ/OPENAI_API_KEY
      api_base: os.environ/OPENAI_API_BASE
      model: "omni-moderation-latest"  # 支持多模态内容
      default_on: true  # 默认启用

其中 mode 为执行模式,表示防护栏的执行时机,pre_call 表示在 LLM 调用前对用户输入进行检查,如果要对模型输出进行检查,可以改成 post_call。下面是 LiteLLM 支持的几种防护栏执行模式,分别对应 LLM 请求的不同阶段:

  • pre_call:在 LLM 调用之前运行,检查用户输入,可以修改请求内容或直接拦截
  • during_call:与 LLM 调用并行运行,检查用户输入,不能修改内容,只能决定是否继续
  • post_call:在 LLM 调用之后运行,检查输入和输出,可以修改响应内容或拒绝返回
  • logging_only:仅在日志记录时应用掩码,不影响实际请求响应

当在 post_call 模式下处理流式响应时,防护栏会收集所有流式数据块,然后将其组装成完整的响应内容,再对完整内容进行审核,如果违规则阻止整个响应,如果安全则返回原始流式数据。

测试验证

发送如下请求测试下防护栏的效果:

$ curl -i http://localhost:4000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-1234" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "I hate all people of that religion and think they should be eliminated"}
    ]
  }'

另外要注意的是,上面的 default_on 参数表示默认启用,所有请求都会经过该检查。如果 default_on 没有启用,请求时需手动指定防护栏:

$ curl -i http://localhost:4000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-1234" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "I hate all people of that religion and think they should be eliminated"}
    ],
    "guardrails": ["openai-input-moderation"]
  }'

如果一切顺利,OpenAI Moderation 应该能识别出上面的仇恨言论,并返回错误响应:

{
  "error": {
    "message": "{'error': 'Violated OpenAI moderation policy', 'moderation_result': {'violated_categories': ['harassment', 'harassment/threatening', 'hate', 'hate/threatening', 'violence'], 'category_scores': {...}}}",
    "type": "None",
    "param": "None",
    "code": "400"
  }
}

Presidio PII 实战

Presidio 是微软开源的数据保护和去标识化工具包,名称源自拉丁语 praesidium,意为 保护,专注于识别并处理文本、图像及结构化数据中的个人可识别信息(PII),能助力企业和开发者满足 GDPR、CCPA 等隐私法规要求,广泛应用于金融、医疗、数据分析等多个领域。

Presidio 采用了微服务架构,主要包含四个核心模块:

  • Analyzer(分析器):核心功能是检测敏感信息,内置 40 多种敏感数据识别器,可识别姓名、邮箱、银行账号等信息;它结合命名实体识别、正则表达式等技术,还能借助上下文检测提升识别置信度,同时支持接入 SpaCy、Transformers 等多种 NLP 模型,也允许开发者自定义识别规则适配特殊场景;
  • Anonymizer(匿名化器):针对分析器检测到的敏感数据执行脱敏操作,提供掩码、替换、哈希、加密等多种内置方式;比如可将电话号码部分数字替换为星号,也支持通过代码自定义匿名化逻辑,甚至具备可逆匿名化能力,能在特定场景下恢复原始数据;
  • Image Redactor(图像脱敏模块):依托 OCR 技术识别图片中的敏感文本,像身份证照片、扫描表单里的个人信息等,再对其进行遮盖、模糊等脱敏处理;不过该功能目前成熟度不足,暂不建议用于生产环境;
  • Presidio Structured(结构化数据模块):专门处理表格、JSON 等结构化或半结构化数据,先识别其中包含敏感信息的列或键,再调用匿名化模块对这些字段的数据执行脱敏,适配数据库、数据仓库等批量数据处理场景;

在 LiteLLM 中集成 Presidio 可以为你的应用提供隐私保护能力。

部署 Presidio 服务

在集成之前,需要先部署 Presidio 的 Analyzer 和 Anonymizer 服务。官方提供了 Docker 镜像,我们可以通过 Docker Compose 一键部署。先创建一个 docker-compose.yml 文件:

services:
  presidio-analyzer:
    image: mcr.microsoft.com/presidio-analyzer:latest
    ports:
      - "5002:3000"
    networks:
      - presidio-network

  presidio-anonymizer:
    image: mcr.microsoft.com/presidio-anonymizer:latest
    ports:
      - "5001:3000"
    networks:
      - presidio-network

networks:
  presidio-network:
    driver: bridge

然后运行 docker compose 命令启动 Presidio 服务:

$ docker compose up -d

等待服务启动成功,使用下面的请求验证一下:

$ curl -X POST http://localhost:5002/analyze \
  -H "Content-Type: application/json" \
  -d '{
    "text": "My email is zhangsan@example.com",
    "language": "en"
  }'

如果一切正常,应该会返回识别的结果:

[
  {
    "analysis_explanation": null,
    "end": 32,
    "entity_type": "EMAIL_ADDRESS",
    "score": 1.0,
    "start": 12
  },
  {
    "analysis_explanation": null,
    "end": 32,
    "entity_type": "URL",
    "score": 0.5,
    "start": 21
  }
]

防护栏定义

config.yaml 中配置 Presidio 防护栏:

guardrails:
  - guardrail_name: "presidio-pii-mask"
    litellm_params:
      guardrail: presidio
      mode: "pre_call"
      presidio_language: "en"  # 默认语言
      pii_entities_config:
        CREDIT_CARD: "MASK"     # 掩码信用卡号
        EMAIL_ADDRESS: "MASK"   # 掩码邮箱地址
        PERSON: "MASK"          # 掩码人名
        PHONE_NUMBER: "BLOCK"   # 阻止包含电话号码的请求

我们针对不同的 PII 设置了不同的动作,LiteLLM 的防护栏支持下面几种主要动作:

  • BLOCK(阻止):检测到违规内容时直接拒绝请求,返回错误信息
  • MASK(掩码):将敏感信息替换为占位符,如将邮箱地址替换为 [EMAIL]
  • ALLOW(允许):允许请求继续执行(用于白名单机制)

然后设置如下的环境变量:

$ export PRESIDIO_ANALYZER_API_BASE="http://localhost:5002"
$ export PRESIDIO_ANONYMIZER_API_BASE="http://localhost:5001"

测试验证

首先测试掩码功能:

$ curl http://localhost:4000/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-1234" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "My name is John Doe and my email is john@example.com"}
    ],
    "guardrails": ["presidio-pii-mask"]
  }'

LLM 实际接收到的输入将是:

My name is <PERSON> and my email is <EMAIL_ADDRESS>

可以在 Admin UI 中的日志管理中确认:

presidio-pii-mask.png

如果只是希望在日志中屏蔽用户敏感信息,不影响实际交互,可以改为 logging_only 模式。

然后再测试下阻止功能:

$ curl http://localhost:4000/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-1234" \
  -d '{
    "model": "gpt-4o",
    "messages": [
      {"role": "user", "content": "Please call me at 425-555-0100"}
    ],
    "guardrails": ["presidio-pii-mask"]
  }'

由于配置了 PHONE_NUMBER: "BLOCK",这个请求会被直接拒绝:

{
  "error": {
    "message": "Blocked entity detected: PHONE_NUMBER by Guardrail: presidio-pii-mask. This entity is not allowed to be used in this request.",
    "type": "None",
    "param": "None",
    "code": "500"
  }
}

小结

通过本文的学习,我们系统梳理了 LiteLLM 防护栏机制的核心概念与实践方法,也深入体验了两种典型防护场景的落地流程。从整体设计来看,LiteLLM 的防护栏体系可归纳为三点:

  • 全面性:支持 20+ 专业防护供应商,覆盖内容安全、PII 保护、攻击防御等多个维度
  • 灵活性:支持 pre_call、during_call、post_call 等执行模式,以及 BLOCK、MASK 等执行动作,适应不同业务场景
  • 可扩展性:提供完整的自定义防护栏开发框架,满足特殊业务需求

我们通过 OpenAI Moderation 和 Presidio 的实战案例,从内容安全审核和 PII 隐私保护角度展示了 LiteLLM 防护栏集成能力。不过,关于防护栏机制还有很多高级的进阶场景没有展开:

  • 自定义防护栏开发:针对特殊业务规则,我们可以通过 LiteLLM 提供的接口编写自定义检查逻辑;
  • 提示词注入防护:提示词注入(Prompt Injection)是当前 LLM 应用面临的主要安全威胁之一,LiteLLM 支持输入相似度检测或 LLM 检查等机制,抵御恶意提示攻击;
  • 防护栏监控与告警:结合 LiteLLM 的监控系统,可以实现防护栏的全面监控;

感兴趣的同学可以在官方文档中找到更多资料。


实战 LiteLLM 与监控告警系统的集成

在前两篇文章中,我们学习了 LiteLLM 的内置日志系统和外部日志集成能力。基于这些丰富的日志数据,我们可以实现对 LLM 网关的全面观测。然而,在生产环境中,仅仅有日志数据是不够的,我们需要的是一套完整的监控和告警体系,能够在问题发生时第一时间通知运维团队,在预算即将超限时提前预警,在模型服务异常时及时切换,从而保障整个 LLM 服务的稳定性和可靠性。

LiteLLM 提供了完善的监控告警解决方案,支持与 Slack、Discord、Microsoft Teams 等通讯平台集成,实现实时告警通知;或者基于 PagerDuty 等专业告警平台,实现 7x24 小时的运维响应;同时它还支持 Prometheus 指标导出,可以与 Grafana 等监控平台构建企业级监控大盘。

今天,我们就来学习下如何将 LiteLLM 与监控告警系统集成,构建一个主动、智能的运维体系。我们会以 Slack 和 Prometheus 为例,演示具体的集成步骤,让你的 AI 应用具备完善的监控告警能力。

实战 Slack 告警集成

作为全球最受欢迎的团队协作平台,Slack 凭借其便捷的沟通体验、灵活的频道管理能力,以及丰富的第三方集成生态,成为了团队接收、流转重要信息的核心枢纽。将告警系统与 Slack 打通,更是能直接消除信息传递的延迟差,确保技术团队、运维团队或业务团队在第一时间捕捉到异常信号,避免因通知滞后导致的问题扩大化。

创建 Slack Webhook

LiteLLM 通过 Slack Webhooks 向 Slack 频道发送消息,从而实现告警功能。首先我们访问 Slack 页面,创建一个新的 Slack 工作区:

slack-create-workspace.png

如果你已有工作区,可跳过此步。我这里为方便演示,创建了一个名为 litellm-test 的工作区,并创建了一个名为 告警测试 的新频道:

slack-create-workspace-done.jpg

然后访问 Slack 的应用页面

slack-apps.png

点击 “Create an App” 创建一个名为 litellm-alert 的应用:

slack-create-an-app.png

创建成功后进入该应用的配置页面,我们在左侧菜单选择 “Incoming Webhooks”,点击 “Activate Incoming Webhooks” 启用 Webhook 功能:

slack-app-webhooks.png

然后点击 “Add New Webhook” 按钮,创建一个新的 Webhook 并将其关联到工作区的 “告警测试” 频道:

slack-app-add-webhook.png

这时就会生成一个 Webhook 链接,点击 “Copy” 按钮进行复制。

配置 LiteLLM

接下来修改 LiteLLM 的配置,开启 Slack 告警功能。首先配置环境变量:

export SLACK_WEBHOOK_URL="https://hooks.slack.com/services/aaa/bbb/ccc"

然后修改 config.yaml 配置文件:

general_settings:
  # 启用 Slack 告警
  alerting: ["slack"]
  # 告警阈值(秒)- 请求超过 5 分钟视为异常
  alerting_threshold: 300
  # 消费报告频率(可选)
  spend_report_frequency: "1d"

重启 LiteLLM 服务:

$ litellm -c config.yaml

可以通过下面的命令测试 Slack 连接:

$ curl -X GET 'http://127.0.0.1:4000/health/services?service=slack' \
  -H 'Authorization: Bearer sk-1234'

如果配置正确,你应该在 Slack 频道看到类似下面这样一条测试消息:

slack-test-message.png

告警类型

接下来我们就可以做一些真实的告警测试了。LiteLLM 支持四大类告警类型,覆盖了生产环境的主要监控需求:

1. LLM 相关告警

  • LLM API 异常告警(llm_exceptions:当 LLM API 出现异常时触发告警
  • 慢响应告警(llm_too_slow:当 LLM 响应时间超过设定阈值时触发告警
  • 请求挂起告警(llm_requests_hanging:检测未能完成的 LLM 请求
  • 部署冷却告警(cooldown_deployment:当部署被置于冷却状态时的告警
  • 新模型添加告警(new_model_added:通过 /model/new 接口添加新模型时的通知
  • 停机告警(outage_alerts:当特定 LLM 部署面临停机时的告警
  • 区域停机告警(region_outage_alerts:当特定 LLM 区域面临停机时的告警,例如 us-east-1

2. 预算和支出告警

  • 预算告警(budget_alerts:与预算限制或阈值相关的通知
  • 支出报告(spend_reports:跨团队或标签的定期支出报告
  • 支出追踪失败告警(failed_tracking_spend:当支出追踪失败时的告警
  • 每日报告(daily_reports:每日支出报告
  • 回退报告(fallback_reports:LLM 回退发生情况的周报

3. 数据库告警

  • 数据库异常告警(db_exceptions:数据库相关异常的通知

4. 管理端点告警 - 虚拟密钥、团队、内部用户

  • 新虚拟密钥创建告警(new_virtual_key_created:创建新虚拟密钥时的通知
  • 虚拟密钥更新告警(virtual_key_updated:虚拟密钥被修改时的告警
  • 虚拟密钥删除告警(virtual_key_deleted:虚拟密钥被移除时的通知
  • 新团队创建告警(new_team_created:创建新团队时的告警
  • 团队更新告警(team_updated:团队详情被修改时的通知
  • 团队删除告警(team_deleted:团队被删除时的告警
  • 新内部用户创建告警(new_internal_user_created:新内部用户账户的通知
  • 内部用户更新告警(internal_user_updated:内部用户详情被更改时的告警
  • 内部用户删除告警(internal_user_deleted:内部用户账户被移除时的通知

我们可以在配置文件中手动指定要启用的告警类型(如果不指定,前三类告警默认是启用的,管理端点告警默认禁用):

general_settings:
  alerting: ["slack"]
  alerting_threshold: 300
  # 告警类型
  alert_types: [
    "llm_exceptions",       # LLM API 异常
    "llm_too_slow",         # 响应过慢
    "llm_requests_hanging", # 请求挂起
    "budget_alerts",        # 预算告警
    "spend_reports",        # 支出报告
    "db_exceptions",        # 数据库异常
    "daily_reports",        # 每日报告
    "outage_alerts"         # 停机告警
  ]

另外,在生产环境中,过多的告警会导致 告警疲劳,降低团队对重要告警的响应速度。为此 LiteLLM 实现了去重和防轰炸机制,比如:同一用户或团队的预算告警 24 小时内只发送一次;1 分钟内的多个停机告警会被聚合成一个告警;可以通过下面这些告警参数来进行控制:

general_settings:
  # 告警参数配置
  alerting_args:
    daily_report_frequency: 43200    # 12 小时发送一次日报
    report_check_interval: 3600      # 1 小时检查一次是否需要发送报告
    budget_alert_ttl: 86400         # 24 小时内不重复预算告警
    outage_alert_ttl: 60            # 1 分钟窗口聚合停机告警
    minor_outage_alert_threshold: 5 # 5 个错误触发轻微告警
    major_outage_alert_threshold: 10 # 10 个错误触发严重告警

多频道告警

LiteLLM 支持为不同类型的告警配置不同的通知频道:

general_settings:
  alerting: ["slack"]
  # 为每种告警类型指定专门的 Slack 频道
  alert_to_webhook_url: {
    "llm_exceptions": "https://hooks.slack.com/services/.../llm-alerts",
    "budget_alerts": "https://hooks.slack.com/services/.../finance-alerts",
    "daily_reports": "https://hooks.slack.com/services/.../daily-reports",
    "outage_alerts": [
      "https://hooks.slack.com/services/.../oncall-alerts",
      "https://hooks.slack.com/services/.../backup-alerts"
    ]
  }

这种配置允许我们:

  • LLM 异常告警发送到技术团队频道
  • 预算告警发送到财务管理频道
  • 每日报告发送到管理层频道
  • 停机告警同时发送到多个值班频道

兼容其他平台

LiteLLM 的 Slack 集成同样支持 Discord 和 Microsoft Teams(它们两都兼容 Slack 的 Webhook 格式):

Discord 配置:

# Discord Webhook 需要在 URL 后添加 /slack
export SLACK_WEBHOOK_URL="https://discord.com/api/webhooks/1240.../cTLWt5A.../slack"

Microsoft Teams 配置:

# MS Teams 提供 Slack 兼容的 Webhook
export SLACK_WEBHOOK_URL="https://outlook.office.com/webhook/...IncomingWebhook/..."

只需修改 Webhook URL 即可,配置文件保持不变。

实战 Prometheus 监控集成

Prometheus 是一个开源的监控和告警系统,最初由 SoundCloud 开发。它具有以下特点:

  • 时间序列数据库:专为监控数据设计的高性能存储
  • Pull 模式:主动拉取目标服务的指标数据
  • 强大的查询语言:PromQL 支持复杂的数据分析和聚合
  • 告警管理:与 Alertmanager 集成实现灵活的告警规则
  • 生态完整:与 Grafana 等可视化工具无缝集成

目前 Prometheus 已经是云原生监控的事实标准,LiteLLM 的企业版本提供了 Prometheus 集成能力。

配置 Prometheus 回调

首先安装必要的依赖:

$ pip install prometheus_client==0.20.0

然后在配置文件中启用 Prometheus 回调:

litellm_settings:
  callbacks: ["prometheus"]  # 启用 Prometheus 指标

重启 LiteLLM 服务:

$ litellm -c config.yaml

现在访问 http://localhost:4000/metrics 就可以看到 Prometheus 格式的指标数据。目前指标数据还是空的,可以发送几个测试请求后再看:

$ curl -X POST 'http://127.0.0.1:4000/chat/completions' \
  -H 'Authorization: Bearer sk-1234' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "给我讲个笑话"}]
  }'

指标详解

LiteLLM 提供的指标大致可以分为以下几个主要类别:

1. 代理服务指标(Proxy Service Metrics)

这类指标主要监控 LiteLLM 代理服务的整体运行状况和请求处理情况:

  • litellm_proxy_total_requests_metric_total (counter)
    代理服务总请求数 - 跟踪客户端向代理发起的请求总量
  • litellm_proxy_failed_requests_metric_total (counter)
    代理服务失败请求数 - 客户端未能从代理获得成功响应的请求数

2. 延迟性能指标(Latency & Performance Metrics)

这类指标用于监控请求处理的延迟情况,帮助识别性能瓶颈:

  • litellm_request_total_latency_metric (histogram)
    LiteLLM 请求总延迟时间(包含 LiteLLM 开销)
  • litellm_llm_api_latency_metric (histogram)
    LLM API 调用延迟时间
  • litellm_llm_api_time_to_first_token_metric (histogram)
    LLM API 首个 token 响应时间(仅流式请求)
  • litellm_overhead_latency_metric (histogram)
    LiteLLM 处理开销延迟

3. 成本和使用量指标(Cost & Usage Metrics)

这类指标跟踪 LLM 服务的使用成本和 token 消费情况:

  • litellm_spend_metric_total (counter)
    LLM 请求总花费
  • litellm_total_tokens_metric_total (counter)
    LLM 请求的输入+输出 token 总数
  • litellm_input_tokens_metric_total (counter)
    LLM 请求的输入 token 总数
  • litellm_output_tokens_metric_total (counter)
    LLM 请求的输出 token 总数

4. 预算管理指标(Budget Management Metrics)

这类指标监控团队和 API 密钥的预算使用情况,支持成本控制:

团队预算指标:

  • litellm_remaining_team_budget_metric (gauge)
    团队剩余预算
  • litellm_team_max_budget_metric (gauge)
    团队最大预算设置
  • litellm_team_budget_remaining_hours_metric (gauge)
    团队预算重置剩余时间(小时)

API 密钥预算指标:

  • litellm_remaining_api_key_budget_metric (gauge)
    API 密钥剩余预算
  • litellm_api_key_max_budget_metric (gauge)
    API 密钥最大预算设置
  • litellm_api_key_budget_remaining_hours_metric (gauge)
    API 密钥预算重置剩余时间(小时)

5. 流量控制指标(Rate Limiting Metrics)

这类指标监控基于模型的请求和 token 限制情况:

  • litellm_remaining_api_key_requests_for_model (gauge)
    API 密钥针对特定模型的剩余请求数(基于 RPM 限制)
  • litellm_remaining_api_key_tokens_for_model (gauge)
    API 密钥针对特定模型的剩余 token 数(基于 TPM 限制)
  • litellm_remaining_requests (gauge)
    LLM 部署的剩余请求数(来自 LLM API 提供商)
  • litellm_remaining_tokens (gauge)
    LLM 部署的剩余 token 数(来自 LLM API 提供商)

6. 部署状态指标(Deployment Analytics)

这类指标监控 LLM 部署的健康状态和运行表现:

部署状态:

  • litellm_deployment_state (gauge)
    部署状态:0=健康,1=部分故障,2=完全故障
  • litellm_deployment_cooled_down_total (counter)
    部署被负载均衡逻辑冷却的次数

请求统计:

  • litellm_deployment_success_responses_total (counter)
    LLM 部署成功响应总数
  • litellm_deployment_failure_responses_total (counter)
    LLM 部署失败响应总数
  • litellm_deployment_total_requests_total (counter)
    LLM 部署总请求数(成功+失败)

性能分析:

  • litellm_deployment_latency_per_output_token (histogram)
    每个输出 token 的延迟时间

7. 回退机制指标(Fallback Metrics)

这类指标监控主要模型失败时的回退处理情况:

  • litellm_deployment_successful_fallbacks_total (counter)
    成功回退请求数(从主模型→回退模型)
  • litellm_deployment_failed_fallbacks_total (counter)
    失败回退请求数(从主模型→回退模型)

自定义 Metrics 标签

LiteLLM 支持添加自定义元数据作为 Prometheus 标签:

litellm_settings:
  callbacks: ["prometheus"]
  # 将请求元数据添加为 Prometheus 标签
  custom_prometheus_metadata_labels: [
    "metadata.environment",
    "metadata.service",
    "metadata.version"
  ]

发送带有自定义元数据的请求:

$ curl -X POST 'http://localhost:4000/chat/completions' \
  -H 'Authorization: Bearer sk-1234' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "测试"}],
    "metadata": {
      "environment": "production",
      "service": "chatbot",
      "version": "v1.2.3"
    }
  }'

生成的指标将包含这些自定义的标签:

litellm_total_tokens_metric{
  model="gpt-4o",
  metadata_environment="production",
  metadata_service="chatbot",
  metadata_version="v1.2.3"
} 89

使用此功能时需特别小心,避免使用高基数标签(比如 user_idrequest_id 等),可能导致指标爆炸,造成性能问题。

另一种自定义标签的方式是通过 custom_prometheus_tags 配置:

litellm_settings:
  callbacks: ["prometheus"]
  # 自定义标签
  custom_prometheus_tags: [
    "prod",
    "staging"
  ]

然后发送带标签的请求:

$ curl -X POST 'http://localhost:4000/chat/completions' \
  -H 'Authorization: Bearer sk-1234' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-4o",
    "messages": [{"role": "user", "content": "测试"}],
    "metadata": {
      "tags": ["prod"]
    }
  }'

生成的指标如下所示:

litellm_total_tokens_metric{
  model="gpt-4o",
  tag_prod="true",
  tag_staging="false"
} 89

使用 Prometheus 采集指标

创建 prometheus.yml 配置文件:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'litellm'
    static_configs:
      - targets: ['10.6.120.132:4000'] # 换成你的 IP 地址
    metrics_path: '/metrics'
    scrape_interval: 10s

然后使用 Docker 启动 Prometheus 服务:

$ docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

访问 http://localhost:9090 进入 Prometheus 的 Query 页面,输入指标即可查询:

prometheus-query.png

点击 “Graph” 以图的形式查看指标:

prometheus-query-graph.png

通过 Prometheus 采集的指标数据,我们可以更进一步,基于 Grafana 构建一个完整的 LiteLLM 监控大盘,实现对 AI 服务的全方位观测。可以参考 LiteLLM 官方提供的 Grafana 仪表盘模板:

此外,Prometheus 还可以和 Alertmanager 集成,实现比 Slack 更灵活的告警规则。具体内容可以参考 Alertmanager 的官方文档:

小结

今天我们深入学习了 LiteLLM 的监控告警系统,重点掌握了两种集成方案:

  • Slack 告警集成:提供实时的通知能力,支持多种告警类型和智能去重,特别适合团队协作和快速响应的场景
  • Prometheus 监控集成:基于时间序列数据的企业级监控方案,与 Grafana 结合可构建完整的可观测性平台,或者与 Alertmanager 集成实现更灵活的告警规则

除了这两种集成方案,LiteLLM 还支持 PagerDuty、邮件、Webhook 等其他方式,篇幅有限,此处不再赘述。

监控告警系统是生产环境的神经系统,它让我们能够感知系统的每一个变化,及时响应每一个问题。希望通过本文的学习,你能够建立起稳定可靠的 LiteLLM 监控告警体系,为用户提供更好的 AI 服务体验。

欢迎关注

如果这篇文章对您有所帮助,欢迎关注我的同名公众号:日习一技,每天学一点新技术

我会每天花一个小时,记录下我学习的点点滴滴。内容包括但不限于:

  • 某个产品的使用小窍门
  • 开源项目的实践和心得
  • 技术点的简单解读

目标是让大家用5分钟读完就能有所收获,不需要太费劲,但却可以轻松获取一些干货。不管你是技术新手还是老鸟,欢迎给我提建议,如果有想学习的技术,也欢迎交流!