这个坑值得记一笔。把一份合同全文加两轮追问一起发给 moonshot-v1-8k,返回 400,提示 conversation is too long,按字符粗估输入超过 9000 token,去掉历史后能通过。

刚开始盯着「同一段合同重复放在 system 和 user 里」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。所选模型是 8k 版本,长文一进去就超限;历史消息没有裁剪,每轮都带完整上下文;模型名写的是旧版 8k,账单上却按长上下文计费。

先换成长上下文版本再试

curl https://api.moonshot.cn/v1/chat/completions -H "Authorization: Bearer $MOONSHOT_KEY" -d '{"model":"moonshot-v1-128k","messages":[{"role":"user","content":"hi"}]}'

随后按段落切块,每块单独抽取要点再汇总

python chunk.py --size 2000 --input contract.txt

历史只保留最近两轮,其余压缩成摘要

messages = [system] + history[-4:]

末了把每轮实际 token 打进日志观察趋势

print(resp.usage.total_tokens)

别只看报错消失,验证要多做一步。请求返回 200,模型能引用合同第几条作答,输入 token 落在模型上限以内,追问两轮也不会再超。

容易忽略的是,换长上下文模型只是应急,token 越多单价越高,真正省钱的做法还是先切块再抽取,最后只把要点拼起来送进去。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189