1. 大模型产品上线后巡检到底在巡什么大模型应用上线只是开始真正让人睡不踏实的是上线后的每一天首包时间是不是悄悄从 300ms 涨到了 2sToken 消耗是不是某个 Prompt 突然失控接口是不是偶发 5xx 但大盘还绿着。这些问题不会在功能测试阶段暴露只会在真实流量里慢慢发酵。我理解的 LLM 产品巡检核心就三件事可用性、体验延迟、成本速率。可用性看请求成功率体验延迟重点盯 TTFTTime To First Token首 Token 延迟成本速率看单位时间内的 Token 消耗。三者缺一不可只盯总响应时间会漏掉打字机卡顿只盯账单会等到月底才发现算力失控。适合谁看正在做 LLM 应用上线、需要搭建日常巡检流程的后端或运维同学已经有一套脚本但指标太单一、想补齐 TTFT 和 Token 监控的团队。这篇不讲大道理直接给可复制的配置骨架和验证动作你跟着改参数就能跑起来。统一 Key 和 API 通道是巡检能落地的前提。如果每个模型、每个环境各用一套 Key巡检脚本要维护一堆凭证指标也没法横向对比。下面从接入层开始一步步把巡检链路搭起来。2. 用 TaoToken 统一 Key 作为巡检接入层巡检脚本要频繁发请求如果直连各家模型、每个供应商一套鉴权维护成本会很高。我的做法是让巡检流量统一走一个兼容 OpenAI 协议的入口Key 集中管理模型名按需切换。TaoToken 提供的就是这样一个统一通道官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。对巡检场景来说统一通道带来三个实际好处。第一巡检脚本只需要一个base_url和一个 Key环境变量注入即可不用在代码里硬编码多家凭证。第二TTFT 和 Token 用量可以在同一层采集指标口径一致做对比时不会因为供应商差异产生噪声。第三切换被测模型只改一个model字段巡检用例不用重写。你需要先拿到 Key。登录后进入控制台在 API Keys 页面创建一个专用 Key建议命名成llm-inspection之类方便和线上业务 Key 区分开。创建入口在这里https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。巡检 Key 最好单独限额避免巡检本身把额度跑满影响业务。注意巡检 Key 和业务 Key 一定要分开。巡检是高频低量请求业务是低频高量混在一起既不好排查也没法单独做成本归因。拿到 Key 后先别急着写脚本用一条 curl 确认通道通不通。这一步能排除掉大部分「脚本报错其实是 Key 或地址写错」的问题。确认无误后再进入配置环节。3. 可复制的巡检配置骨架巡检配置分两块一块是客户端侧的settings.json管模型、超时、重试这些运行时参数一块是巡检任务侧的config.toml管采样频率、阈值、告警规则。分开写的好处是改阈值不用动代码改模型不用动任务定义。3.1 settings.json客户端运行时参数这个文件放在巡检脚本同级目录用环境变量注入 Key不要把 Key 写进文件。{ base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, default_model: gpt-4o-mini, request: { timeout_seconds: 30, max_retries: 2, stream: true }, inspection: { ttft_warn_ms: 800, ttft_critical_ms: 2000, token_rate_warn_per_min: 50000, sample_interval_seconds: 60 } }几个参数说明一下。stream必须开true否则拿不到首 Token 时间TTFT 就无从谈起。ttft_warn_ms设 800ms 是经验值超过这个数用户端开始有感知ttft_critical_ms设 2000ms到这个量级基本就是卡顿了。token_rate_warn_per_min是每分钟 Token 消耗速率上限按你业务的正常水位往上留 30% 余量来设。3.2 config.toml巡检任务与告警规则[inspection] name llm-product-daily enabled true interval_seconds 60 [[inspection.probes]] name chat-basic model gpt-4o-mini prompt 用一句话说明什么是首包延迟 expect_min_tokens 5 [[inspection.probes]] name chat-long model gpt-4o-mini prompt 分三点说明大模型巡检的关键指标 expect_min_tokens 30 [alert] ttft_ms 800 token_rate_per_min 50000 error_rate_percent 2 webhook_env INSPECTION_WEBHOOKprobes是巡检用例建议至少两条一条短 Prompt 测基础可用性和 TTFT一条长 Prompt 测输出 Token 速率。expect_min_tokens用来做基本的内容非空校验返回 Token 数低于这个值说明模型可能被截断或异常。提示interval_seconds别设太密。60 秒一次、每次两条探针一天也就 2880 次请求成本可控。设成 5 秒一次巡检本身就成了算力消耗大户。配置写好后把 Key 注入环境变量export TAOTOKEN_API_KEY你的巡检专用Key到这里配置骨架就齐了。接下来写采集逻辑把 TTFT 和 Token 速率真正算出来。4. 采集 TTFT 与 Token 速率的实现TTFT 的采集要点是发流式请求记录从发出请求到收到第一个 chunk 的时间差。Token 速率则是统计单位时间内usage里的total_tokens增量。下面这段 Python 可以直接跑依赖openai和tomli。import os import time import json import tomli from openai import OpenAI with open(settings.json, r, encodingutf-8) as f: settings json.load(f) with open(config.toml, rb) as f: config tomli.load(f) client OpenAI( base_urlsettings[base_url], api_keyos.environ[settings[api_key_env]], ) def probe_once(probe): start time.time() ttft_ms None first_chunk True stream client.chat.completions.create( modelprobe[model], messages[{role: user, content: probe[prompt]}], streamTrue, timeoutsettings[request][timeout_seconds], ) for chunk in stream: if first_chunk and chunk.choices and chunk.choices[0].delta.content: ttft_ms (time.time() - start) * 1000 first_chunk False total_ms (time.time() - start) * 1000 return { probe: probe[name], ttft_ms: round(ttft_ms, 2) if ttft_ms else None, total_ms: round(total_ms, 2), } if __name__ __main__: for probe in config[inspection][probes]: result probe_once(probe) print(result)跑起来后你会看到类似{probe: chat-basic, ttft_ms: 412.3, total_ms: 1180.5}的输出。ttft_ms就是首包延迟total_ms是完整响应时间。两者差值大说明模型在首包之后生成慢属于输出侧问题两者都大说明请求排队或网络层有问题。Token 速率的采集稍微不同需要累计一段时间。简单做法是每次探针记录usage.total_tokens按分钟窗口求和from collections import deque token_window deque() def record_tokens(total_tokens, tsNone): ts ts or time.time() token_window.append((ts, total_tokens)) cutoff ts - 60 while token_window and token_window[0][0] cutoff: token_window.popleft() return sum(t for _, t in token_window)把record_tokens的返回值接到告警判断里超过token_rate_warn_per_min就触发。这样 Token 速率异常能在几分钟内被发现而不是等到月底看账单。指标采集齐了下一步是验证整条链路真的能跑通、能报警。5. 验证请求与成功结果确认配置和脚本都就位后先做一次手动验证确认三件事请求能通、TTFT 能采到、告警能触发。第一步用 curl 确认通道可用curl https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [{role: user, content: ping}], stream: true }看到流式返回的data:行就说明通道正常。如果返回 401检查 Key 是否注入成功返回 404检查base_url有没有多写或少写路径。第二步跑巡检脚本观察输出。正常结果里ttft_ms应该在几百毫秒量级total_ms在 1 到 3 秒之间。如果ttft_ms是None多半是stream没开或者模型没返回内容。第三步故意把ttft_warn_ms改成1再跑一次确认告警逻辑能触发。这一步很多人跳过结果真出问题时才发现告警根本没接上。验证通过后把阈值改回正常值。注意验证告警时用测试 Webhook别往生产告警群发测试消息容易造成误判。三步都过了说明巡检链路是通的。接下来把常见报错整理一下方便你出问题时快速定位。6. 本篇常见错排查报错一openai.AuthenticationError: 401Key 没注入或写错。检查echo $TAOTOKEN_API_KEY是否有值注意不要有多余空格或换行。如果用的是.env文件确认加载顺序在客户端初始化之前。报错二ttft_ms始终为None最常见原因是streamFalse。TTFT 依赖流式返回非流式请求只能拿到完整响应没有首包概念。检查settings.json里request.stream是否为true。报错三token_rate一直为 0usage字段在流式模式下可能不返回或者返回在最后一个 chunk。需要在流结束后单独取usage或者改用非流式请求做 Token 统计、流式请求做 TTFT 统计两条链路分开。报错四巡检脚本本身消耗大量 Token探针 Prompt 太长或频率太高。把探针 Prompt 控制在 50 字以内interval_seconds不低于 30。巡检的目的是探活和采指标不是做效果评测不需要长 Prompt。报错五告警频繁误报阈值设得太紧。TTFT 受网络波动影响单次超阈值不代表故障建议连续 3 次超阈值再告警。Token 速率同理用滑动窗口而不是瞬时值。排查完这些巡检流程基本就稳了。最后说下长期跑起来之后怎么维护。7. 长期巡检的接入与扩展巡检跑起来之后日常维护主要是两件事指标看板和阈值调优。看板建议至少放四条曲线TTFT 的 P50 和 P99、Token 速率、请求成功率。P99 比均值更能反映长尾卡顿很多体验问题都藏在 P99 里。阈值不是设一次就不管了。业务量涨了Token 速率上限要跟着调模型换了TTFT 基线会变。建议每月回看一次历史数据把阈值校准到当前水位。如果你要把巡检接入 CI 或者 Agent 做自动化处置可以用 Coding Plan 把巡检脚本和告警处置串起来入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。想先手动验证模型响应是否符合预期可以用模型对话页面直接测https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。接入细节和参数说明在文档里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。巡检这件事务实比全面重要。先把 TTFT 和 Token 速率这两个指标采稳比堆一堆花哨指标更有用。我踩过的坑是早期只盯总响应时间结果用户反馈卡顿、大盘全绿排查了半天才发现是首包延迟恶化。把 TTFT 单独拎出来监控之后这类问题基本能在十分钟内定位。