企业 AI 账单核对:从周期汇总到单次调用明细的工程方法
说明:本文给出一种企业 AI 账单核对的通用工程方法,示例代码为演示性质。文中口径、模型名称与数据均为示意,接入时请替换为实际业务字段,不涉及真实客户信息。
当企业把多个 AI 模型接进业务系统后,费用核对通常会遇到两个问题:一是汇总账单只能回答“花了多少”,回答不了“花在哪”;二是不同模型、不同任务的计费方式不同,用单一口径去套容易出错。
解决思路是把“调用用量”和“计费结果”在同一套记录里关联起来:先按周期看汇总,再定位到具体调用,最后下钻到单次调用的计费明细。这篇文章介绍一种可落地的核对方法,并给出相应的数据结构与查询示例。
一、先把每次调用的用量与费用落库
核对的基础是数据。如果每次模型调用的用量、模型、计费结果都散落在不同地方,后续很难做统一分析。
做法是在调用侧封装一层记录逻辑,每次调用结束后把关键字段写入一张归集表。最小字段集可以包括:请求标识、模型名称、计费方式、计费数量、计价单位、金额、计费状态、计费时间。
import sqlite3 from datetime import datetime def record_call(request_id, model, billing_type, quantity, unit, amount, status): """记录一次 AI 调用的计费信息,供后续汇总与明细核对。""" conn = sqlite3.connect("ai_bill.db") conn.execute(""" CREATE TABLE IF NOT EXISTS bill_records ( request_id TEXT PRIMARY KEY, model TEXT, billing_type TEXT, quantity REAL, unit TEXT, amount REAL, status TEXT, billed_at TEXT ) """) conn.execute(""" INSERT OR REPLACE INTO bill_records VALUES (?, ?, ?, ?, ?, ?, ?, ?) """, (request_id, model, billing_type, quantity, unit, amount, status, datetime.now().isoformat())) conn.commit() conn.close()
落库时尽量保留原始字段,不要在写入阶段就做太多聚合。汇总可以在查询时按不同维度完成,这样同一笔记录既能按模型汇总,也能按请求 ID 追溯。
二、按周期和模型查看汇总
数据落库后,第一步核对通常是按周期汇总。下面这条 SQL 按月份、模型、计费方式聚合,输出请求次数、总用量和总金额。
SELECT model, billing_type, COUNT(*) AS request_count, SUM(quantity) AS total_quantity, SUM(amount) AS total_amount FROM bill_records WHERE billed_at >= '2026-09-01' AND billed_at < '2026-10-01' GROUP BY model, billing_type ORDER BY total_amount DESC;
查询时要注意:quantity 在不同 billing_type 下的含义不同:可能是 Token 数、请求次数、生成时长或分辨率相关的计量值。因此汇总时一定要带上 billing_type,不能把“按 Token 计费”和“按次计费”的数量直接相加。
三、从汇总定位到具体调用
当某个月份或某个模型的费用异常时,下一步是找到具体记录。
SELECT * FROM bill_records WHERE model = 'gpt-4o' AND billing_type = 'token' AND billed_at >= '2026-09-18' ORDER BY amount DESC LIMIT 20;
查询结果里,request_id 是定位单次调用的关键字段。通过它可以把账单记录与业务日志、调用链路关联起来,判断某次高额调用是正常业务请求还是异常重复调用。
四、结合计费方式理解金额
只看金额或只看数量,都容易误判。不同计费方式的核对重点如下:
- 按 Token 计费:关注输入 Token、输出 Token 和对应单价,注意不同模型的“每百万 Token”单价差异。
- 按请求次数计费:关注调用次数和“每次请求”单价,与 Token 用量无关。
- 按时长/分辨率计费:常见于视频、语音类模型,需要核对生成时长、分辨率等附加条件。
因此, bill_records 表中的 billing_type 和 unit 字段必须保留,不能在汇总时丢失。
五、下钻到单次调用的计费明细
对于需要进一步确认的记录,可以把它拆成多个计量项。例如一次多模态调用可能同时包含输入 Token、输出 Token 和图像生成,每一项的单价和数量都不同。
可以在明细表中再拆一层:
CREATE TABLE bill_line_items ( request_id TEXT, item_name TEXT, -- 例如 input_tokens / output_tokens / image_tokens raw_usage REAL, -- 原始用量 billed_usage REAL, -- 计费用量 unit_price REAL, -- 单价 amount REAL, -- 该项金额 is_billed INTEGER -- 是否参与计费 );
下钻查询:
SELECT item_name, raw_usage, billed_usage, unit_price, amount, is_billed FROM bill_line_items WHERE request_id = 'req-20260918120000-abc' ORDER BY amount DESC;
这一步能回答:一次调用的总金额,是由哪些计量项构成的,每一项的原始用量、计费用量、单价分别是多少。
六、一个可复用的月度核对流程
把上面的步骤串起来,一次月度核对可以按下面六步执行:
- 汇总:按月份、模型、计费方式聚合,确认整体费用趋势;
- 排序:找出金额或用量最高的几项,标记为待确认项;
- 定位:根据模型和时间范围,查询具体调用记录;
- 理解口径:核对每条记录的计费方式和计价单位,避免跨口径比较;
- 下钻明细:对异常记录拆分计量项,查看金额构成;
- 与厂商账单对比:如有差异,按请求 ID 和时间范围进一步定位原因。
企业可以先从一个模型、一个部门开始跑通这套流程,再逐步扩展到更多模型和业务线。关键是让每一笔费用都能被追溯到一次具体调用,而不是只停留在汇总数字上。