资讯详情

资讯详情

大模型 API 账单越来越高?用单次成功任务成本反推多花在哪一步

账单涨得快于调用量原因通常是下面四种之一或几种叠加输入变长输出变长一个任务里的请求变多或者模型选得偏大。只看调用次数分不出是哪一种。更有用的指标是单次成功任务成本统计期内全部请求的费用含失败和重试除以验收通过的任务数。这个数字变了就能指出先改哪一环。一、为什么用成功任务做分母按调用次数算单价会掩盖两件事。一是失败和重试的费用被摊平在成功请求里。二是一个任务可能调用好几次模型调用次数多少不能说明完成了多少工作。把验收通过的任务作分母失败会直接拉高指标。单次成功任务成本 统计期内全部请求费用含失败、重试 ÷ 验收通过的任务数二、先看五个信号信号包含什么偏高时先查每次请求的输入 Token历史轮次、检索片段、系统指令历史是否每轮重发Top-K 是否过大系统指令是否重复每次请求的输出 Token回答正文和推理内容是否有长度约束推理类参数是否一直开着每个任务的调用次数Agent 循环、重试、校验同一工具、同一参数是否反复出现按模型拆分的费用占比每个模型承担了多少费用分类、标签这类简单任务是否用了大模型缓存读取占全部输入的比例前缀是否稳定前缀里是否有时间戳或随机 ID变化的内容是否放在了前面三、用请求日志算指标日志每行记录一次请求用 JSON Lines 格式保存。字段先归一化才能跨模型相加input_tokens未缓存输入不含缓存读取和缓存写入。OpenAI 的prompt_tokens包含缓存命中部分写入前要减去cached_tokens。cache_read_tokens、cache_write_tokens没有就填 0不要留空。task_passed任务是否通过验收。同一任务的每一行填相同的值。下面的脚本读取这样的日志输出指标。importjsonimportsys# 示例单价元 / 百万 Token发布前替换为所选型号官方价目表的数字PRICES{model-large:{input:10.0,cache_read:1.0,cache_write:12.5,output:40.0},model-small:{input:1.0,cache_read:0.1,cache_write:1.25,output:4.0},}defrecord_cost(rec):# 字段已归一input_tokens 是未缓存输入不含缓存读取和缓存写入pPRICES[rec[model]]return(rec[input_tokens]*p[input]rec[cache_read_tokens]*p[cache_read]rec[cache_write_tokens]*p[cache_write]rec[output_tokens]*p[output])/1e6defsummarize(path):passed{}# 任务 ID - 验收是否通过同一任务的每条记录填相同值callsmissing0cost_allinput_allcache_all0.0withopen(path,encodingutf-8)asf:forlineinf:recjson.loads(line)calls1passed[rec[task_id]]rec[task_passed]ifrec[input_tokens]isNone:missing1# 用量缺失时不按 0 计单独统计continuecost_allrecord_cost(rec)input_allrec[input_tokens]rec[cache_read_tokens]rec[cache_write_tokens]cache_allrec[cache_read_tokens]oksum(passed.values())print(f任务数{len(passed)}验收通过{ok}调用次数{calls}平均每任务{calls/len(passed):.2f}次)print(f总费用含失败与重试{cost_all:.4f})ifinput_all:print(f缓存命中率缓存读取 / 全部输入{cache_all/input_all:.1%})ifok:print(f单次成功任务成本{cost_all/ok:.4f})ifmissing:print(f警告{missing}条记录缺少用量未计入费用上面的数字偏低需对账)if__name____main__:summarize(sys.argv[1])示例日志usage.jsonl的数据为虚构只用于验证脚本{task_id:t1,model:model-large,input_tokens:8000,cache_read_tokens:6000,cache_write_tokens:0,output_tokens:500,task_passed:true}{task_id:t1,model:model-small,input_tokens:1200,cache_read_tokens:0,cache_write_tokens:0,output_tokens:80,task_passed:true}{task_id:t2,model:model-large,input_tokens:9000,cache_read_tokens:0,cache_write_tokens:0,output_tokens:700,task_passed:false}{task_id:t2,model:model-large,input_tokens:null,cache_read_tokens:0,cache_write_tokens:0,output_tokens:null,task_passed:false}运行命令是python cps.py usage.jsonl。Windows 控制台出现中文乱码时先设置PYTHONIOENCODINGutf-8。输出如下任务数 2验收通过 1调用次数 4平均每任务 2.00 次 总费用含失败与重试0.2255 缓存命中率缓存读取 / 全部输入24.8% 单次成功任务成本0.2255 警告1 条记录缺少用量未计入费用上面的数字偏低需对账这个脚本的限制单价写死在PRICES里官方调价后要同步更新并注明核对日期。只统计已记录的请求。平台没有返回的请求要和账单逐条对账。阶梯价、时段价、批量折扣没有实现需要时自行扩展。四、按改动成本从低到高处理换模型不动流程。分类、标签这类任务先试小模型。在同一批样本上比较准确率和完整任务费用再小范围切换。精简输入。删掉重复的系统指令。历史保留关键事实和最近几轮早期内容改成摘要但摘要本身也计费。RAG 先去重再缩小 Top-K并测试召回质量。时间范围、产品版本、排除项这类限制条件不要删。调整缓存前缀。稳定内容指令、文档、工具定义放在前面变化的问题放在后面。缓存命中按各家规则计价OpenAI 的缓存写入规则随型号变化Anthropic 区分缓存写入和缓存读取。命中不等于免费低频复用的前缀写入成本可能高于节省的部分。给流程设边界。Agent 设最大轮次、超时和预算。同一工具、同一参数重复执行时中止并记录原因。能用代码校验的格式JSON 字段、日期交给代码不再让模型复看。重试集中在一处并设上限。约束输出但别卡死。Anthropic Messages 用max_tokensOpenAI Responses 用max_output_tokens。OpenAI Chat Completions 的max_tokens已弃用应核对max_completion_tokens的支持情况。上限过紧会截断答案并触发重试推理内容也占生成额度。比较供应商时算完整任务价格。输入、输出、缓存读写和存储费一起算不只比最低输入单价。对批量、非实时任务看厂商是否提供异步批量接口。每次只改一项改前改后用同一统计期比较。同时改多项就无法判断哪一项起了作用。五、平台侧的护栏与对账灵眸 AI渠道入口的 Token 设置里可以配置总额度、每分钟请求数和模型白名单。给 Agent 用的 Token 设上限可以给失控的循环设一个开销边界分类类任务的 Token 只允许调用小模型能防止配置被改错后误用大模型。超出上限后的具体表现以控制台说明为准。对账可以使用用量导出接口GET /api/v1/usage。它返回逐条明细包括request_id、各类 Token、原价total_cost和实扣actual_cost。使用时注意以下四点导出接口用账号登录换取 JWT 鉴权不接受sk-开头的 API Key。登录密码放在环境变量里不要写进脚本。导出数据里没有任务 ID也没有验收结果。调用时把响应里的请求 ID 和任务 ID 一起记下导出后按request_id关联。文档没有写明input_tokens是否包含cache_read_tokens。用一条已知缓存命中的请求核对后再套用第三章的归一化规则。平台侧元数据保留 90 天。跨季度对账前要定期导出存档。核对平台扣费时直接汇总actual_cost。它是美元金额已乘渠道倍率即total_cost × rate_multiplier。第三章的脚本按单价重算适合比较模型和功能不能替代账单。六、方案边界换小模型、压缩上下文、调整缓存都不能保证节省。省下的费用如果换来质量下降单次成功任务成本可能反而上升。自动重试只能处理部分临时错误。重试和网关都不能消除所有 429也不能替代上游额度规划。聚合平台的计费口径要逐项核对币种、渠道倍率、失败请求是否计费。把这些写进验收清单不要只比较单价。缺失的用量不能按 0 计。按 0 计时总费用和单次成功任务成本都会偏低容易误判优化已经见效。七、常见问题缓存命中率的分母怎么定分母取全部输入 Token包括未缓存输入、缓存读取和缓存写入不包括输出。只用未缓存输入做分母比率会偏高。失败的请求要计入成本吗要。失败和重试的请求如果已经在服务端完成通常会计费。统计时失败请求的费用计入分子分母只数验收通过的任务。具体计费规则以厂商文档为准无法确认时按可能计费处理。平台导出的用量和自己的日志对不上怎么办按顺序核对三项。第一导出时是否传了timezone否则日期边界按 UTC 切分和本地日志会差一段时间。第二两边的请求 ID 能否对上。第三Token 字段是否按同一口径归一化尤其是输入是否包含缓存读取。八、检查清单每次请求都写一条日志包括失败和重试输入、缓存读取、缓存写入、输出分开记录日志里有请求 ID 和业务任务 ID导出后能关联按任务统计验收通过数计算单次成功任务成本Agent 设最大轮次和预算分类类任务限定模型导出明细时传入时区并定期存档每次优化只改一项用同一统计期比较账单涨得快先别急着换模型。先算清每个成功任务花了多少钱再判断该改哪一步。你们的单任务成本主要花在长上下文、Agent 循环还是失败重试上欢迎在评论区说说。参考资料以下资料的核对日期待发布前补写。发布前需逐个打开当日页面确认。灵眸 AI 官方文档导出 Usage 使用明细、如何使用 Token、合规与备案元数据留存。核对日期待补。OpenAI API 定价https://platform.openai.com/docs/pricingOpenAI Prompt Cachinghttps://platform.openai.com/docs/guides/prompt-cachingOpenAI Responses 参数max_output_tokenshttps://platform.openai.com/docs/api-reference/responses/createOpenAI Chat Completions 参数max_completion_tokenshttps://platform.openai.com/docs/api-reference/chat/createAnthropic API 定价https://docs.anthropic.com/en/docs/about-claude/pricingAnthropic Prompt Cachinghttps://docs.anthropic.com/en/docs/build-with-claude/prompt-cachingAnthropic Messages 参数max_tokenshttps://docs.anthropic.com/en/api/messagesGoogle Gemini API 定价https://ai.google.dev/gemini-api/docs/pricingGoogle Gemini 上下文缓存https://ai.google.dev/gemini-api/docs/caching
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →