返回博客列表

10万星的graphify:把代码库变成知识图谱,一条命令干掉向量检索

2026-08-12T19:28:00+08:00
graphify知识图谱Claude Code代码分析开源项目

10万星的graphify:把代码库变成知识图谱,一条命令干掉向量检索

先收藏,回头一定用得上。

Andrej Karpathy 有个习惯:他在电脑里维护一个 /raw 文件夹,往里面随手扔论文、推文、截图、笔记。时间一长,这个文件夹变成一个黑洞--东西都在,但谁也找不到什么在哪。

graphify 就是冲着这个问题来的。它在 Claude Code 里输入 /graphify .,读取你的整个目录--代码、文档、PDF、截图、白板照片、甚至其他语言的图片--把这些东西解析成一张知识图谱。每条边都标注是"发现的"还是"推测的",每个节点都可以点击溯源到原始文件。

这个项目 4 月份上线,到现在 10 万+ star,Apache 2.0 开源。它做了一件很具体的事:用确定性 AST 解析替代向量检索,用知识图谱替代 embedding 数据库,让 AI Agent 查代码库时不用再"猜"。

本文提纲

  1. 核心问题:为什么向量检索查代码不靠谱
  2. graphify 是什么:一条命令,一张图
  3. 技术架构:tree-sitter + Leiden + Claude vision
  4. 四种文件类型,四种提取策略
  5. 边的诚实标注:EXTRACTED / INFERRED / AMBIGUOUS
  6. Token 压缩实测:71.5 倍是怎么来的
  7. Agent 集成:Claude Code、Cursor、Codex、Gemini CLI
  8. 实际用起来什么样

核心问题:为什么向量检索查代码不靠谱

当前 AI 编码助手查代码库的主流方案是 RAG(检索增强生成):把代码切块、做 embedding、存进向量数据库,查询时用相似度检索找相关的块喂给 LLM。

这个方案在文档检索上还行,但在代码上有几个结构性问题:

语义相似不等于结构相关。 UserAuth 类和 loginHandler 函数在向量空间里可能很近,但它们的调用关系、依赖链、数据流向才是真正重要的连接。向量检索按文本相似度排序,抓不到这些结构关系。

切块破坏了上下文。 一个函数被切成两半,一个类的定义和实现被分到不同的 chunk,embedding 之后就丢失了它们之间的结构关系。代码的本质是图结构--调用关系、继承关系、导入关系--不是线性文本。

结果不可溯源。 向量检索返回的是"最相似的 N 个块",但不告诉你为什么相似,也不告诉你这些块之间有什么关系。LLM 拿到一堆碎片化的代码块,很容易产生幻觉。

graphify 的思路是:别把代码当文本检索,把它当图遍历。代码的结构关系是确定性的--谁调用了谁、谁继承了谁、谁导入了谁--这些可以通过 AST 精确提取,不需要猜。

graphify 是什么:一条命令,一张图

graphify 是一个 Claude Code Skill。安装后在任何目录输入 /graphify .,它会:

  1. 扫描目录下所有支持的文件
  2. 对代码文件用 tree-sitter 做 AST 解析,提取函数、类、调用关系
  3. 对文档和论文用 Claude 做概念提取和关系推断
  4. 对图片用 Claude vision 做内容识别
  5. 把所有节点和边合并成一张知识图谱
  6. 运行 Leiden 社区发现算法,把节点聚类成主题社区
  7. 输出一组可交互的文件
graphify-out/
├── graph.html       可交互图谱 - 点击节点、搜索、按社区过滤
├── obsidian/        可直接用 Obsidian 打开的 vault
├── wiki/            Wikipedia 风格的文章(--wiki 参数)
├── GRAPH_REPORT.md  God 节点、意外连接、建议问题
├── graph.json       持久化图谱 - 几周后查询不用重新读文件
└── cache/           SHA256 缓存 - 重新运行只处理变更的文件

最关键的产出是 graph.json。这是一个持久化的图谱数据结构,Agent 可以在后续会话中直接查询,不需要重新读取原始文件。这就是 71.5 倍 Token 压缩的来源--原始文件可能几十 MB,graph.json 可能就几百 KB。

技术架构:tree-sitter + Leiden + Claude vision

