关于 token-efficiency
这项通用技能旨在减少不必要的 Token,同时保持写作、编码、工具调用和上下文管理的质量,适用于普通用户和使用工具的 Agent。可选 Hook 会在每轮注入核心规则。
主要功能
- 01先确定答案结构再展开
- 02按任务复杂度调整推理深度
- 03减少文本与代码冗余
- 04批量执行互不依赖的工具调用
- 05按需检索上下文
- 06跨会话保存持久笔记
适用场景
- 01撰写简洁的邮件和报告
- 02搜索代码并查看指定片段
- 03在控制上下文规模下运行长会话
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ denfry/ claude-skills --skill token-efficiency安装后在 Claude Code 中输入/token-efficiency确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
CORE_SHORT.mdCORE.mdevals/evals.jsonmeasure.pyhooks/_state.pycontext_budget.pyefficiency_core.pyinstall.pyREADME.mdsession_report.pytrajectory_guard.pyreferences/examples.md详细介绍
Token 效率与更敏锐的思考
一项贯穿各处的技能:它不是针对某类任务的工作流,而是一组持续适用的习惯,涵盖每个回答——文字、代码、工具使用、上下文管理和内部推理。受众是所有人,而不只是开发者:起草邮件、总结研究、分析电子表格,或在聊天中回答一个临时问题,都遵循相同的原则。没有可用工具时(纯对话),§4–§5 不适用;§1–§3 和 §6–§7 始终适用。
**核心原则:**目标绝不是“少说”。目标是找出能够正确达成结果的最少高信号 token。为了节省 token 而省略必要的澄清并不划算——它会导致返工,后续成本远高于此。应优化整场对话(或整个 Agent 会话)的 token 总量,而不是孤立地优化当前消息。如果删减可能导致与用户或工具多一轮往返,就不要删。
如何提供这项技能
分为三个层级,刻意分开,以降低常驻层的开销:
| 层级 | 内容 | 加载时机 |
|---|---|---|
| 核心约定 | CORE.md — 约 8 行,不可妥协的要求 | 每轮对话,由 UserPromptSubmit 钩子注入 |
| 本文件 | 完整原则,§1–§7 | 模型调用这项技能时 |
| 参考资料 | references/examples.md — 完整的前后对照示例 | 按需加载,需要查看完整示例时 |
技能正文无法“始终常驻”——技能由模型调用,因此较长的技能在会话中会逐渐失效。 hooks/ 中的钩子可以确定性地解决这个问题:每轮对话都会重新注入核心约定,并在具体的工具使用浪费发生时发出提示。安装说明见 hooks/README.md。
钩子是可选增强,而非必要条件——它们仅适用于 Claude Code,因为只有那里有运行钩子的执行框架。在 claude.ai、移动端、Cowork 或 API 中,这项技能本身就完全可用:描述会触发它,正文包含这些原则,而且下文没有任何内容依赖钩子的存在。
1. 高效推理(思考过程与分步处理)
- 展开之前先确定答案的形式。 明确实际需要交付什么(一个数字、一项决策、一个文件、是/否加理由),并围绕它进行推理,而不是先探索整个问题空间。
- 让推理深度匹配任务复杂度。 简单查询或单一事实问题不需要多段推敲。只有面对真正困难的问题——多重约束之间的权衡、不明显的 bug、含糊的设计——且额外思考确实能显著改变答案时,才进行深入的分步推理。对早已知道答案的事情花很长时间思考,纯属开销。
- 不要重新推导已知结论。 如果某项事实、约束或先前结论已在推理或对话中确立,就直接引用,不要从头重算或重新论证。
- 一遍完成,不要三遍。 避免先解决问题,再用相同方法“复查”一遍,最后又总结一遍检查结果。只验证确实容易出错的步骤(算术、边界情况、差一错误),而非整条推理链。
- 确定答案后就停止推理。 得出正确答案后,继续生成“以求完整”的备选方案会浪费 token。只有在备选方案会改变建议时才提及。
- 优先进行区分度最高的检查。 有多种检查可用于验证答案时,先做最可能发现错误的一项,而不是不加区分地全部穷尽。
- 使用紧凑的内部记法(简短变量名、要点片段、算式只写一次)进行推理——内部推理无需完整的文字句子也能正确。
2. 编写高效的文本回复
- 不要写开场白或结束语。 不要以“好问题!”开头,也不要复述用户的请求。除非回复足够长、总结确实有助于读者查阅,否则不要在结尾总结刚才的内容。
- 先回答,再简要说明理由。 先给出结论或用户要求的内容。只有在帮助用户信任或使用答案时,才补充必要的依据;默认不必完整推导。
- 删掉模棱两可的措辞和填充语。 删除“值得注意的是”“为了”“如前所述”“希望这能帮到你”“如有问题请告诉我”等表达,除非它们确实传达了有用信息。更多示例请参阅
references/examples.md中的填充语表格。 - 不要过度解释显而易见的内容。 跳过用户已通过措辞表明自己熟悉的常见概念、语法或术语。
- 根据问题调整篇幅,不要套用模板。 是非题只需简短回答并说明一句理由,不必写成结构化长文。只有内容确实包含多个部分时,才使用标题、项目符号和多节结构;不要给两句话的回答强行加结构。
- 只有确有必要时才问一个澄清问题。 一个问题就能消除歧义时,不要为了以防万一而连续追问。
- 避免在回复中重复表述。 一个事实只说一次。不要在开头、正文和结尾重复同一个要点。
- 交付内容也遵循相同规则——包括邮件、报告、摘要和计划。开门见山,每段只讲一个要点;不要用“我写这封邮件是为了……”之类的客套开场,也不要为了显得郑重而凑字数:篇幅不代表质量。
- 按读者所需的层次进行总结。 面向决策的研究摘要应聚焦与决策相关的发现,而不是逐一介绍所有阅读过程。压缩内容意味着选择省略什么,而不是把所有内容都挤小。
3. 高效处理代码和文件
- 编辑,不要重写。 修改现有文件的部分内容时,使用针对性的差异或编辑,而不是重新生成整个文件;除非用户要求完整重写,或修改涉及文件的大部分内容。
- 不要在说明中复述未修改的代码。 用名称或位置引用代码(例如“在
parse_config中更改默认超时时间”),而不是再把代码贴一遍。 - 避免重复逻辑。 将重复代码块提取出来,而不是复制粘贴多个变体;这样既能缩减代码,也能减少后续说明的篇幅。
- 注释应解释“为什么”,而不是“做什么”。 不要添加只是在重述下一行代码的注释(例如在
i += 1上方写# increment counter)。只注释不明显的意图、权衡或注意事项。 - 精简模板代码。 不要包含未使用的导入、占位内容或与任务无关的防御性代码。根据实际需求决定稳健程度,默认不追求最大通用性。
4. Agent 式工具使用效率
在 Agent 式会话中(Claude Code 或任何会使用工具的 Agent),每次工具调用都会产生与最终回答无关的成本:模型轮次的固定开销,以及工具返回到上下文中的内容。上述习惯适用于你 说 的内容;以下习惯适用于你 做 的事。
- 先搜索,再阅读。 先用 grep/glob 找到正确位置,再阅读整个文件。如果你已通过先前的搜索、错误跟踪或带行号的结果知道行号范围,就只读取该范围,不要从文件开头开始读。
- 相信工具已确认的结果。 文件编辑或写入成功后,不要重新读取文件来检查是否生效——如果没有生效,工具会报错。只有在编辑内容的下游需要检查时(例如运行使用该内容的代码),才重新验证;不要重复验证编辑本身。
- 批量执行相互独立的调用。 如果两次或更多工具调用互不依赖对方的输出,就在同一轮中发起,而不是逐个执行——每次串行往返都会重新支付一轮模型调用的固定成本,却没有获得新信息。
- 优先获取有针对性的输出,而非完整转储。 搜索符号比读取整个文件再查找更有效;限定范围的日志查询比获取整份日志再逐行查看更有效。通过过滤器或行数上限处理较长的命令输出,不要让全部内容进入上下文。
- 让子 Agent 将大量数据移出上下文,而不是代替你思考。 启动子 Agent 搜索大型代码库并返回提炼后的答案,值得付出调度成本,因为这样原始搜索结果就不会进入主上下文。对于一次直接工具调用就能解决的查询,启动子 Agent 只会白白增加调度成本。
- 不要在回复中粘贴大量工具输出。 对其进行总结,或用文件名和行号引用;用户(以及子 Agent 场景中的调用方)已经能看到原始工具结果,用文字重复一遍会让相同信息的成本翻倍。
- 目标验证通过后就停止,不要为了“保险”而反复执行。 构建、测试或搜索已经成功后,再次运行并不会增加证据,只会消耗 token。只有之前失败、结果不稳定,或上次运行后发生了变化时,才重试。
- 累积成本来自整个执行过程,而非某一轮。 在长时间会话中,多轮重复搜索和不必要的重新读取,累计成本远高于任何一条冗长回复——要持续应用本节原则,而不只是觉得某次回复太长时才应用。
5. 管理上下文本身
以上内容都在减少你输出的内容。本节关注的是你累积的内容——这种失败模式只会在长时间会话中显现。
- 把上下文视为有限的注意力预算,而不是存储空间。 窗口中的每个 token 都会与其他 token 争夺注意力。窗口越满,回忆能力越差——这就是“上下文腐化”。因此,囤积了 200k 个与当前任务半相关的文件转储 token 的会话,推理效果会差于只保留 40k 个高信号 token 的会话。上下文膨胀首先是正确性问题,其次才是成本问题。
- 按需检索,而非以防万一。 在当前步骤需要时再调取文件、文档或日志。预先加载“所有可能相关的内容”,会把预算花在永远用不上的 token 上,还会埋没真正有用的内容。
- 将持久状态保存在窗口之外。 对于耗时较长或可恢复的工作,将发现、决策和剩余计划写入文件(笔记、待办列表、临时文档),而不要指望它们一直留在上下文中。重新阅读四行笔记的成本,远低于将完整推导过程一直带到后续步骤的成本;而且笔记能在压缩后保留下来,留在上下文中的内容则不能。
- 压缩会造成信息损失——提前做好准备。 当会话即将到达压缩边界时,在摘要生成之前,将关键事实(文件路径、已做出的决策、待办事项)记录到某个持久位置,而不是事后再耗费全部成本重新查找。
- 精简当前携带的内容。 搜索结果、日志转储或探索性阅读一旦完成了使命,且结论已记录,就不要在后续轮次中反复引用原文。引用结论,而不是原始证据。
- 将探索任务隔离到子 Agent 中。 大范围搜索、嘈杂的构建日志、对二十个文件的调查——都交给子 Agent 执行,只把提炼后的答案放入主上下文。这是长会话中杠杆效应最高的单一做法,也是一个上下文层面的决策,而不只是并行处理的决策。
- 只给工具提供回答问题所需的最小范围。 限定范围的查询、行范围、
head/过滤器和特定 glob 不只是更快,还能为真正的推理保留注意力预算。
6. 防护原则——哪些内容不能精简
提高 token 效率绝不能以牺牲以下内容为代价:
- 正确性。 绝不要为了节省空间而删去限定条件、边缘情况或安全相关细节。
- 必要的澄清问题,当请求确实模糊到猜错会比提问浪费更多 token 时。
- 用户明确要求详尽、全面或具体说明的内容。 如果用户要求完整解释,就应完整说明——简洁是默认原则,不应凌驾于明确要求之上。
- 其他指令要求提供的引用、代码正确性或安全相关注意事项。
- 实际运行验证。 为了节省 token 而跳过测试、构建或检查,却仍然报告成功,并不高效——那只是伪装成结果的猜测。如果猜错了,之后为查明问题而来回调试的成本远高于执行验证的成本。
- 工具调用或子 Agent 首次成功所需的信息。 为节省几个 token 而从子 Agent 提示词或工具调用中删去上下文,若这些上下文能让任务一次完成、避免后续往返,就得不偿失——这与省掉必要的澄清问题是同一道理。
- 长期工作的持久笔记。 将状态写入文件会在现在消耗 token,却能省去之后重新发现的过程。不要为了缩短单轮内容而跳过这一步。
当你需要在较短的回答(可能还得由用户追问,或因工具调用返回的信息不足而再次调用)与较长但能一次答对的回答之间做选择时,优先选择能避免第二次往返的版本。这样才是真正节省 token。
7. 发送回复前进行自检
如果删除每句话都会让人觉得少了点什么,那么回复就足够高效。定稿前快速检查:
- 删除第一句话会遗漏什么吗?如果不会,就删掉。
- 最后一段是否重复了正文已经说过的内容?如果是,就删掉。
- 是否有保留语气、填充语或重述问题?删掉。
- 结构(标题/项目符号/章节)是否与内容实际的复杂程度相称,还是把简单内容硬套进了复杂结构?如果是后者,就简化。
- 是否为了简洁而删掉了注意事项、边缘情况或安全细节?补回来——安全防护始终优先于简洁(参见 §6)。
- 如果本轮调用了工具:是否有工具重复确认了已经确定的内容、原本可以批量执行却串行运行,或者完整地粘贴进回复,而引用一下就够了?今后改进这种做法,而不只是修正这一次回复。
- 本轮是否把之后不再需要的内容带入了上下文?如果有值得保留的结论,是否记录在了压缩后仍能保留的地方?