Claude Sonnet 3.5 调用工具时喜欢加换行?这是怎么回事以及如何解决
最近在社群里刷到一个让人很有共鸣的话题:大家最近在用 Claude Sonnet 3.5(也就是大家口中的 Sonnet 5)做开发时,有没有发现它搞 Tool Call(工具调用)的时候,特别“优雅”,特别喜欢在参数里写一堆换行?
Claude Sonnet 3.5 在 Tool Call 参数中多余的换行符示例
乍一看,这可能是 AI 为了让人眼看着舒服,但如果你是开发者在写后端解析逻辑,这简直就是灾难现场。原本规规矩矩的 JSON,被它加了一堆毫无意义的 \n,甚至有时候会导致解析器报错,或者传给 API 的参数格式不对。
今天咱们就来扒一扒这背后的原因,以及作为开发者,我们该怎么“治”它。
为什么 Sonnet 这么爱换行?
其实这并不是一个严格的“Bug”,更像是模型的一种“风格偏好”或者说“对齐”问题。
-
训练数据的锅:现在的 LLM 训练数据中,存在大量可读性极佳的代码和 JSON 样本。为了让模型生成的代码更易读,强化学习(RLHF)阶段通常会对“格式美观”的内容给予奖励。这就导致模型产生了一种幻觉:觉得“加上换行和缩进”等于“我写得更好”。
-
Tokenizer 的影响:虽然对于 JSON 来说,压缩和密集通常是更优的选择,但在 Tokenizer 的视角里,生成换行符可能比生成特定的复杂字符串更“顺手”。特别是在某些高并发的生成场景下,模型为了维持思考的连贯性,可能会下意识地插入一些填充符。
紧凑的 JSON 格式对比易读性较差但结构稳定的 Pretty Print 格式
- 思维链(CoT)的副作用:如果你开启了详细的思维链,模型在输出最终结果前,内部经过了一系列推理。有时候这种“排版整洁”的倾向会溢出到 Tool Call 的参数输出中,导致原本应该紧凑的 JSON 变得松松垮垮。
这会带来什么实质问题?
如果是纯文本交互,多几个换行无所谓。但在自动化开发场景中,这就很致命:
-
解析失败:如果你用的是强校验的 JSON 解析器,莫名其妙的换行符可能会破坏结构(尤其是某些边缘情况)。
-
接口报错:下游的 HTTP API 如果对参数里的换行符敏感(比如某些老旧的系统或严格的数据库查询),这些换行符直接变成
\n注入,可能会导致查询失败。 -
Token 浪费:虽然是小事,但对于大规模调用的系统,这些无意义的换行符也是实打实的 Token 消耗,积少成多也是钱。
几种实用的解决方案
遇到了这种“顽固”的模型行为,我们没法直接修改它的权重,但可以在 Prompt 和工程架构上动手。
1. System Prompt 强约束(最常用、最快)
这是成本最低的方法。在你的 System Prompt 或者前置指令里,明确加上关于输出格式的要求。
- ❌ 错误示范:“请输出标准的 JSON。”(太模糊,模型觉得它现在的输出就是标准的)
- ✅ 正确示范:“请输出紧凑的 JSON 格式,不要包含任何多余的换行符、缩进或注释,仅输出纯 JSON 字符串。”
甚至可以更激进一点:“必须是单行 JSON,严禁出现 \n。”
2. 输出后的清洗处理
既然它是大概率事件,不如在你的代码逻辑里加一道“清洗阀”。在拿到模型返回的 Tool Call 参数后,先过一遍正则替换。
例如在 Python 中:
import re
import json
raw_content = model_response # 模型返回的内容
# 去除多余的换行和空格,只保留 JSON 结构内的必要空格
# 注意:这步操作要小心,不要把字符串值里的空格也删了
cleaned_content = json.dumps(json.loads(raw_content), separators=(',', ':'))
这样不管模型怎么换行,最后经过你的代码,永远都是最紧凑的格式。
3. 采样温度调低
虽然这主要是风格问题,但适当降低 temperature(例如设为 0 或 0.1),可以让模型更倾向于选择高概率的 Token,减少它“自作主张”进行美学排版的概率。
4. 定义 Pydantic / JSON Schema
在使用 API 时,尽可能严格地定义 JSON Schema 或使用 response_format 指强制类型。虽然这不一定能完全杜绝换行,但能保证 JSON 结构的绝对合法性,避免因为换行导致的语法错误。
写在最后
Claude Sonnet 3.5 依然是目前最强的 Coding Agent 之一,这种喜欢换行的“小脾气”算是它聪明过头带来的副作用。作为开发者,理解它的行为逻辑,通过 Prompt Engineering 和代码健壮性来兜底,才是最稳妥的策略。
如果你也有遇到过类似的奇葩模型行为,欢迎在评论区交流你的“驯化”心得!

评论已关闭