graph TB
    subgraph "Input"
        A["Code Files"]
        B["Docs / Markdown"]
        C["PDFs"]
        D["Images / Screenshots"]
    end
    subgraph "Extraction Layer"
        E["tree-sitter AST
+ call-graph pass"] F["Claude concept
+ relationship extraction"] G["Citation mining
+ concept extraction"] H["Claude vision
multilingual OCR"] end subgraph "Graph Engine" I["NetworkX
graph construction"] J["Leiden algorithm
community detection"] end subgraph "Output" K["graph.json
graph.html
GRAPH_REPORT.md"] end A --> E B --> F C --> G D --> H E --> I F --> I G --> I H --> I I --> J J --> K style A fill:#FF6B6B,color:#000000 style B fill:#4ECDC4,color:#000000 style C fill:#45B7D1,color:#000000 style D fill:#96CEB4,color:#000000 style E fill:#FFEAA7,color:#000000 style F fill:#FFEAA7,color:#000000 style G fill:#FFEAA7,color:#000000 style H fill:#FFEAA7,color:#000000 style I fill:#DDA0DD,color:#000000 style J fill:#DDA0DD,color:#000000 style K fill:#98D8C8,color:#000000

技术栈拆开看:

tree-sitter 做代码解析。 tree-sitter 是 GitHub 开源的增量解析库,支持 50+ 编程语言。graphify 用它做 AST 解析,提取函数定义、类定义、函数调用、类继承、模块导入等结构信息。这些边是 EXTRACTED--确定性的,不是猜的。

NetworkX 做图存储。 Python 的图处理库,节点是代码实体(函数、类、概念),边是关系(调用、继承、导入、引用)。不需要 Neo4j,不需要数据库服务器,纯内存计算。

Leiden 算法做社区发现。 Leiden 是 Louvain 算法的改进版,用来在图中发现"社区"--紧密连接的节点群。在代码库里,一个社区通常对应一个功能模块或主题领域。这让 graphify 能告诉你"你的代码库可以分成这几个主题"。

Claude vision 做多模态提取。 PDF 做引用挖掘和概念提取,图片做内容识别--截图、架构图、白板照片、甚至其他语言的图片都能处理。这是 graphify 区别于纯代码分析工具的地方:它不只是分析代码,它把整个工作目录当成一个多模态知识库。

vis.js 做交互式可视化。 生成的 graph.html 可以在浏览器里打开,点击节点、搜索、按社区过滤。不需要安装任何额外软件。

整个技术栈完全本地运行。官网原话:"no account, no API keys, no telemetry。"除了调用 Claude API 做概念提取和 vision 之外,不需要任何云服务。

四种文件类型,四种提取策略

graphify 不是一刀切地处理所有文件,而是按文件类型用不同的策略:

文件类型 扩展名 提取策略
代码 .py .ts .js .go .rs .java .c .cpp .rb .cs .kt .scala .php tree-sitter AST + call-graph pass
文档 .md .txt .rst Claude 概念和关系提取
论文 .pdf 引用挖掘 + 概念提取
图片 .png .jpg .webp .gif Claude vision - 截图、图表、任何语言

这种分策略的设计很关键。代码的结构关系是确定性的,用 AST 精确提取,标注为 EXTRACTED。文档和图片的语义关系需要 LLM 推断,标注为 INFERREDAMBIGUOUS。不同来源的边有不同的可信度,用户和 Agent 都能据此判断信息的可靠性。

--mode deep 参数可以让 LLM 做更激进的推断边提取。默认模式偏保守,只提取高置信度的关系;deep 模式会尝试连接更多"可能相关"的节点,适合探索性分析。

边的诚实标注:EXTRACTED / INFERRED / AMBIGUOUS

这是 graphify 最打动我的设计。

每条边都带一个标签:

  • EXTRACTED:从文件中确定性提取的。比如 loginHandler 调用了 validateToken--这是 AST 解析出来的,100% 准确
  • INFERRED:LLM 推断的。比如一篇论文里的"attention mechanism"概念和代码里的 MultiHeadAttention 类--LLM 认为它们相关,但不是代码层面的直接调用
  • AMBIGUOUS:LLM 不确定的。标注出来让用户或 Agent 自己判断

这个设计解决了 RAG 方案的一个根本问题:不可溯源。向量检索返回结果时不告诉你"为什么这个块相关",graphify 明确告诉你每条边的来源和可信度。

对 Agent 来说这特别重要。Agent 在做决策时需要知道哪些信息是确定的、哪些是推测的。如果一条调用关系是 EXTRACTED,Agent 可以放心依赖;如果是 INFERRED,Agent 知道需要验证。这种元信息让 Agent 的推理更可靠。

Token 压缩实测:71.5 倍是怎么来的

graphify 在 README 里给出了实测数据:

语料 文件数 Token 压缩倍数
Karpathy 仓库 + 5 篇论文 + 4 张图片 52 71.5x
graphify 源码 + Transformer 论文 4 5.4x
httpx(合成 Python 库) 6 ~1x

几个关键观察:

压缩倍数和语料规模正相关。 6 个文件时压缩只有 1 倍--因为 6 个文件本身就能塞进上下文窗口,图谱的价值在于结构清晰而非压缩。52 个文件时达到 71.5 倍--因为 graph.json 的体积远小于原始文件总和,而且 Agent 查询时只需要遍历相关子图,不用读全部文件。

混合语料效果最好。 纯代码的压缩效果不如"代码+论文+图片"的混合语料。原因是跨类型的连接(比如代码和论文之间的概念映射)是图谱独有的价值--向量检索很难跨模态匹配,但图谱可以用概念节点桥接不同类型的文件。

每个 worked example 都可复现。 graphify 在仓库的 worked/ 目录下放了原始输入文件和实际输出(GRAPH_REPORT.mdgraph.json),你可以自己跑一遍验证数字。这种透明度在开源项目里不多见。

Token 压缩的意义不只是省钱。对 Agent 来说,上下文窗口是有限的--如果一个 52 文件的代码库要占用大部分上下文,Agent 就没有空间做推理了。图谱压缩释放了上下文空间,让 Agent 能处理更大的代码库。

Agent 集成:Claude Code、Cursor、Codex、Gemini CLI

graphify 不仅仅是一个独立的 CLI 工具,它的核心定位是 AI 编码助手的 Skill。当前支持的平台:

安装方式:

pip install graphifyy && graphify install

PyPI 包名暂时叫 graphifyy(正在回收 graphify 这个名字),CLI 命令和 Skill 名称仍然是 graphify

安装后在任何目录打开 Claude Code 输入:

/graphify .

常用命令一览:

/graphify .                        # 在当前目录构建图谱
/graphify ./raw --mode deep        # 更激进的推断边提取
/graphify ./raw --update           # 只重新提取变更文件,合并到已有图谱

/graphify query "what connects attention to the optimizer?"
/graphify path "DigestAuth" "Response"
/graphify explain "SwinTransformer"

/graphify ./raw --watch            # 文件变更时自动同步图谱
/graphify ./raw --wiki             # 生成 Agent 可导航的 wiki
/graphify ./raw --mcp              # 启动 MCP stdio server

graphify hook install              # 安装 git post-commit hook,每次提交自动重建图谱

几个值得注意的集成设计:

--update 增量更新。 graphify 用 SHA256 缓存每个文件的解析结果。重新运行时只处理变更的文件,合并到已有图谱。对大型代码库来说,第一次构建可能要几分钟,后续更新只需要几秒。

--watch 实时同步。 在后台终端运行,代码文件保存时触发即时重建(只走 AST,不调 LLM)。文档和图片变更时通知你运行 --update 做 LLM 重新提取。这对多 Agent 并行写代码的场景特别有用--图谱在各轮之间自动保持最新。

--mcp MCP Server。 启动一个 MCP stdio server,任何支持 MCP 的客户端都可以查询图谱。这意味着 Cursor、Codex、Gemini CLI 等不支持 Claude Code Skill 的工具也能用 graphify。

--wiki Agent 可导航 wiki。 生成 Wikipedia 风格的 markdown 文章,每个社区一篇,配一个 index.md 入口。Agent 可以通过读文件来导航知识库,不需要解析 JSON。这个设计很巧妙--对不支持图谱查询的 Agent 来说,markdown 文件是最通用的接口。

Git hook 集成。 graphify hook install 安装一个 post-commit hook,每次 git commit 后自动重建图谱。不需要后台进程,适合不想开 --watch 的场景。

实际用起来什么样

graphify 的输出报告 GRAPH_REPORT.md 包含三个部分:

God 节点。 度数最高的概念节点--也就是所有东西都连到它的"枢纽"。在一个代码库里,God 节点通常是核心数据结构或基础工具函数。找到 God 节点等于找到了代码库的"重心"。

意外连接。 按综合分数排序,代码-论文的边排名高于代码-代码的边。每条结果都附带一段英文解释"为什么这条连接是意外的"。这是图谱分析最有价值的产出--它帮你发现你自己都没意识到的跨模块、跨文件类型的联系。

建议问题。 4-5 个图谱特别擅长回答的问题。不是泛泛的"你想了解什么",而是基于图谱结构生成的具体问题--比如"attention 机制和优化器之间有什么联系?"

整个流程完全透明:每个节点可溯源到原始文件,每条边标注了提取方式和可信度,缓存机制让重新运行成本很低。你可以在 graph.html 里可视化探索,也可以用 graphify query 命令行查询,还可以通过 MCP server 让 Agent 自动查询。

一个实际建议:先用 worked/ 目录下的示例跑一遍,看看 52 个文件的 Karpathy 语料生成什么样的图谱和报告,理解了再在自己的项目上跑。直接在大项目上跑第一次会等比较久,而且如果结果不符合预期你不知道是工具的问题还是你项目的问题。

10 万 star 不是没原因的。graphify 做对了一件难而正确的事:用确定性方法替代概率性方法,用图结构替代向量空间,用诚实标注替代黑盒检索。如果你在用 Claude Code 或 Cursor 做大型代码库的开发,这个 Skill 值得试一下。

参考文档与链接

你的代码库多大?查代码用grep还是RAG?评论区聊聊。觉得有用点个赞让更多人看到。


作者: itech001 来源: 公众号:AI人工智能时代 网站: https://www.theaiera.cn/ 每日分享最前沿的AI新闻资讯和技术研究。

本文首发于 AI人工智能时代,转载请注明出处。

分享给朋友