事情本身不复杂,线索都在日志里。知识库 42 万份文档,按每份 0.0001 元估 embedding 成本,预算 42 元,实际账单 118 元;文档平均 1800 字,切块后变成 3.2 块,按条数估完全漏掉了切块。

第一反应是「中文字符与 token 的比例不是 1 比 1」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。计费按 token 不按文档条数。也可能是切块后每块单独计费,重叠部分还要再算一次。

不容易想到的是,重建索引时重复调用了两次。

先用 tiktoken 统计真实 token 数

python -c "import tiktoken;e=tiktoken.get_encoding('cl100k_base');print(len(e.encode('退款流程需要几个工作日')))"

然后按切块后的块数重新估算总量

python count_chunks.py --input corpus/ --size 512 --overlap 50

接着对比账单里的 usage 与本地统计

python -c "print({'local_tokens':185000000,'billed_tokens':262000000})"

末了在入库前去重并记录重建次数

python dedupe_docs.py --input corpus/ --report dedupe.json

恢复的判定其实很直接。本地统计的 token 与账单 usage 误差小于 3%,预算按 token 重算后与实际支出一致,重建索引不再重复计费。

补一句。embedding 的计费单位是 token,切块和重叠都会放大总量;估算时先算块数再乘平均 token,按文档数估通常差三到四成。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189