问题出现得很突然,日志倒是留得挺全。客服机器人一个 thread 连用了一周,第 60 多轮开始 400,原文 This model’s maximum context length is 128000 tokens,导出线程看到累计 400 多条消息,人工翻了一遍都是很短的问答。

刚开始盯着「assistant 的长指令每轮重复注入,固定开销被放大几十倍」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。thread 会保留全部历史,每一轮都把整条线程重新送进模型。另一种情况是文件检索命中的 chunk 也占上下文,一次命中多个文件时膨胀很快。

少数情况下是客户端只清了本地缓存,服务端线程里的旧消息一条没少。

第一件事是统计线程里现存的消息条数

curl -s "https://api.openai.com/v1/threads/thr_abc/messages?limit=100" -H "Authorization: Bearer $OPENAI_API_KEY" -H "OpenAI-Beta: assistants=v2" | jq '.data|length'

新建一条干净的线程

curl https://api.openai.com/v1/threads -H "Authorization: Bearer $OPENAI_API_KEY" -H "OpenAI-Beta: assistants=v2" -H "Content-Type: application/json" -d '{}'

只把摘要和最近两轮写进新线程

curl https://api.openai.com/v1/threads/thr_new/messages -H "Authorization: Bearer $OPENAI_API_KEY" -H "OpenAI-Beta: assistants=v2" -H "Content-Type: application/json" -d '{"role":"user","content":"摘要:老客户询问退款;最近问题:进度到哪了"}'

给 run 设置只保留最近若干条消息

curl https://api.openai.com/v1/threads/thr_new/runs -H "Authorization: Bearer $OPENAI_API_KEY" -H "OpenAI-Beta: assistants=v2" -H "Content-Type: application/json" -d '{"assistant_id":"asst_abc","truncation_strategy":{"type":"last_messages","last_messages":10}}'

改完先别撤,确认这几项。新线程第一轮返回 200,run 正常到 completed,messages 接口里条数稳定在二十条以内,不再出现 context_length_exceeded。

补一句。truncation_strategy 只影响这一次 run 的输入,线程本身还在变长,长期跑的业务要定期归档旧线程,否则换个时间点还会报同样的错。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189