报错是这么冒出来的。LM Studio 0.3 加载 qwen2.5-7b-instruct,上下文设 4096,传入约 6000 token 的对话,接口返回 200 但回答只针对最后两轮,前面的内容像没看到。

中间走过弯路,把「客户端没有统计实际发送长度」当成主因,改完现象没变。

原因不止一个,得分开看。超出上下文的部分被从头部丢弃。少数情况下是OpenAI 兼容层不返回截断错误。

另外,模板里的 system 提示先被裁掉。

动手时先把 prompt 的 token 数打出来

python -c "import tiktoken;e=tiktoken.get_encoding('cl100k_base');print(len(e.encode(open('prompt.txt',encoding='utf-8').read())))"

然后在服务端设置里把上下文调到 8192

curl http://localhost:1234/v1/models

客户端按预算裁剪历史,保留 system

python trim_history.py --max-tokens 6000 --keep-system

末了用同一段长对话验证前几轮是否被引用

python probe_context.py --turns 6 --url http://localhost:1234/v1/chat/completions

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

别只看报错消失,验证要多做一步。长对话下回答能引用第一轮的信息,日志里记录的实际发送 token 数低于上下文上限。

本地推理服务的截断通常是静默的,客户端自己算 token 并裁剪,比相信服务端会报错靠谱。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189