这个坑值得记一笔。把一份合同全文加两轮追问一起发给 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 越多单价越高,真正省钱的做法还是先切块再抽取,最后只把要点拼起来送进去。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。