快速结论:这个报错通常发生在 llama.cpp 推理时设置了 reasoning budget(思考预算),模型在思考过程中被硬截断,注入的 wrap-up 提示没有留出任何 token 让模型收尾,于是出现 “Avoid mid-sentence cutoff” 式的半句截断。优先排查推理预算参数,以及是否有可用的两阶段结论或 logit 软收束实现。
适用环境:Issue 中确认的测试环境为 llama.cpp 最新代码;社区反馈者在 ROCm/gfx1100 上测试 Qwen3.5-27B,并提到 Qwen3.5-35ba3b 和 9b 版本。Issue 未给出明确的 Python、CUDA、PyTorch 或驱动版本。
最快修复方案:暂无确认的一步修复方案。Issue 中已验证的是两阶段结构(Option B):把预算拆成思考阶段和结论阶段,在思考阶段结束时注入类似 “Final Answer:\nBased on my analysis above,” 的按模型推理风格书写的消息,并预留足够的结论 token;强制 </think> 只作为安全网。纯偏移方案(Option A)经测试无效。
注意事项:Issue 作者明确说明自己的实现主要由 LLM 编写,因此没有提交 PR;该实现未合入上游,需要自行评估代码。结论阶段消息的有效性与模型自身的推理风格强相关,目前对 Qwen3.5 系列效果较好,其他模型需单独验证。logit 偏置方案(Option C)只是社区分享分支,同样未合入,需自行测试。
问题场景
用户在 llama.cpp 中启用思考预算(reasoning budget)相关参数,例如 --reasoning-budget-message。该参数在 token 上限处注入一条 wrap-up 消息,模型在思考轨迹被截断前收不到任何提示,无法在当前思路结束前收尾,于是回答在句子中间被切断。该 Issue 本身是功能请求,但讨论中暴露的是现行注入机制的实际使用问题。
报错原文
Feature Request: Graceful reasoning budget termination. Avoid mid-sentence cutoff.
原因分析
最可能的原因是:思考预算消息恰好在第 N 个 token 注入,注入后剩余 token 为 0,模型没有预算可用去响应这条收尾提示,效果等同于直接截断加一句装饰性后缀。
讨论中还记录了一个具体机制:纯偏移方案(在 budget - offset 处提前注入)不起作用,因为 forced_tokens 是原子量,无论偏移多少,模型的结论 token 实际仍为零。即 if (ctx->remaining <= 0) 改为 if (ctx->remaining <= ctx->warn_offset) 并不能让模型获得收尾空间。
另一个被讨论中强调的因素是:注入消息的措辞需要模拟模型自身的推理风格,而不是从外部描述预算限制;仅提醒“预算将尽”的元评论效果不佳。
环境排查
- 确认 llama.cpp 版本是否为包含
--reasoning-budget-message的提交之后版本(Issue 提到 PR #20297 约于 2025-03-11 合入)。 - 确认
--reasoning-budget与--reasoning-budget-message的实际取值,以及预算是否过小、结论阶段是否完全没有余量。 - 确认模型型号;Issue 已验证 Qwen3.5-27B、Qwen3.5-35ba3b 与 9b 版本,其他模型的注入措辞效果未确认。
- 如使用 Option C 分支,确认所有 soft 参数默认值是否为 0,以免默认行为被意外改变。
- 若在 ROCm 环境测试,使用 gfx1100 显卡可参考社区反馈者的验证条件;Python、CUDA、PyTorch 版本 Issue 未提供,不作为排查项。
解决步骤
- 先确认当前行为:使用现有
--reasoning-budget-message观察思考轨迹,确认截断是否发生在句子中间、注入消息后是否没有任何结论 token。 - 可优先尝试两阶段预算结构:把总预算拆为思考阶段 t 和结论阶段 s(t + s = budget),在思考阶段结束时注入一行模仿模型推理风格的结论起始文本,例如
Final Answer:\nBased on my analysis above,。 - 为结论阶段预留足够的 token;社区极端测试中 budget=5000、200 token 后注入,模型在剩余约 4800 token 窗口内自然收束,未触发强制终止。
- 保留强制
</think>作为安全网,而不是作为主要的收束手段。 - 不要依赖单纯的偏移方案;如需提前注入,必须先确认
forced_tokens的原子行为是否已改变,否则模型仍无结论 token。 - 如愿意尝试软收束,可参考社区分支
smartprogrammer93/llama.cpp的feat/reasoning-budget-soft-taper,在COUNTING状态下按预算消耗比例对</think>施加逐级增大的 logit bias,默认值全为零以保持向后兼容。 - 关注上游进展:维护者表示该功能将由指定人员主导实现,Issue 中提到的 PR #21141 针对 Option B;对话压缩 PR #27401 与本问题无关,不应视为闭合依据。
验证方法
在相同 prompt 与预算下重新运行:检查思考轨迹是否在预算耗尽前自然出现结论段,回答是否不再在句子中间截断,强制 </think> 是否未被触发或仅作为兜底。可对比调整前后的输出质量,并在目标模型上分别用不同预算(例如小预算与 5000 这类大预算)复测,确认注入消息在该模型上有效。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: 429 rate limit errors from OpenRouter FREE models not honored?](https://www.chat-gpts.plus/wp-content/uploads/2026/10/9035-c53fddfe-768x403.jpg)
![[Bug]: Decisions transformations materialize missing probabilities as 0.0](https://www.chat-gpts.plus/wp-content/uploads/2026/10/48449-9c573b30-768x403.jpg)
