AI 数据通道:JSON·Markdown

代码库记忆这回事 #

LLM 写代码的最大障碍不是不会写,而是不知道你现有的代码长什么样

把一个函数塞进 context,AI 能写好它;把整个仓库塞进去,token 预算瞬间爆炸,注意力被稀释,反而什么都写不好。这不是模型能力问题,是信息获取效率问题:AI 需要”读”代码库,但 context window 装不下,grep 又太粗。

传统软件工程早就遇到过同样的问题。IDE 怎么知道一个方法的 callers?靠 LSP 维护的符号表。Sourcegraph 怎么做跨仓库搜索?靠 LSIF/SCIP 索引。ctags 为什么存在了几十年?因为开发者需要快速跳转到符号定义。

这些方案共同指向一个抽象:把代码库从”文件集合”转化为”可查询的结构化记忆”。文件集合是给人读的,结构化记忆是给工具查询的。

MCP(Model Context Protocol)的出现,让这套思路有了新的载体。LLM 不再需要把整个仓库塞进 context,而是通过一个标准协议,按需查询代码库的结构化记忆–查一个函数的调用链、查一个类的定义、查两个模块之间的依赖路径。查询返回的是几 KB 的精炼结果,而不是几 MB 的源文件。

这就是”代码库记忆 MCP”赛道在 2026 年爆发的根本原因:需求一直在,MCP 给了标准化的接入方式

把代码变成记忆的四种方式 #

要让 AI”读懂”代码库,核心问题是:用什么数据结构表示代码?

目前业界给出了四种答案,每种都有其原理性的优势和代价。

方式一:prompt 打包(无记忆) #

最朴素的方式–不建任何索引,直接把代码文件拼成一个长文本塞进 prompt。Repomix、code2prompt 是这一派的代表。

原理上它甚至不算”记忆”,只是”打包”。但它的价值在于简单可靠:没有解析错误,没有索引滞后,所见即所得。Aider 的 repo map 也属于这一脉的轻量变种–用 tree-sitter 提取符号树,但最终仍是塞进 prompt 内联输出,不持久化。

代价同样源于此:每次对话都要重新打包,token 消耗是 O(仓库大小)。一个 10 万行的仓库打包后轻松超过 50K tokens,查询 5 次就是 250K tokens,而且每次都是全量重复。这在 toy 项目上无感,在真实工程中不可持续。

方式二:AST 符号图谱 #

tree-sitter 解析出 AST,提取函数/类/方法/调用关系,构建成一张有向图存进数据库。查询时用图查询语言(Cypher)或结构化 API 取子图。

这是当前主流方案,codebase-memory-mcp、Graphify、code-review-graph 都属此派。优势是确定性:tree-sitter 的解析结果不依赖 LLM,同一段代码每次解析结果一致,没有幻觉。查询”谁调用了 UserService.create()“返回的是精确的调用链,不是”语义相似”的猜测。

代价是语言覆盖受限于 grammar。tree-sitter 虽然支持上百种语言,但不同 grammar 的符号提取质量参差不齐。且 AST 只能捕获语法层的”调用/继承/引用”,无法理解语义层的”这个函数在业务上做什么”–这需要类型解析(LSP)或 LLM 补充。

方式三:向量 RAG #

把代码切片、做 embedding、存向量库,查询时用语义相似度召回相关片段。claude-context、code-graph-rag 属于这一派。

原理上是把代码当作”文本文档”做检索。优势是语义模糊查询强:”处理用户认证的代码在哪”这种自然语言问题,向量检索能命中,符号图谱做不到。

代价是精度低、依赖云服务。向量检索返回的是”相似片段”而非”精确答案”,”谁调用了 X”这种确定性问题,向量检索的准确率远不如图查询。且 embedding 需要调用 API(OpenAI/本地模型),大型仓库的 embedding 成本不低,增量更新也更复杂。

方式四:混合(AST + 向量 + 图) #

