在企业全面拥抱大语言模型LLM的过程中基础设施团队面临的最尖锐矛盾之一就是高昂的 GPU 硬件采购成本与不可预测的 Token 消耗费用。传统微服务的服务器成本通常与 QPS 呈线性关系而 LLM 业务中一个设计不当的 Agent 提示词可能一次性吃掉 8000 个 Token 并递归调用 10 次导致单笔请求的算力成本暴增上百倍。如果缺乏精细化的计量核算系统到了季度对账时往往只能看到一张巨额的算力账单却无法讲清楚究竟是哪个部门、哪个业务线、哪类 Prompt 占用了最多资源。为了实现 AI 基础设施的成本透明化与精准核算我们自研了一套基于 Token 分位数计量、多维租户标签与动态预算熔断的治理系统。flowchart TD subgraph 业务调用层 DeptA[电商运营业务线] -- IngressGW[AI 统一接入网关] DeptB[客服智能体业务线] -- IngressGW DeptC[数据挖掘业务线] -- IngressGW end subgraph 实时计量与反洗钱风控 IngressGW -- TokenExtractor[Token 解析器 租户标签打标] TokenExtractor -- MeteringEngine[实时流式计量引擎: Go Kafka] MeteringEngine -- BudgetChecker{核算预算与消耗速率} end subgraph 计费与预算管控 BudgetChecker --|正常在限额内| ModelBackend[底层异构推理集群] BudgetChecker --|超出月度预算上限| HardCutoff[自动降级或拦截报警] MeteringEngine -- ClickHouse[(ClickHouse 成本分位数明细表)] ClickHouse -- BIReport[财务账单与部门摊销大屏] end1. 精确到 Token 的多维度计量埋点在网关层我们为每一个请求打上多级业务标签包括部门Department、项目Project、环境Environment、模型名称Model以及调用模式Sync/Stream。网关在接收到流式响应的最后一个 Chunk 时从响应头或推理引擎反馈中提取精确的prompt_tokens与completion_tokenspackage metering import ( context encoding/json time github.com/segmentio/kafka-go ) type TokenUsageEvent struct { EventID string json:event_id Timestamp time.Time json:timestamp TenantID string json:tenant_id Department string json:department ProjectName string json:project_name ModelName string json:model_name PromptTokens int json:prompt_tokens CompletionTokens int json:completion_tokens TotalTokens int json:total_tokens CostCNY float64 json:cost_cny DurationMs int64 json:duration_ms } type MeteringProducer struct { writer *kafka.Writer } func (m *MeteringProducer) PublishUsage(ctx context.Context, event *TokenUsageEvent) error { // 根据模型单价如 Prompt 0.002元/kToken, Completion 0.006元/kToken计算单次花费 event.CostCNY calculateCost(event.ModelName, event.PromptTokens, event.CompletionTokens) event.TotalTokens event.PromptTokens event.CompletionTokens payload, err : json.Marshal(event) if err ! nil { return err } return m.writer.WriteMessages(ctx, kafka.Message{ Key: []byte(event.TenantID), Value: payload, }) } func calculateCost(model string, promptTokens, completionTokens int) float64 { // 基础单价映射表 switch model { case qwen-72b-instruct: return float64(promptTokens)*0.000004 float64(completionTokens)*0.000012 default: return float64(promptTokens)*0.000001 float64(completionTokens)*0.000002 } }2. ClickHouse 聚合分析与分位数P50/P90/P99监控简单的平均值往往会掩盖真实的问题。我们通过 ClickHouse 存储明细数据并建立基于分位数的分析视图重点抓出消耗巨大长 Prompt 的异常业务-- 统计各部门过去 24 小时 Token 消耗与 P99 长 Prompt 异常 SELECT department, project_name, count() AS total_requests, sum(total_tokens) AS aggregated_tokens, sum(cost_cny) AS total_cost_cny, quantile(0.50)(prompt_tokens) AS p50_prompt_tokens, quantile(0.95)(prompt_tokens) AS p95_prompt_tokens, quantile(0.99)(prompt_tokens) AS p99_prompt_tokens FROM ai_platform.token_usage_events WHERE timestamp now() - INTERVAL 24 HOUR GROUP BY department, project_name ORDER BY total_cost_cny DESC;当某个项目的 P99 Prompt Tokens 突然从 2000 飙升到 30000 时系统会自动向相关团队负责人发送告警提示可能存在文档未切块直接塞入上下文的低效代码实现。3. 动态预算控制与配额熔断除了事后核算系统更具备事前与事中的硬预算防护月度配额预警与熔断每个项目在创建时必须声明月度预算上限如每月 5 万元。当消耗达到 80% 时触发告警达到 100% 时非核心请求自动降级为轻量开源小模型或者直接返回配额耗尽错误杜绝出现“账单失控”。防重放与死循环兜底通过在网关层计算 Prompt Hash 与会话轮次当检测到某个 Agent 在 1 分钟内以相同的语义参数连续发起 20 次以上调用时判定为 Tool Calling 死循环强制拦截并告警。通过建立这套成本精细化治理体系我们将全公司的非必要 Token 浪费减少了 45%并为各业务部门提供了清晰透明的 ROI 核算报表。