DeepSeek-R1 推理模型 <think> 破坏 JSON 解析或陷入无限复读死循环
解决推理模型输出 <think> 思考块导致 JSON.parse 崩溃、temperature=0 引发无限死循环复读,以及思考过长耗尽 max_tokens。
查看脚本或工作流解析前的原始模型输出字符串,属于以下哪种现象?
curl -s http://127.0.0.1:11434/api/generate -d '{"model":"deepseek-r1:14b","stream":false,"prompt":"Return JSON {\"ok\":true}"}' | jq -r .response「DeepSeek-R1 推理模型 <think> 破坏 JSON 解析或陷入无限复读死循环」的全部 1 步终端探测命令与分支判据
无需逐层点击交互,以下列出本故障决策树每一层的宿主机只读探测命令、预期基线提示与输出流向。
查看脚本或工作流解析前的原始模型输出字符串,属于以下哪种现象?
curl -s http://127.0.0.1:11434/api/generate -d '{"model":"deepseek-r1:14b","stream":false,"prompt":"Return JSON {\"ok\":true}"}' | jq -r .response- • 开头包含 <think>...</think> 思考过程,后面才是 JSON,导致 JSON.parse 报错
→ sol-strip-think-tags - • 模型在思考块内无限重复同一句话(“等等,我再核对一下……”)直到超时或打满长度
→ sol-r1-sampling-params - • 输出在 </think> 闭合前就突然截断,根本没有吐出最终结果
→ sol-r1-token-budget
「DeepSeek-R1 推理模型 <think> 破坏 JSON 解析或陷入无限复读死循环」包含的 3 类根因、修复代码与验收命令
修复方案:解析前正则剥离 <think> 思考块(切勿强锁语法采样)
sol-strip-think-tagsDeepSeek-R1 等推理模型固定先输出 `<think>...</think>` 再输出正文。若强行开启顶层 `"format": "json"` 语法锁,会强行压制思考过程导致推理智商断崖式下跌;若不开启则直接破坏下游 JSON.parse。
- 调用推理模型时不加顶层 `"format": "json"`,允许其正常完成 `<think>...</think>` 思考链。
- 在下游代码或 n8n 节点中先用一行正则剥离 `<think>[\s\S]*?<\/think>` 及代码块标记,再执行 JSON.parse()。
export function parseReasoningJson(raw: string) {
const withoutThink = raw.replace(/<think>[\s\S]*?<\/think>/gi, '').trim();
const cleanJson = withoutThink
.replace(/^\s*```(?:json)?\s*/i, '')
.replace(/\s*```\s*$/i, '')
.trim();
return JSON.parse(cleanJson);
}[边界说明]工程选型建议:若仅需高速确定性字段提取而无需多步逻辑推理,应直接选用 Qwen2.5-Instruct 而非 R1 推理模型。
node -e 'const raw="<think>step 1</think>\n{\"ok\":true}"; console.log(JSON.parse(raw.replace(/<think>[\s\S]*?<\/think>/,"").trim()))'修复方案:将采样温度设为 0.6、top_p 设为 0.95(严禁对 R1 使用 temperature=0)
sol-r1-sampling-paramsDeepSeek-R1 官方技术报告明确指出:在量化后的 R1 蒸馏模型上设置 `temperature: 0`(贪婪采样)极易导致注意力头在自我反思词元上陷入无限复读死循环。
- 将推理模型的采样参数固定在官方推荐甜点区间:`temperature: 0.6`、`top_p: 0.95`。
- 在 Q4_K_M 量化档位下可配合设置 `repeat_penalty: 1.05` 进一步抑制长文复读。
{
"model": "deepseek-r1:14b",
"options": {
"temperature": 0.6,
"top_p": 0.95,
"repeat_penalty": 1.05,
"num_ctx": 16384
}
}[边界说明]同时注意:调用 DeepSeek-R1 系列模型时建议将所有指令合并放入 user 消息中,避免额外 system prompt 干扰思考模板。
ollama show deepseek-r1:14b --parameters修复方案:将 max_tokens / num_predict 提升至 ≥ 4096 以容纳思考链开销
sol-r1-token-budget`max_tokens`(或 `num_predict`)同时统计 `<think>` 内部词元与最终回答词元。若沿用普通模型的 512/1024 上限,模型在思考阶段就会把配额耗尽。
- 调用 DeepSeek-R1 时,将 `num_predict` / `max_tokens` 至少设为 `4096`,并将 `num_ctx` 设为 `16384`。
- 在消费结果前先检测是否包含闭合的 `</think>` 标签,若无则判定为思考超时截断。
if (rawResponse.includes('<think>') && !rawResponse.includes('</think>')) {
throw new Error('Reasoning model exhausted max_tokens inside <think> block before producing final answer');
}[边界说明]实测表明,中等复杂度的代码分析或排障任务平均会消耗 600–1,800 个思考 Token 后才会开始输出正式结论。
echo "Verified </think> closure guard"DeepSeek-R1 与 Qwen2.5-Coder 本地编程实战:<think> 思考预算、FIM 补全与死循环排障
拆解本地辅助编程最常见的两大误区(拿推理模型做行间补全导致卡顿、temperature=0 引发无限思考复读),给出 R1 推理 + Qwen2.5-Coder 补全的双模型黄金配比。
MacBook Pro M3 Max(36GB 统一内存)与 NVIDIA RTX 4070 Ti Super(16GB 独显)实测
Ollama 0.5.7 · Continue v1.0.x (VS Code) · deepseek-r1:14b · qwen2.5-coder:7b
100% 离线源码安全(零代码片段上传) — 仓库向量索引(`bge-m3`)、FIM 行间补全与架构问答全部在本机回环接口完成,私有业务源码零外传。