意识到单一方案的局限后,不少项目走混合路线:AST 提取结构关系,向量补充语义搜索,图数据库统一存储。SocratiCode、contextplus 是这一派。

原理上最完整,工程上最复杂。维护三套子系统(解析器、embedding pipeline、图数据库)的协同,部署成本和故障面都更大。适合企业级大规模部署,对个人开发者偏重。

四派对比 #

方式token 效率精确查询语义查询增量成本依赖
prompt 打包最低(O(repo))强(全量可见)
AST 图谱高(O(查询结果))tree-sitter
向量 RAG高(重嵌入)embedding API
混合全套

四种方式不是互斥的”对错”,是不同查询模式的权衡。真正的问题不是”哪种最好”,而是”你的查询模式是什么”。

两个范式的代表 #

在 AST 图谱派内部,又分化出两种截然不同的工程范式。以两个头部项目为例。

codebase-memory-mcp:查询型数据库 #

核心隐喻:代码库是一个数据库,LLM 是查询客户端。

用 C 实现,单静态二进制零依赖。tree-sitter 解析 158 种语言,对其中 9 种(Python/TS/JS/Go/C/C++/Java 等)额外做 Hybrid LSP 类型解析增强。解析结果存入 SQLite(LZ4 压缩 + Aho-Corasick 加速),通过 Cypher 查询。

它的设计目标很纯粹:性能与精度。Linux kernel 28M 行代码 3 分钟索引完,结构查询 < 1ms。官方 benchmark 显示 5 次结构查询约消耗 3,400 tokens,对比文件遍历的 412,000 tokens,约 120 倍的缩减。

这个范式的关键特征是拉模型:LLM 主动调用 MCP tool 查询,按需获取子图。代码库的数据常驻 SQLite,不进 context,不进 git,是一个无头查询服务。

它不碰文档、PDF、图片–因为那些需要 LLM 解析,会引入不确定性。纯代码、纯 AST、纯确定性,是它的安全边界。

Graphify:理解型地图 #

核心隐喻:代码库是一张可探索的概念地图,AI 和人都能看。

用 Python 实现,uv tool install 安装。tree-sitter 解析 36 种语言,但不止于代码–文档、PDF、图片、视频都能映射进同一张图。代码部分本地解析零 LLM 调用,文档/图片部分调用 LLM 做语义抽取。

它的设计目标不同:理解广度与可探索性。构建后产出三件套:graph.html(交互式力导向图,Leiden 社区检测着色,浏览器可点可搜)、GRAPH_REPORT.md(关键概念、意外连接、建议问题)、graph.json(完整图数据)。

关键特征是推模型 + 团队协作:构建时生成静态产物,graph.json 提交进 git,团队成员共享。配合 git hook 自动重建,还有 merge driver 让两人并行提交时 graph.json 自动 union 合并。每条边标注 EXTRACTED/INFERRED/AMBIGUOUS 置信度,让你区分”源码直接读到的”和”LLM 推断的”。

范式差异的本质 #

维度codebase-memory-mcp(查询型)Graphify(理解型)
数据访问拉模型:LLM 主动查 SQLite推模型:LLM 读静态产物
计算边界纯代码,零 LLM代码 + 文档/图片/视频(LLM)
产物形态常驻 MCP Server三件套静态文件(提交 git)
查询精度Cypher < 1msCLI 遍历 JSON
增量机制SQLite 差异更新--update + git merge driver
可信度标注无(纯确定)每条边 EXTRACTED/INFERRED
可视化交互式 graph.html

这不是”谁更好”的问题,是两种查询模式的分工。精确结构查询(”谁调用了 X”、”这个函数的所有 callers”)是 codebase-memory-mcp 的主场;全局架构理解(”这个项目的 auth 和 db 怎么连起来的”、”哪些是核心概念”)是 Graphify 的主场。

核心赛道全量对比 #

2026 年这一赛道已成红海。以下是”把代码库索引成结构化记忆供 LLM 读取”的核心赛道项目全量对比,按 stars 排序。

