监控 AI 流量并跟踪大语言模型成本
本指南介绍如何使用内置 AI 日志、APISIX 上下文变量和标准可观测性集成,观察 AI 流量并估算大 语言模型成本。
概览
AI 可观测性不同于传统 API 可观测性。对于大语言模型工作负载,需要具备 Token 级可见性、模型归因,以及首 Token 延迟等延迟细分数据。
通过 API7 AI 网关,可以收集:
- 请求和响应模型元数据。
- 提示词和补全 Token 数。
- 端到端及上游耗时信号。
- 可选的请求/响应内容载荷级日志。
网关不会直接计算账单。成本跟踪通过将 Token 用量映射到服务提供方定价得出。
前置条件
-
安装 Docker。
-
安装 cURL,用于发送请求并验证服务。
-
拥有一个正在运行的 API7 网关实例。
-
从控制台获取令牌,并保存到环境变量:
export API_KEY=your-dashboard-token # 请替换为你的控制台令牌 -
将
{gateway_group_id}替换为网关组 ID。如果正在按照快速入门操作,请使用default。 -
如果使用 Admin API 示例,请创建或复用一个服务。如果尚无服务,请按照创建或复用服务操作,然后保存其 ID:
export SERVICE_ID=your-service-id # 请替换为你的服务 ID
内置 AI 日志
ai-proxy 和 ai-proxy-multi 支持以下 logging 配置:
logging.summaries(布尔值):记录request_model、model、duration、prompt_tokens、completion_tokens和upstream_response_time。logging.payloads(布尔值):记录请求消 息、流式标记和响应文本内容。
在路由范围启用日志,或在适用时通过共享插件策略启用:
- Admin API
- ADC
curl -k "https://localhost:7443/apisix/admin/routes?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-d '{
"id": "ai-observability",
"service_id": "'"$SERVICE_ID"'",
"paths": ["/ai"],
"plugins": {
"ai-proxy": {
"provider": "openai",
"auth": { "header": { "Authorization": "Bearer '"$OPENAI_API_KEY"'" } },
"options": { "model": "gpt-4o" },
"logging": {
"summaries": true,
"payloads": false
}
}
}
}'
❶ 在 ai-proxy 插件上启用 AI 日志。
❷ 记录摘要级字段(模型及 Token/耗时元数据),用于成本和性能分析。
❸ 默认禁用载荷日志,以减少敏感内容暴露。
services:
- name: AI Observability
routes:
- uris:
- /ai
name: ai-observability
plugins:
ai-proxy:
provider: openai
auth:
header:
Authorization: "Bearer ${OPENAI_API_KEY}"
options:
model: gpt-4o
logging:
summaries: true
payloads: false
❶ 在 ai-proxy 插件上启用 AI 日志。
❷ 记录摘要级字段(模型及 Token/耗时元数据),用于成本和性能分析。
❸ 默认禁用载荷日志,以减少敏感内容暴露。
将配置同步到 API7 网关:
adc sync -f adc.yaml
对于多模型路由,请在每个 ai-proxy-multi 实例中应用相同的 logging 字段:
- Admin API
- ADC
curl -k "https://localhost:7443/apisix/admin/routes?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-d '{
"id": "ai-observability-multi",
"service_id": "'"$SERVICE_ID"'",
"paths": ["/ai-multi"],
"plugins": {
"ai-proxy-multi": {
"instances": [
{
"name": "openai-primary",
"provider": "openai",
"auth": { "header": { "Authorization": "Bearer '"$OPENAI_API_KEY"'" } },
"options": { "model": "gpt-4o-mini" },
"logging": {
"summaries": true,
"payloads": false
},
"weight": 1
}
]
}
}
}'
❶ 在 ai-proxy-multi 中按实例配置 logging.summaries 和 logging.payloads。
services:
- name: AI Observability Multi
routes:
- uris:
- /ai-multi
name: ai-observability-multi
plugins:
ai-proxy-multi:
instances:
- name: openai-primary
provider: openai
auth:
header:
Authorization: "Bearer ${OPENAI_API_KEY}"
options:
model: gpt-4o-mini
logging:
summaries: true
payloads: false
weight: 1
❶ 在 ai-proxy-multi 中按实例配置 logging.summaries 和 logging.payloads。
将配置同步到 API7 网关:
adc sync -f adc.yaml
完整配置说明请参阅 ai-proxy 和 ai-proxy-multi。
AI 流量的 APISIX 变量
以下 APISIX 上下文变量可用于访问日志、外部日志插件和自定义可观测性管道:
| 变量 | 说明 |
|---|---|
llm_time_to_first_token | 流式响应的首 Token 延迟(TTFT)。 |
llm_prompt_tokens | 模型服务提供方报告的提示词 Token 数。 |
llm_completion_tokens | 模型服务提供方报告的补全 Token 数。 |
llm_model | 实际生成响应的模型。 |
request_llm_model | 客户端请求的模型。 |
llm_response_text | 上下文中捕获的响应文本内容。 |
Prometheus 集成
使用标准 prometheus 插件导出网关指标。AI 流量的内置指标包括:
apisix_llm_latency(直方图)—— LLM 请求的端到端延迟,带有路由、服务、消费者和服务提供方标签。apisix_llm_prompt_tokens(计数器)—— 累计提示词 Token 数,带有路由、URI、主机、服务提供方和模型标签。apisix_llm_completion_tokens(计数器)—— 累计补全 Token 数,带有路由、URI、主机、服务提供方和模型标签。apisix_llm_active_connections(仪表)—— 当前活跃的 LLM 连接数,带有路由、URI、主机、服务提供方和模型标签。
PromQL 查询示例:
# 所有路由上当前活跃的 LLM 连接数
sum(apisix_llm_active_connections)
# 按活跃 LLM 连接数排序的路由
topk(10, sum by (route) (apisix_llm_active_connections))
# 告警条件示例:活跃连接数持续偏高
avg_over_time(sum(apisix_llm_active_connections)[5m:]) > 200
请根据部署和流量特征调整标签及阈值。
将 AI 请求记录到外部系统
可以将 APISIX 日志插件与 AI 上下文变量组合,把包含 AI 元数据的结构化日志转发到 ELK、Loki 或 Splunk 等系统。
结构化日 志负载示例:
{
"route_id": "27bcdea2-7586-47ad-9262-a3adf4b6699e",
"service_id": "d8402098-2f80-4e08-afab-21b9ebc62090",
"model": "deepseek-chat",
"request_model": "",
"prompt_tokens": 11,
"completion_tokens": 16,
"duration_ms": 3991,
"ttft_ms": 2159,
"upstream_response_time": 1133
}
route_id和service_id是网关为路由和服务分配的 UUID。- 如果客户端未显式指定模型,
request_model为空,模型由插件配置决定。 duration_ms不是内置 AI 日志字段。请在日志格式配置中使用$latency(请求总耗时)和$upstream_latency(上游响应时间)来测量请求持续时间。
生产遥测默认使用摘要日志。仅在具备适当数据处理控制且需要短期调试时启用载荷日志。