欢迎来到 基于 CC 的外挂 RAG 实战教程。
你正在使用的 Claude Code (CC) 本质上是一个运行在终端里的代码智能体(Coding Agent)。它不同于网页版的 Claude.ai —— 它能读写你的本地文件、运行终端命令、甚至提交 Git。
但是,当你试图让它接手一个庞大的遗留项目,或者让它基于公司内部未公开的框架写代码时,你会撞上“认知墙”:
ls 能列出的文件,而且一旦项目超过几百个文件,它无法全量阅读。本章将带你构建一个“外挂大脑”。 所谓的“外挂(Sidecar)”,是指我们不修改 CC 的内核,不把所有文档一次性写死在 Prompt 里,而是搭建一个旁路服务。 当 CC 觉得“这一题超纲了”或者“我需要查阅 Payment 模块的定义”时,它会像通过对讲机呼叫总部一样,调用你的服务,获取精准的情报。
本章目标:
在工程实践中,我们遵循 “上下文经济学(Context Economics)”:
| 方案 | 描述 | 缺点 | 适用场景 |
|---|---|---|---|
| 全量上下文 (Context Stuffing) | 把所有文档/代码 cat 进对话 |
贵、慢、干扰推理、有物理上限 | 小型脚本、单文件修改 |
| 微调 (Fine-tuning) | 拿私有代码重新训练模型 | 极其昂贵、更新极慢(无法反映昨天的 commit)、丧失通用能力 | 行业垂直大模型 |
| 外挂 RAG (External RAG) | 按需检索,动态注入 | 需要开发额外的工程组件 | 中大型项目、企业级知识库 |
Rule of Thumb #1: 动态加载原则
CC 的上下文窗口是 RAM(内存),你的 RAG 是 SSD(硬盘)。 永远不要试图把硬盘里的东西全塞进内存。只有当前正在运行“进程”(用户的具体问题)所需的数据,才会被调入内存。
这是一个代码智能体(Agent)特有的 RAG 流程,它比传统的“一问一答”更复杂,因为包含工具调用(Tool Use)。
请仔细阅读下方的 ASCII 流程图,这将是你后续开发的心智地图:
[User Terminal] [Your Local/Remote Server]
|
v
+---------------------------+ +----------------------------------+
| Claude Code (CC) | | External RAG System |
|---------------------------| |----------------------------------|
| 1. 用户指令: | | |
| "怎么用内部的 Auth 库?" | | |
| | | |
| 2. 思考 (Chain of Thought)| | |
| "我没在当前目录看到 Auth, | | |
| 我需要检索知识库..." | | |
| | | |
| 3. 构造工具调用 (Action) |------> | 4. 接收请求 (Receive) |
| tool: `search_docs` | JSON | Query: "internal Auth lib" |
| query: "internal Auth lib"| HTTP/ | Filters: {tag: "backend"} |
| | CMD | |
| | | 5. 检索与召回 (Retrieve) |
| | | Vector Search (Embedding) |
| | | + Keyword Search (BM25) |
| | | --> 得到 Top-50 片段 |
| | | |
| | | 6. 重排 (Rerank) |
| | | 根据相关性打分,去重 |
| | | --> 留下 Top-5 精华片段 |
| | | |
| | | 7. 组装 (Pack Context) |
| 8. 接收工具返回 (Observation)<----| 格式化为 XML/Markdown |
| "Found 5 relevant chunks: | | Metadata: [File: auth.md] |
| 1. Auth.login()..." | | |
+---------------------------+ +----------------------------------+
|
v
| 9. 最终生成 (Synthesis) |
| "根据文档,你应该使用 |
| Auth.login(token)..." |
+---------------------------+
关键环节解析:
mcp-server 或一个 CLI 命令)。要实现上述流程,你需要构建以下四个模块。这也是本教程将带你逐一实现的内容:
.ts 或 .java 文件切分成有意义的块?如何处理 .pdf 设计文档?如何忽略 node_modules?getUserByID,向量检索对此可能不敏感。在进入具体实现前,请记住这些指导原则:
file_path 或 url。这不仅是为了让 CC 知道来源,更是为了让 CC 生成的答能附带“点击跳转”的链接,方便你人工核查。Q1. 在基于 CC 的开发流中,“外挂 RAG”与“将文件直接拖入对话框”相比,最核心的架构区别是什么?
Q2. 下列哪种数据最不适合存入外挂 RAG 系统?
Q3. 为什么我们在数据流中强调“重排 (Rerank)”这一步?直接用向量检索出来的 Top-5 不行吗?
Q4. (场景模拟) 你正在使用 CC 修改一个 Python 项目。CC 决定调用 RAG 工具查询 process_order 函数。
src/v1/order.py (废弃代码) 中的定义。src/v2/order.py (最新代码) 中的定义。Q5. (系统边界) CC 本身可以执行 grep 或 find 命令。既然它可以自己去文件系统里搜,为什么我们还要费力气做一个向量化的外挂 RAG?
grep "authentication" 和 query "how to handle login errors" 的区别。Q6. (数据一致性) 你刚刚修改了本地的一个 utils.py 文件,加了一个新函数。此时你问 CC 怎么用这个新函数。RAG 系统会发生什么?如何解决?
docs/api.md,但你打开文件发现根本没有这段话。<citation file="docs/api.md"> content </citation>,并在 System Prompt 中严厉禁止编造 <citation> 标签之外的内容。GodClass.java。下一章预告: 我们将深入 CC 的“大脑皮层”,分析它到底支持哪些扩展接口。是把它做成一个 CLI 工具?还是 MCP 服务?我们将在第 2 章确定你的 RAG 在 CC 生态中的具体落脚点。