项目stars语言原理持久化增量语言覆盖查询方式MCP单二进制
Graphify-Labs/graphify80.5kPythonAST+社区检测+多模态graph.jsongit hook+merge36 语言CLI+MCP(可选)可选
colbymchenry/codegraph58.6kTSAST+图谱+自动同步自动同步主打 JS/TS/iOSMCP toolsNode bundle
DeusData/codebase-memory-mcp28.6kCAST+Hybrid LSP+图谱SQLite158 语言+9 LSPCypher 图查询
tirth8205/code-review-graph19.3kPythonAST+图+增量增量tree-sitter 通用MCP+CLI
zilliztech/claude-context12.1kTS向量 RAG向量库增量嵌入任意语义搜索
CodeGraphContext3.9kPython图数据库未明示图查询
SocratiCode3.1kTSAST+向量+图混合Qdrant多语言混合搜索
code-graph-rag2.3kPythonRAG+MemgraphMemgraph多语言图+语义
jcodemunch-mcp2.0kPythonAST 符号检索tree-sitter符号查询
contextplus1.9kTSAST+RAG+聚类TS/Py/Rust/Go语义+结构
axon0.7kPython图驱动有限MCP tools
roam-code0.5kPythonSQLite 图SQLite28 语言243 tools
tokensave0.4kRustlibSQL 图libSQL30+ 语言40+ tools
code-context-engine0.3kPython索引搜索通用搜索
mcp-server-tree-sitter0.3kPython纯 AST 符号tree-sitter符号

另有通用记忆层(mem0、Graphiti)、代码打包(Repomix、code2prompt)、静态分析(ast-grep、CodeQL、ctags)、Agent 内置(Aider repo map、Goose)等相邻赛道项目,因原理或场景差异未纳入此表。

关键差异维度 #

语言覆盖:codebase-memory-mcp 的 158 语言 + 9 语言 Hybrid LSP 是绝对领先。Graphify 36 语言、code-review-graph 通用 tree-sitter、codegraph 主打 JS/TS 生态。如果你的仓库是多语言混合(如 C++ + Python + Go),覆盖广度直接决定可用性。

性能:codebase-memory-mcp 是唯一给出硬性 benchmark 的项目(Linux kernel 28M LOC / 3 分钟、< 1ms 查询)。C 实现确保延迟下限。Python/TS 实现在大型仓库上的性能上限更低,但多数项目未公开 benchmark,无法直接比较。

增量索引:code-review-graph 把增量作为头号卖点(38x-528x token 缩减,跨 6 仓库 benchmark)。Graphify 的 --update + git hook + merge driver 组合在团队协作场景下更成熟。codebase-memory-mcp 内置 SQLite 增量但 README 未突出。

Agent 集成:Graphify 覆盖 20+ 个 AI 助手(skill 文件 + PreToolUse hook),codebase-memory-mcp 覆盖 11 个(MCP tool 注册)。前者是”指令注入让 AI 主动用图”,后者是”暴露工具让 AI 按需查”。

可信度:Graphify 的 EXTRACTED/INFERRED/AMBIGUOUS 边标注是独有设计。纯 AST 项目无此问题(全确定),但一旦引入 LLM 语义抽取(多模态场景),这个标注就是必需的信任边界。

安全:codebase-memory-mcp 的 SLSA L3 签名 + 70+ 杀软扫描是企业级供应链安全。其余项目均无。如果代码库敏感、供应链审计严格,这是硬门槛。

没有银弹 #

以上分析基于原理和官方数据,但每个项目都有必须说清的局限。

codebase-memory-mcp 的短板:社区规模(28.6k)落后于 Graphify(80.5k)和 codegraph(58.6k),生态效应可能滞后。C 实现虽然性能强,但社区贡献门槛高–修改一个 grammar 的解析逻辑需要懂 C 和 tree-sitter API,远不如 Python/TS 改起来快。增量索引能力在 README 中未充分展示,而这是竞品的主打卖点。商业化路径不明确,纯开源项目的长期维护有不确定性。

