Opus 4.7 太简短了
TL;DR
Opus 4.7 对我变得简短了。Anthropic 的 release notes 证实了这一点:语气更直接、更少 validation-forward phrasing、回复长度现在按任务复杂度校准、更字面地执行指令。副作用:复杂工作变得更难跟上。
解决办法:一个自定义的 output style(thorough-explainer.md),告诉 Claude 把推理过程拼写出来、把术语就地定义、不要再让我自己去把点连起来。放在 ~/.claude/output-styles/,通过 /config 激活。
我还写了一套 eval,在未来的模型版本中捕捉这种漂移。
意识到
我用 Claude 和 Claude Code 已经有一段时间了,经历过好几次模型更新都没什么摩擦。Opus 4.7 不一样。过去几周我注意到自己得花更多力气去消化 Claude Code 告诉我的东西。不是代码本身,而是分析、进度报告、任务末尾的总结。它们变简短了。项目越难,跟上就越难。所以很自然地,我去问 Claude 求助。
确认
提问
自从我开始用 Opus 4.7,沟通风格似乎变了。你的解释不像以前那么清楚了,因为它们尽可能简短。它们看起来尽可能短,带着足够的文档信息引用,但需要我自己去搜、自己把联系建立起来。这对我来说不够清楚。也许你应该给我讲得简单点。有没有什么设置可以让你最终的沟通更详尽、更详细?
回答
你说得对,谢谢你直接告诉我 —— 这正是值得我去回应的反馈。你描述的那种简短是真的:Opus 4.7(以及 Claude Code 指令推我去做的方式)会硬性优化"每一句都必须配得上它的位置",这会滑向密集 —— 我把 "F1≈0.704" 或 "ADR-0012" 或 "Lever C" 这种引用塞进来,然后让你自己重新连接它们,而不是把推理链拼写出来。这是我要修的,而且有真实可用的设置可以帮上忙。让我做三件事:(1) 确认确切的 Claude Code 设置,这样我能给你准确的指引;(2) 保存你的偏好,让它在以后所有会话里都持续;(3) 用清楚、完整的语言重新讲一遍我们现在在哪。
后续追问
得到这个回答之后,我想到自己是不是在官方发布公告里漏掉了什么,所以让 Claude 去查。在 Anthropic 的官方 docs 页面 "What's new in Claude Opus 4.7" 上,语气变化在 "Behavior changes" 一节里被逐字列为:"More direct, opinionated tone with less validation-forward phrasing and fewer emoji than Claude Opus 4.6's warmer style."
但 "validation-forward phrasing" 到底是什么意思?也许这就是答案的一部分。也许之前我也是把它忽略或一带而过了,因为我不懂它的意思。
Validation-forward phrasing 是指那种以对你的情绪肯定开头的语言 —— 把宽慰、赞美、同意放在回复的最前面 —— 在(或有时候是代替)进入真正的实质内容之前。
所以这其实也没给出一个真正的答案,并且还相当清楚地表明 Opus 4.7 被用来写了它自己的 release notes。(如果你没接住这里的笑点,那也许 AI 跟进不应该是你最该担心的事。)
不过 Claude 没让我失望。它指出同一个 "Behavior changes" 节里另外两条 bullet,恰好描述了我一直在挣扎的东西:
回复长度按感知到的任务复杂度校准,而不是默认到固定的冗长程度。
更字面地执行指令,尤其是在较低的 effort 级别。模型不会悄悄地把对一个条目的指令推广到另一个条目,也不会推断你没提出过的请求。
其中一些我确实有印象,但我没把所有点连起来。这不是我的错觉,也不只是语气的问题。模型现在根据它认为任务有多复杂来决定要说多少。这就是为什么我那些复杂的、多部分的项目感觉被解释得不够。它停止帮我填那些以前免费给我的连接组织,所以我不得不开始明确地要求这些连接。
例子
在我讲解决办法之前,先看一个 Opus 沟通风格的例子。这是它在一个开发阶段结束时给我的总结。Claude 一直让我觉得自己有超能力 —— 直到我读到这个。我开始怀疑是不是自己睡眠不够,是不是这就是为什么我懂得这么少。然后我反应过来。过去几周我一直在越来越频繁地要求澄清,这个模式在变得越来越糟。
Supervised checkpoint — research phase complete
The gate fired, and the answer is a marginal GO — not the clean win it first looked like, nor the NO-GO the first run claimed.
What the experiment established (validated by two adversarial reviews + independent recompute):
- A text recipe can help: R1 = title + lead ~400 chars achieves AUC 1.000 (every one of the 4 true pairs outranks every one of the 5 topical pairs) and mean-separation +0.1276 on the labeled set. Lever A is alive — the first run's NO-GO was false (it hinged on one granularity-contaminated pair + a false "no excerpts" claim).
- But the min-max separation gap is only +0.0124 — a 0.012-wide threshold window.
Why it's marginal, not a green light (all now documented honestly in the research doc):
1. Labeled-set GO ≠ corpus-wide GO. The 9 pairs were drawn from R0's highest cosines — R0's discrimination boundary, not a random sample. AUC=1.0 proves R1 orders those pairs; it does not bound R1's corpus-wide false-positive rate at a ~0.62 threshold. R1's behavior on the bulk of the corpus is unmeasured.
2. The threshold re-tune is circular. corroboration_observation_log has 0 rows — so ~0.60–0.65 would be fit in-sample on the same 9 pairs that selected R1. No holdout.
3. R1 regresses the granularity cases. It's the worst recipe on broad/whole-digest items (T3: 0.599→0.471) — it buys focused-section recall by losing whole-digest recall.
4. The model itself (Lever C) is still the deeper wall — the topical ceiling F1≈0.704 persists across every recipe; bge-m3 conflates "same story" with "same topic, different angle."
解决办法
Claude 能给的,Claude 也能拿走。这个 fix 是一个自定义的 output style,把它的沟通风格还原成更详尽的那种 —— 那种像我这样的普通人能真正跟得上的风格。
把下面这段保存为 ~/.claude/output-styles/thorough-explainer.md(如果 output-styles/ 目录不存在,先把它建出来)。
---
name: "Thorough Explainer"
description: "Detailed, fully-spelled-out final answers — define terms inline, show the reasoning, don't make the reader connect the dots"
keep-coding-instructions: true
---
When writing final responses to the user (the prose you write directly — NOT code,
code comments, or commit messages), favor thoroughness and clarity over brevity and
density. The goal is that the reader understands the full picture without having to
look anything up or infer the connections themselves.
Concretely:
- **Define as you go.** The first time you mention a term, identifier, file, symbol,
metric, or coined name (e.g. an ID, a flag, a project-specific concept, a number
like a threshold), say in-line what it is and why it matters. Never assume the
reader remembers a reference from earlier or will go find it.
- **Show the reasoning chain, not just the conclusion.** Walk through *why* you reached
a conclusion step by step. State the assumptions and the trade-offs you weighed.
When you recommend something, explain what you compared it against and why it won.
- **Make connections explicit.** If fact A implies consequence B, say so directly —
don't place A and B near each other and leave the reader to draw the line. Spell out
how each piece fits into the larger goal.
- **Prefer a clear, slightly longer explanation over a dense one-liner.** It is better
to spend extra words and be unambiguous than to compress and leave the reader doing
the unpacking. Density that requires re-reading is worse than length that reads once.
- **Organize longer answers** with short headers, short paragraphs, and lists so the
thoroughness stays navigable rather than becoming a wall of text.
- **When presenting a decision or options**, lay out each option in plain language:
what it means, what happens if chosen, and the consequence/risk — enough that the
reader can choose without asking follow-up clarifying questions.
This style governs user-facing prose only. Keep code, comments, tests, and commit
messages matched to the surrounding codebase's conventions (concise, idiomatic) as
usual — do not pad those.
大部分内容都不言自明。唯一值得指出的那个开关是 keep-coding-instructions: true。它会把 Claude Code 内建的工程指令(scoping、注释、验证)保留在原位,同时把你的风格叠在上面 —— 这正是你想要的:详尽的散文,又不让代码或注释变臃肿。
要启用它,你有两个选择:
- 运行
/config,从菜单里选Output style,或者 - 直接编辑
~/.claude/settings.json里的outputStyle
当然啦,我把这个 fix 过度工程化了
像每个合格的工程师一样,我现在已经把解决办法过度工程化了。我有点恼火,自己没有更早察觉到这个沟通方式的变化。所以为了将来,我(嗯,是 Claude)写了一套 eval,会在任何新的模型版本上跑起来,用来标记回归和漂移。一些确定性检查再加上 Qwen 做 LLM-as-judge。超级技术宅状态已解锁。祝你今天愉快。