
1. 当 Claude Code 把向量库踢出局RAG 在本地开发里到底还剩下什么先说结论RAG 没死死的是「代码搜索必须靠 embedding 预索引」这个默认假设。Claude Code 和 Codex 在架构上撞了车——都不搞向量数据库都让模型自己用命令行搜代码。这不是巧合是本地项目规模下算账算出来的结果。Claude Code 是什么一个跑在终端里的 AI 编程 Agent能读文件、搜代码、改代码、跑命令。它适合谁适合在本地仓库里干活的后端、前端、全栈开发者尤其是那种「项目不大但文件几千个、不想维护索引服务」的场景。它最反直觉的地方在于整个代码库里没有 embedding、没有 vector、没有 similarity search核心检索工具就是 ripgrep 驱动的 GrepTool 和 GlobTool。那 RAG 呢RAG检索增强生成在自然语言问答里依然是刚需——概念可以有十几种表达词汇不匹配是常态embedding 的软语义匹配这时候无可替代。但代码搜索的关键词 95% 是标识符类名、方法名、变量名。getUserById就是getUserById不会被改述成fetchPersonByIdentifier。精确匹配恰好是最直接的检索方式。所以这篇要拆的是两件事Claude Code 的命令行架构为什么在代码搜索上干过 embedding 预索引以及怎么在 TaoToken 统一 Key/API 通道下把它跑通一次完整的检索增强对话。我会给出可复制的settings.json和 Base URL 配置片段再给 401 和 local proxy failed 的排查动作。你跟着做能在本地环境里跑通一次「模型驱动 grep → 读文件 → 回答」的完整链路。我试过在 4000 文件的项目里用这套流程找一个跨模块的 bug从提问到定位到具体行大概 40 秒中间模型自己发起了 6 次 grep 和 3 次文件读取。这个体感比等索引构建快得多。2. TaoToken 前置统一 Key 与 API 通道怎么准备在拆架构之前得先把接入通道说清楚。Claude Code 默认走 Anthropic 官方 API但本地开发经常需要统一管理 Key、切换模型、看调用量。TaoToken 在这里的角色是一个统一的 API 通道你拿一个 Key配一个 Base URL就能在 Claude Code、Cline、Codex 这些工具里复用同一套凭证。先明确三个东西后面配置里反复出现Base URLhttps://taotoken.net/api注意API 地址不带 UTM 参数直接写这个API Key在 console 里创建格式类似sk-开头的一串Model IDClaude Code 场景下用 Anthropic 兼容的模型标识比如claude-sonnet-4-5这类拿 Key 的路径进 consolehttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite在 API Keys 页面点创建复制出来。这个 Key 只显示一次丢了就重建。这里有个坑要先说Claude Code 走的是 Anthropic 的 Messages API 协议不是 OpenAI 的 chat/completions。所以 Base URL 的拼接方式和你配 Cline 时不一样。Cline 那种 OpenAI 兼容的写法是https://taotoken.net/api/v1但 Claude Code 需要的是 Anthropic 风格的 endpoint通常是https://taotoken.net/api加上它自己拼/v1/messages。这个区别直接决定了你后面会不会遇到 404 或者 401。注意不要把 TaoToken 理解成某种「中转」或者「代理」。它是一个正常的 API 服务通道你用它提供的 Key 和 Base URL 调用模型和调用任何云服务 API 是一回事。配置里出现的ANTHROPIC_BASE_URL只是 Claude Code 读取环境变量的名字不代表底层协议被改写。准备阶段你还需要确认本地有 Node.js 环境Claude Code 是 npm 包以及 ripgrep 可用。macOS 上brew install ripgrepUbuntu 上apt install ripgrepWindows 上用 scoop 或者直接下二进制。Claude Code 内部会调 ripgrep但你自己在终端里也装一个方便对照验证搜索结果。最后把 Key 存到环境变量里别硬编码进配置文件。后面settings.json里我会用env字段引用但更稳的做法是 shell 里 export。两种方式我都会给。3. 可复制配置settings.json 与 Base URL 完整片段这一节是核心直接给能抄的配置。Claude Code 的配置文件默认在~/.claude/settings.json项目级配置可以放在项目根目录的.claude/settings.json。我建议先用用户级配置跑通再按项目覆盖。先看完整的settings.json{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的Key粘贴在这里, ANTHROPIC_MODEL: claude-sonnet-4-5, ANTHROPIC_SMALL_FAST_MODEL: claude-haiku-4-5 }, permissions: { allow: [ Grep, Glob, Read, Bash(rg:*), Bash(git:*) ], deny: [] }, includeCoAuthoredBy: false }逐字段说。ANTHROPIC_BASE_URL指向 TaoToken 的 API 地址注意结尾没有斜杠Claude Code 会自己拼/v1/messages。ANTHROPIC_API_KEY填你在 console 创建的 Key。ANTHROPIC_MODEL是主模型负责推理和工具调用决策ANTHROPIC_SMALL_FAST_MODEL是轻量模型用于一些快速判断场景比如决定要不要继续搜。permissions.allow里我显式放开了 Grep、Glob、Read 和rg、git命令。Claude Code 默认会弹权限确认跑通阶段先放开这几个减少打断。生产环境你可以收紧只留 Read 和 Grep。如果你不想把 Key 写进 JSON用环境变量方式export ANTHROPIC_BASE_URLhttps://taotoken.net/api export ANTHROPIC_API_KEYsk-你的Key export ANTHROPIC_MODELclaude-sonnet-4-5然后settings.json里只留permissions和includeCoAuthoredBy。Claude Code 会优先读环境变量。再给一个项目级的.claude/settings.json用于覆盖模型或者加项目专属权限{ env: { ANTHROPIC_MODEL: claude-sonnet-4-5 }, permissions: { allow: [ Grep, Glob, Read, Bash(rg:*) ] } }项目级配置会 merge 用户级同名字段项目级优先。这样你可以全局用一套 Key不同项目用不同模型。配完之后验证配置有没有被读到claude config list这个命令会打印当前生效的配置项。如果ANTHROPIC_BASE_URL显示的是https://taotoken.net/api说明读到了。如果显示的是默认的https://api.anthropic.com说明你的settings.json路径不对或者 JSON 格式有错。提示JSON 里不能有注释不能有尾逗号。很多人 401 不是 Key 的问题是 JSON 解析失败导致整个配置被忽略然后 fallback 到默认 endpoint自然认证不过。配置阶段还有一个容易忽略的点Claude Code 启动时会读~/.claude.json这个文件存会话状态但它不存 API 配置。API 配置只认settings.json和环境变量。别把 Key 写到~/.claude.json里没用。4. 验证请求跑通一次完整的检索增强对话配置好了现在跑一次完整链路。目标让 Claude Code 在一个真实项目里通过 grep 搜索定位一个函数读文件然后回答一个问题。先进入一个测试项目目录随便找个有几十个文件的仓库。启动claude进入交互界面后输入一个需要检索才能回答的问题比如帮我找到处理用户登录校验的函数说明它做了哪些检查这时候观察 Claude Code 的行为。它不会直接回答而是先发起工具调用。你会看到类似这样的输出Grep(patternlogin|auth|validate, output_modefiles_with_matches)注意output_mode是files_with_matches这是 GrepTool 的默认模式——只返回文件名不返回代码内容。这是故意的防止一次搜索把 context 塞满。模型拿到文件名列表后自己判断哪些值得深入再发起第二次调用Grep(patternfunction.*validate.*login, output_modecontent, -A5)这次返回匹配行和上下文。然后它可能再调Read读具体文件的某几行。整个循环是模型驱动的搜什么、用什么模式、要不要继续全靠运行时判断没有预设流程。底层实际执行的是 ripgrep。你可以自己在终端对照rg login|auth|validate --files-with-matchesripgrep 的五层过滤在这里体现得很明显先用.gitignore跳过node_modules、dist这些目录再用 path 参数限定范围再用 glob 过滤文件类型再跳过二进制文件最后才搜内容。一个 4000 文件的项目限定到src/目录后可能只剩几百个文件再按.ts过滤实际搜索的文件数可能就几十个。验证成功的标志模型在几轮工具调用后给出一个具体答案并且引用了它读过的文件路径和行号。如果它直接回答而没有发起任何 Grep 调用说明工具权限没放开或者模型没被正确配置。再验证一次 API 通道是否真的走通了。开一个新终端直接 curlcurl -X POST https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的Key \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-5, max_tokens: 100, messages: [{role: user, content: 说一句你好}] }如果返回 JSON 里有content字段和正常的文本说明 Key 和 Base URL 都对。如果返回 401看下一节。5. 常见错排查401、local proxy failed、reading choices、OAuth这一节对照真实报错给动作。这几个错误在 Claude Code 接入第三方 API 通道时高频出现。401 Unauthorized最常见。原因通常有三个Key 错了、Key 没被读到、Base URL 拼错导致请求发到了错误的地方。先确认 Key 有没有被读到claude config list | grep -i key如果显示的是空或者默认值说明settings.json没生效。检查 JSON 格式cat ~/.claude/settings.json | python3 -m json.tooljson.tool会报语法错误的位置。修好格式再试。如果 Key 读到了但还是 401用 curl 直接测curl -X POST https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的Key \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d {model:claude-sonnet-4-5,max_tokens:10,messages:[{role:user,content:hi}]}curl 也 401那就是 Key 本身的问题去 console 重新创建一个。curl 成功但 Claude Code 401那就是 Claude Code 读的配置和你以为的不一样检查是不是有项目级.claude/settings.json覆盖了。local proxy failed这个报错通常出现在你本地有 HTTP 代理设置但代理不可用或者不支持 HTTPS 隧道。Claude Code 底层用 Node 的 fetch会读HTTP_PROXY/HTTPS_PROXY环境变量。先看当前环境env | grep -i proxy如果有值而且你不需要代理直接 unsetunset HTTP_PROXY HTTPS_PROXY http_proxy https_proxy然后重启 Claude Code。如果确实需要代理才能访问外网那要确保代理支持 CONNECT 方法。但更简单的做法是TaoToken 的 API 地址在正常网络环境下可以直接访问不需要额外代理配置。把代理环境变量清掉问题通常就消失了。reading choices 相关报错这个报错一般出现在响应格式不符合预期时比如返回的不是标准的 Messages API 结构。常见原因是 Base URL 拼成了 OpenAI 兼容的/v1/chat/completions路径但 Claude Code 发的是 Anthropic 格式的请求两边对不上。检查你的ANTHROPIC_BASE_URL是不是https://taotoken.net/api结尾不要加/v1也不要加/v1/messages。Claude Code 会自己拼。如果你写成了https://taotoken.net/api/v1最终请求会变成https://taotoken.net/api/v1/v1/messages路径重复返回 404 或者非预期结构。OAuth 相关报错Claude Code 某些版本会尝试 OAuth 登录流程如果你用的是 API Key 模式不需要走 OAuth。报错里出现oauth字样通常是它没读到ANTHROPIC_API_KEY于是 fallback 到了登录流程。确认settings.json里env.ANTHROPIC_API_KEY有值或者 shell 里 export 了。然后检查有没有ANTHROPIC_AUTH_TOKEN这个变量干扰——有些教程会让你设这个但 Claude Code 优先认ANTHROPIC_API_KEY。两个都设且值不一样时行为可能不确定。只留ANTHROPIC_API_KEY。三件套检查清单不管你用 Claude Code、Cline 还是 Codex接入任何 API 通道都检查这三样项目Claude CodeClineCodexBase URLhttps://taotoken.net/apihttps://taotoken.net/api/v1https://taotoken.net/api/v1Key 字段ANTHROPIC_API_KEYAPI Key 输入框OPENAI_API_KEYModel IDclaude-sonnet-4-5claude-sonnet-4-5gpt-5等Codex 的auth.json在~/.codex/auth.json里面填OPENAI_API_KEY和base_url。Cline 在 VSCode 设置里填 Base URL 和 Key。Claude Code 就是上面那套settings.json。三个工具的 Base URL 写法不同别混用。6. 架构拆解之后什么时候该用 grep什么时候该上向量库回到标题那个问题。Claude Code 不搞向量库是因为在本地项目规模上LLM 驱动 ripgrep 这笔账算得过来。零索引、零维护、零启动延迟代价是更多的搜索轮次和更大的 context 开销。4000 个文件的项目ripgrep 搜一次 0.1 秒模型多搜几轮也就几秒。但如果你维护一个索引服务构建索引、同步更新、处理 embedding 漂移这些工程成本在本地开发场景里不划算。但这不意味着向量库没用。切到自然语言问答grep 就抓瞎了。概念可以有十几种表达用户问「怎么处理并发冲突」代码里可能写的是mutex、lock、race condition、atomic词汇不匹配是常态。这种软语义场景embedding 和向量检索还是扔不掉。大型代码仓库几万到几十万文件也是grep 的暴力扫描虽然快但候选集太大时语义预过滤能显著缩小范围。所以判断标准是数据特性和规模不是信仰。代码搜索、标识符匹配、本地中小项目——grep 优先。自然语言问答、概念检索、大型仓库——向量库有价值。Claude Code 和 Codex 选了前者是因为它们的场景就是本地开发不是通用问答。你现在就可以动手按第 3 节配好settings.json按第 4 节跑一次检索对话遇到报错按第 5 节排查。跑通之后你会对「模型驱动搜索」这件事有体感——它不是把 RAG 干掉而是把 RAG 用在了它真正该用的地方。需要 Key 的去 console 创建接入文档在 doc 页面长期跑编码任务可以看 Coding Plan。模型对话入口可以用来单独验证模型是否正常响应。