Graphify 的短板:Python 实现在大型仓库上的性能是未知数,未公开 benchmark。36 语言覆盖虽不少,但与 codebase-memory-mcp 的 158 语言差距明显。多模态引入的 LLM 调用带来两个风险:一是 API 成本(文档/PDF/图片的语义抽取都消耗 token),二是 INFERRED 边的可信度–即便标注了,AI 是否会过度信任推断结果仍是开放问题。商业产品 Penpax 的存在意味着核心功能可能逐步向商业版倾斜。

code-review-graph 的短板:聚焦 code review 场景,通用性不如前两者。Python 实现,性能受限。

向量 RAG 派的共性问题:依赖 embedding API(云或本地模型),部署链路多一环。语义检索的”相似”不等于”正确”,精确调用链查询的准确率不如图查询。增量更新需要重新 embedding 变更文件,成本高于 AST 重新解析。

混合派的共性问题:三套子系统的协同复杂度高,一个环节出问题(如 embedding 服务挂了)整个系统降级。适合有运维能力的团队,不适合个人开发者。

整个赛道的共同风险:这是一个 2026 年初才爆发的赛道,多数项目创建于 2026-01 至 2026-04,距今不到半年。技术路线尚未收敛,API 不稳定,breaking change 频繁。现在选定任何一个项目,都要做好半年后迁移的准备。

如何选型 #

回到最初的问题:哪个最强、最符合工程实践?

没有绝对的最强,只有场景的匹配。工程实践不是单一维度的”性能最高”或”stars 最多”,而是”在你的约束下,哪个方案的代价最小”。

场景一:大型纯代码仓库 + 精确结构查询 #

选 codebase-memory-mcp

典型问题:”谁调用了 UserService.create()“、”这个函数的所有 callers”、”这个类的继承链”。仓库规模在百万行级,多语言混合。你需要的是精确的调用链分析,不是”语义相似”的猜测。C 实现的性能和 SQLite 的查询延迟在这个场景下不可替代。158 语言覆盖确保你的多语言仓库不会”漏文件”。

场景二:代码 + 文档混合体 + 团队共享 + 架构理解 #

选 Graphify

典型问题:”这个项目的 auth 和 db 怎么连起来的”、”哪些是核心概念 god nodes”、”给我一张能点的架构图”。仓库规模中小型,代码和文档并重,团队多人协作。你需要的是全局理解而非精确查询,是可探索的地图而非查询终端。多模态支持和团队协作工作流(git 提交 + merge driver)在这个场景下价值最大。

场景三:增量 code review 场景 #

选 code-review-graph

典型问题:”这次改动影响了哪些调用链”、”PR 的 blast radius 多大”。你的核心需求是每次代码变更后快速增量更新图谱,评估影响范围。增量索引是它的头号卖点,且有跨 6 仓库的 benchmark 佐证。

场景四:语义模糊查询 + 已有向量基础设施 #

选 claude-context 或 SocratiCode

典型问题:”处理用户认证的代码在哪”这种自然语言问题。你已有向量库(Qdrant/Zilliz)或愿意部署,对精确性要求不高,对语义召回要求高。

不建议的场景 #

  • 超小仓库(< 1 万行):直接 Repomix 打包进 prompt 即可,任何索引方案都是过度工程。
  • 敏感代码库 + 严格供应链审计:目前只有 codebase-memory-mcp 有 SLSA L3,其余项目的供应链安全均为空白。
  • 需要长期稳定的生产环境:整个赛道不满半年,技术路线未收敛,建议观望或准备迁移方案。

代码库记忆 MCP 解决的是”AI 读代码”的效率问题,不是”AI 写代码”的能力问题。选型时先想清楚你的 AI 最常做的是”精确查询结构”还是”理解全局架构”,答案自然浮现。