40%
Token节省
16+
支持语言
100万+
代码行支持
MCP
协议支持
一、项目概述
1.1 核心定位
Claude-Context 是一个为 AI 编码助手(如 Claude Code、OpenAI Codex)提供语义代码搜索能力的 MCP(Model Context Protocol) 插件。它的核心价值在于:将整个代码库转化为可检索的语义向量库,让 AI Agent 能够通过自然语言查询精准定位相关代码。
1.2 与原生方案的对比
| 维度 | Claude Code 原生(grep) | Claude Context(混合检索) |
|---|---|---|
| 信息过载 | ❌ 99%为无关噪音 | ✅ 精准召回相关代码 |
| 语义理解 | ❌ 仅匹配关键词 | ✅ 理解代码功能 |
| 上下文 | ❌ 仅返回匹配行 | ✅ 完整函数/类定义 |
| 索引更新 | ❌ 需完整重读 | ✅ Merkle增量索引 |
| 多轮探索 | ❌ 需要多次尝试 | ✅ 一次精准定位 |
💡 核心洞察
Claude-Context 通过 AST 分块 + 混合检索 的组合,解决了传统 grep 方案的三大痛点:信息过载、语义盲目、上下文失忆。
二、技术架构
2.1 整体架构
┌─────────────────────────────────────────────────────────────┐
│ Claude Context 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 用户CLI ─────▶ Claude Code / Codex / Gemini │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ MCP Server │ │
│ │ (zilliz/claude- │ │
│ │ context-mcp) │ │
│ └────────┬────────────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ File │─────▶│Indexing │─────▶│Searching│ │
│ │ Scanner │ │ Engine │ │ Engine │ │
│ └─────────┘ └────┬────┘ └────┬────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────────────────────┐ │
│ │ Hybrid Search │ │
│ │ ┌───────────┐ ┌───────────┐ │ │
│ │ │ BM25 │+│ Vector │ │ │
│ │ │ (关键词) │ │ (语义) │ │ │
│ │ └───────────┘ └───────────┘ │ │
│ └──────────────┬────────────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────────────────────┐ │
│ │ Milvus / Zilliz Cloud │ │
│ │ (向量数据库) │ │
│ └────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2.2 核心组件
| 组件 | 功能 | 说明 |
|---|---|---|
| @zilliz/claude-context-core | 核心引擎 | 索引、向量嵌入、语义搜索 |
| @zilliz/claude-context-mcp | MCP服务器 | 提供4个核心工具接口 |
| VSCode Extension | IDE集成 | 语义代码搜索扩展 |
2.3 MCP 工具接口
| 工具名 | 功能 |
|---|---|
index_codebase |
索引代码库目录(BM25 + 向量) |
search_code |
自然语言语义搜索 |
clear_index |
清除索引 |
get_indexing_status |
获取索引状态 |
三、AST分块技术
3.1 AST vs 普通文本分块
普通文本分块的问题:
- 按行/字符切分,函数被切碎
- 上下文丢失,定义和调用被分开
- 向量表示不准确
AST 语义分块的优势:
- 每个 Chunk = 完整的语义单元(函数/类)
- 函数/类边界保持完整
- 向量表示更准确,检索质量更高
3.2 Tree-sitter 实现原理
// 可分割节点类型定义
const SPLITTABLE_NODE_TYPES = {
javascript: [
'function_declaration', // 函数声明
'arrow_function', // 箭头函数
'class_declaration', // 类声明
'method_definition', // 方法定义
'export_statement' // 导出语句
],
typescript: [
'function_declaration',
'arrow_function',
'class_declaration',
'method_definition',
'export_statement',
'interface_declaration', // 接口声明
'type_alias_declaration' // 类型别名
],
python: [
'function_definition', // Python函数
'class_definition', // Python类
'decorated_definition' // 装饰器函数
],
// ... 更多语言
};
3.3 分块流程
1️⃣ 代码输入
│
▼
2️⃣ 语言检测 ──▶ 不支持AST? ──▶ LangChain字符分块(兜底)
│
▼
3️⃣ Tree-sitter 解析
│
├──▶ JavaScript ──▶ tree-sitter-javascript
├──▶ TypeScript ──▶ tree-sitter-typescript
├──▶ Python ──────▶ tree-sitter-python
└──▶ ...
│
▼
4️⃣ 遍历 AST 节点,提取函数/类/方法边界
│
▼
5️⃣ Chunk 验证与优化
│
├──▶ 大小检查(chunkSize: 2500 tokens)
├──▶ 过大 ──▶ 语句级子分割
└──▶ 过小 ──▶ 合并相邻节点
│
▼
6️⃣ 输出 CodeChunk[]
3.4 多语言支持
| 语言 | Parser | 可分割节点类型数 |
|---|---|---|
| TypeScript | tree-sitter-typescript | 7种 |
| JavaScript | tree-sitter-javascript | 5种 |
| Python | tree-sitter-python | 3种 |
| Java | tree-sitter-java | 3种 |
| C++ | tree-sitter-cpp | 3种 |
| Go | tree-sitter-go | 3种 |
| Rust | tree-sitter-rust | 3种 |
四、混合检索机制
4.1 为什么需要混合检索?
| 检索类型 | 优势 | 劣势 |
|---|---|---|
| BM25 关键词 | 精确匹配函数名/变量名 | 无法理解语义 |
| 向量语义 | 理解代码意图 | 对精确关键词不敏感 |
| 混合检索 | 平衡精确与语义,RRF融合无参数自适应 | |
4.2 Reciprocal Rank Fusion (RRF) 算法
RRF 是一种无参数的排名融合算法:
// 公式
RRF_score(doc) = Σ(1 / (k + rank(doc)))
// 其中 k 是一个常量(通常为60)
// 示例
BM25_ranks = {'auth.py': 1, 'login.ts': 2, 'verify.rs': 3}
Vector_ranks = {'auth.py': 2, 'login.ts': 1, 'jwt.rs': 3}
def rrf_score(rank):
return 1 / (60 + rank)
# 最终得分
auth.py: rrf_score(1) + rrf_score(2) # 0.0321
login.ts: rrf_score(2) + rrf_score(1) # 0.0321
verify.rs: rrf_score(3) + 0 # 0.0159
jwt.rs: 0 + rrf_score(3) # 0.0159
💡 技术洞察
RRF 的优势在于无需调参,自适应平衡两种检索方式的结果,适合生产环境使用。
五、增量索引(Merkle Tree)
5.1 为什么需要增量索引?
大型代码库的完整重索引成本极高。100万行代码、5000个文件的完整索引可能需要10-30分钟,但用户每次修改可能只涉及1-2个文件。
5.2 Merkle Tree 原理
Root Hash
│
┌───────────────────┼───────────────────┐
│ │ │
Dir A Hash Dir B Hash Dir C Hash
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ │ │ │ │ │
File1 File2 File3 File4 File5 File6
Hash Hash Hash Hash Hash Hash
修改 File B 后:
- File A → Hash A1 (未变)
- File B → Hash B2 (新内容)
- 只重新索引 File B
- 索引时间:10分钟 → 10秒
5.3 增量更新优势
95%+
典型重索引节省
10x
索引速度提升
60%
API成本降低
六、Token优化原理
6.1 40% Token 节省的来源
| 优化手段 | 效果 | 原理 |
|---|---|---|
| AST 分块 | 减少 60-80% | 只返回完整函数,不返回整个文件 |
| 语义检索 | 减少 40-60% | 精准匹配意图,避免无关内容 |
| BM25 关键词 | 减少 20-30% | 精确匹配减少语义漂移 |
| 增量索引 | 减少 50-70% | 避免重复读取未变更文件 |
| 上下文压缩 | 减少 15-25% | 只保留关键代码行 |
6.2 对比示例
场景:搜索"用户认证处理函数"
┌────────────────────────────────────────────────────────┐
│ 传统方案(grep + 全文件读取) │
│ │
│ 1. grep "auth" → 返回 50 个文件 │
│ 2. 逐个读取 → 每个文件平均 500 行 │
│ 3. 上下文注入 → 25,000 tokens │
│ 4. 实际相关内容 → 3,000 tokens (12%) │
│ │
│ ❌ 浪费 22,000 tokens (88%) │
└────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────┐
│ Claude Context 方案(混合检索 + AST 分块) │
│ │
│ 1. 自然语言查询 → "handle user authentication" │
│ 2. 混合检索 → 精准定位 3 个相关函数 │
│ 3. 仅返回相关 chunks → 1,500 tokens │
│ 4. 实际相关内容 → 1,400 tokens (93%) │
│ │
│ ✅ 节省 23,500 tokens (94%) │
└────────────────────────────────────────────────────────┘
七、MCP生态集成
7.1 支持的 AI 编码助手
| 工具 | 集成方式 | 状态 |
|---|---|---|
| Claude Code | MCP | ✅ 官方推荐 |
| OpenAI Codex CLI | MCP | ✅ 支持 |
| Gemini CLI | MCP | ✅ 支持 |
| Cursor | MCP | ✅ 支持 |
| VS Code | MCP | ✅ 支持 |
| Windsurf | MCP | ✅ 支持 |
| Cline | MCP | ✅ 支持 |
| Augment Code | MCP | ✅ 支持 |
7.2 Claude Code 集成示例
# 1. 添加 MCP 服务器
claude mcp add claude-context \
-e OPENAI_API_KEY=sk-your-key \
-e MILVUS_ADDRESS=https://your-cluster.api.zillizcloud.com \
-e MILVUS_TOKEN=your-token -- \
npx @zilliz/claude-context-mcp@latest
# 2. 在项目中索引代码库
cd your-project
claude
# 3. 索引命令
Index this codebase
# 4. 检查状态
Check the indexing status
# 5. 语义搜索
Find functions that handle user authentication
八、关键洞察与启示
8.1 可迁移的技术
洞察 1:AST 分块是代码理解的基石
可迁移价值:⭐⭐⭐⭐⭐
当前问题:
- 我们的代码检索使用简单文本匹配
- 无法理解代码结构
- 搜索结果不精准
改进方向:
- 引入 tree-sitter AST 解析
- 按函数/类/方法边界分块
- 支持多语言(TypeScript, Python 优先)
洞察 2:混合检索是平衡精确与语义的黄金组合
可迁移价值:⭐⭐⭐⭐⭐
原理:
- BM25 → 精确关键词匹配(函数名、变量名)
- 向量检索 → 语义理解(功能意图)
- RRF 融合 → 无参数自适应平衡
实现建议:
- 使用 FlexSearch/BM25 做关键词
- 使用 text-embedding-3-small 向量化
- 自定义 RRF 融合算法
洞察 3:Merkle Tree 增量索引对大型项目至关重要
可迁移价值:⭐⭐⭐⭐
场景:
- 用户项目可能有数千个文件
- 每次操作都完整重索引不现实
- 需要智能检测变更文件
8.2 与 OpenClaw/一人公司 SOP 的关联
| Claude-Context 特性 | OpenClaw 关联点 | 应用建议 |
|---|---|---|
| AST 分块 | 代码理解深度 | 提升代码分析质量 |
| 增量索引 | 快速响应 | 减少重复计算 |
| Token 优化 | 成本控制 | 降低 API 消耗 |
| MCP 集成 | 工具生态 | 扩展 Agent 能力 |
| 混合检索 | 精准召回 | 提升搜索质量 |
8.3 整合到 agent-browser 的可能性
方案 A:嵌入式代码索引
- 在 agent-browser 中集成 @zilliz/claude-context-core
- 用户访问代码仓库时自动索引
- 使用混合检索快速定位相关代码
方案 B:MCP 服务模式
- 单独部署 Claude Context MCP Server
- agent-browser 通过 MCP 协议调用
- 共享向量数据库
方案 C:混合模式(推荐)
- 轻量级:内置基础 AST 分块
- 完整版:调用 MCP Server 获取完整能力
- 用户可选,根据需求平衡
九、可复用技术模式
9.1 代码分块模式
// 伪代码:可复用的 AST 分块器
class CodeChunker {
private splitters: Map<string, Splitter>;
async chunk(code: string, language: string): Promise<CodeChunk[]> {
const splitter = this.splitters.get(language);
if (splitter) {
return splitter.split(code);
}
// 兜底:字符级分块
return this.characterSplitter.split(code);
}
}
9.2 混合检索模式
// 伪代码:可复用的混合检索
class HybridSearch {
async search(query: string, chunks: CodeChunk[]): Promise<SearchResult[]> {
// 1. BM25 关键词检索
const bm25Results = this.bm25.search(query, chunks);
// 2. 向量语义检索
const queryEmbedding = await this.embedder.embed(query);
const vectorResults = this.vectorIndex.search(queryEmbedding, chunks);
// 3. RRF 融合
return this.rrfFuser.fuse(bm25Results, vectorResults);
}
}
9.3 增量索引模式
// 伪代码:可复用的增量索引
class IncrementalIndexer {
async indexChanges(files: FileChange[]): Promise<void> {
for (const file of files) {
if (file.hasChanged()) {
const newHash = await crypto.sha256(file.content);
if (newHash !== file.oldHash) {
await this.indexFile(file);
}
}
}
}
}
十、总结与行动项
10.1 核心收获
- AST 分块 是代码语义理解的基础,比纯文本分块精准 60-80%
- 混合检索 (BM25 + 向量 + RRF) 是平衡精确与语义的成熟方案
- Merkle 树 增量索引是处理大型代码库的关键
- 40% Token 节省 主要来源于精准召回和上下文压缩
10.2 可迁移的技术优先级
P0
Tree-sitter AST 解析
立即引入,支持 TypeScript/JavaScript/Python
P0
混合检索实现
BM25 + 向量 + RRF 融合算法
P1
增量索引机制
Merkle 树实现变更检测
P2
MCP 协议集成
按需实现,支持 Claude Code 等工具