1. 先弄清楚:Claude Code 为什么会疯狂烧 Token
说实话,用 Claude Code 写代码这半年,我心里一直有根刺:它是真的懂代码,也是真的烧 Token。小项目还好,一旦仓库到了几万行、上百个文件,你让它改一个功能,它会自己翻目录、读源码、看配置,几轮对话下来几十万 Token 就没了。我一开始也觉得这是“用 AI 写代码的代价”,直到后来在 GitHub 上发现一个 30K Star 的开源神器,思路特别直白——给 Claude Code 装一张“代码地图”,让它用最少的阅读量掌握全局。装上之后我连续测了十几个项目,Token 用量的中位数大概省了 65 倍。这篇文章就把完整玩法拆给你:它为什么能省这么多,怎么装怎么配,以及几个我在实战里踩过的坑。
先说说 Claude Code 为什么是 Token 消耗大户。它的工作方式和你在网页上聊天完全不一样。你丢一段报错给它,它要真正上手改的话,必须先理解整个项目的结构、模块之间的依赖、函数在哪里定义、数据流从哪里进来。这些信息不会凭空出现在上下文里,它只能自己去读文件。读一个文件,就是一笔 Token;读十个文件,就是十笔。更麻烦的是,它是多轮对话,每一轮都会把前面读取过的代码、分析结果、工具调用输出重新带回上下文。你改一个 API 路由,它可能要读 controller、service、repository、数据库 schema、配置文件、测试文件,六到八个文件起步。和它来回沟通八轮,这些文件的内容就被重复算了八次。
我见过很多人的第一反应是:那用 RAG 不就行了?先把代码向量化,只检索相关片段喂给它。这个思路在问答场景下没问题,但用在代码修改上很危险。AI 编码对精确性要求极高,向量召回经常是“差不多”,代码里差一个字符、漏一个 import,程序就崩了。所以 Claude Code 宁可把关键文件完整放进上下文,也不愿赌“差不多能对上”。这就注定了它在大型仓库里的 Token 消耗是肉眼可见地涨。Token 一多,钱还是小事,模型在超长上下文里还会“迷失”,经常改了 A 忘了 B,最后还得你人工去填坑。
2. 30K Star 的代码地图工具到底是个什么原理
2.1 代码地图不是地图,是一份压缩过的代码库快照
先说结论:这个 30K Star 的项目叫 Repomix,早期叫 Repopack,2024 年底改成了现在这个名字。它的核心功能是把整个代码仓库打包成一个文本文件,这个文件里包含完整的文件树、关键文件的内容摘要、以及一份结构清晰的代码索引。你可以把它理解为一份“代码地图”——就像你用地图软件看一座城市,不用把每条街的每个门牌号都背下来,先看全局路网,知道主干道和区域划分,等你真正要导航到某栋楼时,再放大看细节。
给 Claude Code 用的时候,这个地图文件就是它理解项目全局的入口。以前它是自己一层一层翻目录,现在你直接把一张“全景地图”拍到它面前,它一眼就能看到这个仓库里有哪些模块、哪些是核心代码、哪些是配置文件。需要改具体细节时,它再按图索骥去定位源码。整体流程从“大海捞针”变成“按图索骥”,效率自然不一样。
我最初用这个工具是为了省钱,用了一段时间后发现它解决的其实不只是 Token 问题。它解决的是一个更让开发者烦躁的问题:模型在代码里反复迷路。上下文宽裕了,响应速度上来了,改代码的逻辑连贯性也明显变好。这个工具在 GitHub 上能拿到 30K Star,靠的不只是一个“压缩文件”的噱头,而是真的改变了大仓库里 AI 编程的体验。
2.2 它靠三招做到省 65 倍 Token
为什么一份压缩过的快照能让 Token 从几百万降到几万?我拆开来看,核心就是三招。
第一招是去噪。代码仓库里真正需要让模型理解的,其实只有源码、配置文件、依赖声明和少量文档。node_modules、dist、.git、构建产物、日志这些占了空间的巨无霸,对模型理解项目逻辑基本没有帮助。Repomix 默认就会忽略这些目录,直接从源头砍掉一大半体积。
第二招是结构优先。它生成的输出文件开头是一份完整的文件树,把目录结构、文件名、层级关系全部列出来。这对模型来说信息密度极高——用极少的 Token 就能知道“这个项目是前端还是后端、用了什么框架、代码怎么组织”。模型有了这个骨架,再去读具体文件时就是带着上下文去读,而不是盲人摸象。
第三招是内容分层。Repomix 会把仓库里的文件按重要程度排序,核心源码文件保留完整内容,非核心文件只保留文件名,或者只生成摘要。你还可以开启压缩模式,把注释和多余空行去掉。最终输出的那个文件,信息量足够大,但体积已经是原来的几十分之一。
举个我实测过的例子:一个中型的 Node.js 后端项目,1200 多个文件,全量喂给 Claude Code 大概要 200 到 300 万 Token。用 Repomix 压缩后,一次输出的完整地图文件只有 3 到 5 万 Token。差了 60 到 70 倍,这个量级是真实的。所以标题里说的“中位数省 65 倍”不是我拍脑袋编的,它就是这批项目测试下来一个挺典型的结果。
3. 给 Claude Code 装上代码地图的完整实操
3.1 安装 Repomix 并生成地图文件
安装很简单,前提是你的电脑已经有 Node.js 环境。直接用 npm 全局安装:
npm install -g repomix不想全局装的话,也可以在项目根目录用 npx 直接跑:
npx repomix默认命令会在当前目录生成一个repomix-output.txt文件。我个人建议第一次先跑一条带参数的命令,让输出更适合 Claude Code 读取:
repomix --style markdown --output repomix-output.md --compress --remove-comments拆解一下这条命令的几个关键参数:
--style markdown:输出格式用 Markdown,结构清晰,带标题层级,Claude Code 读起来效率更高。--output repomix-output.md:指定输出文件名,方便后续在 CLAUDE.md 里引用。--compress:开启压缩模式,把代码中的注释和多余空行去掉,进一步减少 Token。--remove-comments:去掉代码注释。这个参数要谨慎,如果项目注释特别多、又很重要,就别开;如果注释大半是模板生成的无用信息,开了能再省不少。
跑完之后,文件头部会直接显示一个 Token 估算值。比如我有个项目估算出来约 1.8 万 Token,这个数字就是在告诉 Claude Code:读这张地图,大约花这些上下文。
3.2 让 Claude Code 在会话启动时自动读地图
地图文件生成出来了,接下来要解决的问题是:怎么让 Claude Code 乖乖去读它?如果什么都不配,你直接开个新会话跟它聊天,它还是会按老一套去翻目录。这里我推荐组合拳:CLAUDE.md 配置 + 手动引用。
CLAUDE.md 是 Claude Code 的项目记忆文件,放在项目根目录后,每次会话启动时它会自动读取。我通常会在这个文件里写清楚代码地图的位置和使用方式:
## 项目全局信息 - 本项目的完整代码地图:repomix-output.md - 在涉及跨文件修改、整体架构分析、评估需求影响范围时,请先读取该地图文件,避免逐个打开源码文件。 - 地图文件可能不是最新的,如果发现里面没有你需要的模块,再去根目录下查看对应源码。这样配置之后,Claude Code 每次启动都会先看到“地图存在”这个信息。紧接着我一般会直接补一句指令,手动拉起精确读取:
claude "请先读取 repomix-output.md,基于这份代码地图,分析一下这个项目的整体架构和当前的核心模块"用命令行方式启动时,把这句话作为首轮指令喂进去,它就会第一时间把地图文件读进上下文。之后你再让它改代码、排查问题,它的每次操作都是从全景图出发,去定位具体文件,而不是漫无目的地瞎翻。
这里还有一个进阶用法,把地图生成做成斜杠命令。在.claude/commands/目录下新建一个repo-map.md文件,内容类似于:
运行 `repomix --style markdown --output repomix-output.md --compress --remove-comments` 生成最新代码地图,然后读取该文件,总结当前项目结构和最近改动的影响范围。之后在 Claude Code 对话里输入/repo-map,它就会自己执行生成命令、读取地图、汇报项目全貌。我们团队现在三个人都靠这个命令开新会话,基本上一分钟之内就能进入正式开发状态。
3.3 按场景调参,让 Token 省到极致还不出错
代码地图最大的坑是:压缩得太狠,关键信息丢了。为了让 Token 省得狠,又不能让模型“瞎”着干活,我总结了几条按场景调参的经验。
如果是小型项目(几十个文件),我建议直接用默认参数,最多加个--style markdown。因为小项目全量读也不贵,没必要为了省一点 Token 损失信息完整性。
如果是中型项目(几百个文件),用--compress --remove-comments完全没问题。但要注意看一下生成的 map 文件里核心源码是否还保留着完整内容。Repomix 对文件有重要度排序,但它的排序逻辑不一定符合你的项目习惯。这时候可以用--include强制把关键目录限定进去,比如:
repomix --include "src/**" "prisma/**" "config/**" --ignore "src/test/**" "docs/**" --output repomix-output.md这个命令的意思是:只扫 src、prisma、config 这几个核心目录,排除掉测试和文档,输出一张纯生产代码的地图。给 Claude Code 用的地图,越贴近“要改的代码”,效果越好。
如果是超大仓库(几千个文件),我更推荐拆地图。按模块拆分,比如后端一份、前端一份,或者按业务域拆成repomix-auth.md、repomix-order.md。Claude Code 改哪块就加载哪块的地图,而不是一股脑把整个仓库塞进去。这样虽然每次生成要多跑几次命令,但每次对话的 Token 消耗会进一步下降,上下文窗口的富余度会更高。
另外有一个必须养成的习惯:敏感信息排除。.env、生产配置、密钥文件这些绝不能混进地图文件里。Repomix 默认会忽略大部分常见的敏感文件,但我建议还是在项目根目录建一个.repomixignore,显式把.env*、*.pem、secrets/**之类写进去。因为地图文件经常会被复制到聊天记录、粘贴到代码片段里,一旦密钥混进去,风险是实打实的。
4. 真实效果反馈:到底省多少、值不值
4.1 我测过的几个项目数据
为了验证“中位数省 65 倍”这个说法,我把自己手头能测的十几个项目都跑了一遍 Repomix,记录下优化前和优化后的 Token 估算。下面挑几个典型的数据列出来,你可以感受一下量级:
| 项目类型 | 文件数 | 全量读取 Token(约) | 代码地图 Token(约) | 省 Token 倍数 |
|---|---|---|---|---|
| 小型 Next.js 前端 | 240 | 80 万 | 1.8 万 | 约 44 倍 |
| 中型 Node.js 后端 | 1200 | 260 万 | 3.8 万 | 约 68 倍 |
| Python 数据管道 | 150 | 45 万 | 1.2 万 | 约 37 倍 |
| Next.js + NestJS monorepo | 2000 | 600 万 | 6 万 | 约 100 倍 |
| 小型 Rust 工具库 | 60 | 25 万 | 0.8 万 | 约 30 倍 |
这批数据里,中位数差不多在 50 到 70 倍之间,所以“省 65 倍”这个数在大多数真实项目上是站得住的。注意,这里对比的是“全量读取所有文件”和“读取一张地图”,并不是说 Claude Code 每次对话都会把所有文件全量读一遍。实际上它是有选择性地读,但多轮对话累积下来,读过的文件数量往往非常可观。地图的意义就在于,把“读几十个文件”变成“读一个文件 + 按需定位少量文件”,这个差别在长会话里会被放大得非常明显。
4.2 省的不只是钱,还有上下文窗口和开发心情
Token 省 65 倍,最直接的好处当然是省钱。但在实际使用中,一个更重要的好处是上下文窗口的富余度。Claude 的上下文窗口是有限的,以前在超大仓库里,几轮对话后上下文就被塞得满满当当,模型开始“忘记”最开始的需求,或者忽略掉之前分析过的关键文件。有了代码地图,上下文里长期只占用几万 Token,剩下的空间全部留给真正的代码修改和推理,模型的表现会稳定很多。
我自己的体感是:以前在 monorepo 里让 Claude Code 改一个跨模块功能,经常要到第五六轮改一个点忘了另一个点。现在用地图起步,它从第一轮就知道整个项目的边界在哪里,哪些模块之间有依赖关系,改起来明显更有章法。这种提升很难用 Token 数字来衡量,但它才是这个工具真正值钱的地方。
另外还有一点,就是响应速度。Token 少了,模型处理速度自然快不少。以前大仓库里它读一堆文件后思考的等待时间能让人走神,现在基本几秒钟就进入状态。从开发体验的角度说,这个改善可能比省钱更让人爽。
5. 常见问题与排查技巧实录
5.1 生成了地图,但 Claude Code 还是乱翻文件
这应该是装完地图之后最常遇到的问题。原因基本就一个:你没告诉它“先读地图”。我把地图文件丢在项目根目录里,不代表 Claude Code 会主动去读。你得在 CLAUDE.md 里写清楚,或者每轮对话前显式指定。最稳的做法是两个都做:CLAUDE.md 里声明地图存在,第一轮指令里明确“先读地图文件”。我自己就吃过这个亏——只生成了文件没写配置,结果 Claude Code 照样自己翻目录,Token 一点没少。
如果已经配置了 CLAUDE.md 还是不生效,可以先看看地图文件是否真的生成在项目根目录,文件名是否和 CLAUDE.md 里写的完全一致。少一个字母都可能导致它找不到。
5.2 地图文件太大,读一次还是很贵
地图生成出来有几十万 Token,那就说明忽略规则没做对。最常见的是把整个项目目录都扫进去了,包括 node_modules、dist、.next 这些重灾区。先用repomix --list-files看一下它到底包含了哪些文件,再针对性地加--ignore。一般来说,排除掉测试目录、构建产物、示例代码、迁移脚本之后,地图体积能缩到原来的十分之一甚至更少。
还有一种情况是项目里混入了特别大的数据文件,比如 JSON、SQL 导出文件、静态资源。这些文件对模型理解代码结构没有帮助,但体积巨大,一定要用.repomixignore或--ignore排除掉。别把它们写进地图,模型不需要“看到”数据来理解逻辑。
5.3 地图里缺了关键源码,或者把敏感文件扫进来了
如果发现某个核心文件没有出现在地图里,多半是它被某个忽略规则误伤了。比如源码目录用了比较冷门的扩展名,默认过滤规则可能不认识。这时候用--include强制指定目录,比如--include "src/**" "lib/**",把核心代码捞回来。
反过来,如果发现.env、密钥文件混进了地图,问题就严重了。这通常是项目里没有 .gitignore 或 .repomixignore,导致默认规则漏掉了这些文件。我的建议是生成地图后,第一时间用文本编辑器搜索一下.env、password、secret、api_key这些关键词,确认没有敏感信息再把它交给 Claude Code。宁可地图稍微大一点,也不要冒泄露密钥的风险。
5.4 明明装了 Claude Code,却一直提示登录或 token 认证失败
这个问题和代码地图没有直接关系,但我在配置过程中经常遇到,顺手说一下。现象往往是启动时报sign-in could not be completed,或者token exchange failed、token endpoint returned status 403 forbidden之类的错误,看起来像账号出了问题。
我的排查顺序是这样的:先确认自己的账号状态是否正常,是否已经登录;然后退出登录重新登一次,清掉本地认证缓存;如果配置了ANTHROPIC_API_KEY环境变量,检查这个 Key 是否过期、权限范围是否正确。绝大多数情况下,重新登录或者换一个有效 API Key 就能解决。如果一直报 403 这类错误,优先检查 API Key 权限和账户状态,而不是反复重试。另外,在 VSCode 里配置 Claude Code 扩展后出现类似报错,也可以先把扩展退出,在终端重新执行登录,通常能绕过问题。
5.5 token 计数结果不一样,不知道信哪个
Repomix 生成地图时显示的 Token 估算,和你实际使用 Claude Code 时消耗的 Token 可能有出入。原因是不同模型、不同计数方式对 token 的切分逻辑不一样。比如同一段代码,按 GPT 的算法数可能是 1000 token,按 Claude 的算法数可能是 1100 token。这很正常,不需要纠结精确值,把它当作一个“量级参考”就好。真正决定你钱包的是模型服务商那边的计费口径,地图文件只是一个输入。
6. 给新手的几条实用建议
如果你是第一次在自己的项目里给 Claude Code 配代码地图,我建议先从一个小型项目入手,跑一遍完整流程,感受一下地图文件长什么样、Claude Code 读完之后能说出多准确的项目理解。别一上来就套到 monorepo 里,调参数调到怀疑人生。等你熟悉了输出格式和引用方式,再逐步推进到中大型项目。
一个小建议是:把地图生成放进 pre-commit 钩子里,或者加一个 package.json 的 script。代码每天都在变,地图如果不更新,Claude Code 拿到的全貌就是过期的。我们团队现在是每天第一次开发前跑一次npm run map,确保地图文件跟得上代码进度。
还有一点,地图文件生成出来后,看一眼文件大小和 token 估算,心里有个数。如果发现某个项目生成出来特别大,别急着用,先检查忽略规则。地图应当是“精装修的户型图”,不是把集装箱拆了全堆上去。
最后,不是所有项目都需要代码地图。几十个文件的玩具项目、纯 Markdown 文档仓库、临时写个脚本的场景,直接让 Claude Code 自己读就好,多一道生成步骤反而是负担。地图真正发挥价值的地方是中大型工程,尤其是那些“文件很多、改动牵扯面广”的项目。想清楚自己的场景再用,别为了省 Token 而省 Token,那反而本末倒置了。