这个坑值得记一笔。同一批 5 万条商品标题做向量化,中文标题平均 20 字,英文标题平均 10 个单词,账单里中文部分的费用是英文的两倍,按条数完全解释不了。

刚开始盯着「标题里的空格与符号也计入」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。embedding 按输入 token 计费 不按条数;中文一个汉字常占 1 到 2 个 token;截断过长标题会悄悄丢内容。

先用对应 tokenizer 估算两批 token

python -c "import tiktoken;e=tiktoken.get_encoding('cl100k_base');print(len(e.encode('无线蓝牙耳机')))"

接着按语言分组统计条数与 token

python emb_report.py --log emb.jsonl --by lang

给中文标题设更小的批量

python emb_batch.py --file zh.txt --batch 64

剩下的就是对比截断前后的召回效果

python eval_recall.py --before old.index --after new.index

同事提醒我看一下最近一次发布,时间点确实对得上。

改完先别撤,确认这几项。两批的实际 token 与账单一致,中文单价不再被条数掩盖,召回率没有因为截断下降。

提醒一点。不同模型的 tokenizer 对中文差异很大,换模型前要用同一批文本重算,别沿用旧的估算系数。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189