# Graphify 深度解析:当 Karpathy 的 /raw 文件夹有了大脑
开篇:那个让 Andrej Karpathy 头疼的问题
想象你是一位 AI 研究员。你的桌面上有一个文件夹,叫 /raw。
里面有什么?
- 昨天刚读的 Transformer 论文 PDF
- 上周截的某条推文讨论优化器
- 三个月前白板上的架构草图(拍的照)
- 随手记的 Markdown 笔记
- 某个实验的代码片段
这些素材之间的关联,全在你脑子里。
现在你想问 Claude Code:"我之前看到那个关于注意力机制的优化技巧,跟我现在的代码有什么关系?"
Claude 会怎么做?
它会打开 /raw 文件夹,看到 200 个文件,然后——全部读一遍。52 个文件,200k Token,$2-3 的成本,就为了回答一个简单问题。
这就是 Andrej Karpathy 公开吐槽过的问题。他在 X 上分享自己的工作流时,那个 /raw 文件夹成了传奇。
Graphify 就是来解决这个问题的。
第一部分:71.5 倍的 Token 压缩率
一次构建,终身受益
Graphify 的核心洞察很简单:
> 不要把原始文件当知识库,把结构化的知识图谱当知识库。
它做了一件看似简单但极其巧妙的事——把你的文件堆变成一张图。
| 项目 | 原始方式 | Graphify |
|---|---|---|
| Karpathy 素材包 | 52 文件 / 200k+ Token | 图谱查询 / 2.8k Token |
| 压缩率 | 1x | 71.5x |
| 持久化 | 每次重读 | 一次构建,跨会话复用 |
| 增量更新 | 重新全读 | 只处理变更文件 |
这 71.5 倍的差距是怎么来的?
原始方式:每问一个问题,Agent 都要重新读取所有文件,从非结构化的文本中重新提取关系。
Graphify 方式:一次性把文件解析成知识图谱(节点 + 边),之后的查询只是在图上遍历——2-3 跳邻居,几百个 Token 搞定。
第二部分:双通道提取引擎
通道 A:AST 确定性提取(零 LLM 开销)
对于代码文件,Graphify 不走 LLM——它用 tree-sitter 直接解析抽象语法树。
支持 15 种语言:
Python, TypeScript, JavaScript, Go, Rust, Java C, C++, Ruby, C#, Kotlin, Scala PHP, Swift, Lua, Zig, PowerShell, Elixir, Objective-C
提取什么?
- 类定义、函数签名
- Import/Export 关系
- 调用图(Call Graph)
- 文档字符串
- 特殊注释标记:
# WHY:,# HACK:,# NOTE:,# IMPORTANT:
这些注释不是普通注释——它们是设计决策的显式记录。
def optimize_attention(q, k, v): # WHY: Flash Attention 在序列长度 > 2048 时内存效率更高 # HACK: 需要手动处理 causal mask 的边界情况 if seq_len > 2048: return flash_attention(q, k, v)
Graphify 会把这些注释提取为 rationale_for 边——不是代码做了什么,而是为什么这么做。
通道 B:语义提取(LLM 子代理)
对于非代码文件,Graphify 启动 Claude 子代理并行处理:
| 文件类型 | 处理方式 |
|---|---|
.md/.txt/.rst |
概念提取 + 关系识别 |
.pdf |
引用挖掘 + 核心概念 |
.png/.jpg/.webp/.gif |
Claude Vision 图像理解 |
这意味着什么?
- 一张白板草图可以被解析为架构节点
- 一篇论文的"注意力机制"概念会自动链接到你代码中的
Attention类 - 推文截图里的优化技巧会成为图中的独立节点
多模态知识图谱——这是传统代码分析工具做不到的。
第三部分:三级置信度——诚实的 AI
Graphify 最让我喜欢的设计,是它的诚实。
每条关系边都被标记为三级之一:
| 标签 | 含义 | 置信度 |
|---|---|---|
| EXTRACTED | 直接从源码找到的显式关系 | 1.0 |
| INFERRED | 合理推断的关系 | 0.6-0.9 |
| AMBIGUOUS | 不确定,标记待审查 | 人工审查 |
EXTRACTED 的例子:
from utils.auth import DigestAuth # 提取为:当前文件 --imports--> DigestAuth [EXTRACTED, 1.0]
INFERRED 的例子:
两个函数解决同一问题但没有调用关系 推断为:func_a --semantically_similar_to--> func_b [INFERRED, 0.82]
AMBIGUOUS 的例子:
一段注释提到"参考论文 X 的方法" 但无法确定具体是论文中的哪个概念 标记为:AMBIGUOUS(待人工确认)
这套体系的核心哲学:对自己"找到了什么"和"猜测了什么"保持诚实。
这比那些自信满满胡说八道的 AI 输出强太多了。
第四部分:图拓扑社区检测
不需要向量数据库的聚类
Graphify 使用 Leiden 算法(来自 graspologic 库)进行社区发现。
关键点:完全基于图的边密度拓扑,不需要任何嵌入向量或向量数据库。
这意味着什么?
- 没有 embedding 开销
- 没有向量数据库部署
- 聚类结果反映真实的代码结构关系,而非表面的语义相似
社区发现的结果:
- 每个节点被标记为属于哪个社区
- 社区代表一个主题领域(如"认证流程"、"数据层"、"前端组件")
- 可视化时按社区着色,一眼看出架构边界
上帝节点与惊人连接
社区检测后,Graphify 会输出三类关键信息:
上帝节点(God Nodes):
- 度数最高的节点
- 所有东西都连接到的核心概念
- 例如:被 15 个模块依赖的
BaseHandler类
惊人连接(Surprising Connections):
- 跨社区、跨文件类型的意外关联
- 按综合评分排序
- Code-Paper 边(代码-论文关联)比 Code-Code 边权重更高
- 附带 plain-English 解释:为什么这两个东西有关联
建议问题(Suggested Questions):
- 4-5 个图谱最擅长回答的问题
- 例如:"为什么日志模块和认证模块共享同一个配置解析器?"
第五部分:管线架构——Unix 哲学的胜利
Graphify 的架构清晰得让人舒服:
detect() → extract() → build_graph() → cluster() → analyze() → report() → export()
每个阶段是一个独立模块中的单一函数:
| 模块 | 职责 | 输入 → 输出 |
|---|---|---|
detect.py |
文件收集与过滤 | directory → [Path] |
extract.py |
AST + 语义提取 | file path → {nodes, edges} |
build.py |
图构建与节点去重 | extractions → nx.Graph |
cluster.py |
Leiden 社区检测 | graph → graph (带 community 属性) |
analyze.py |
核心分析 | graph → analysis dict |
report.py |
报告生成 | graph + analysis → GRAPH_REPORT.md |
export.py |
多格式导出 | graph → HTML/JSON/Obsidian/… |
设计原则:
- 无共享状态
- 无副作用(所有输出仅写入
graphify-out/) - 通过普通 Python 字典和 NetworkX 图通信
第六部分:丰富的输出格式
一次运行,产出四类核心输出:
graphify-out/
├── graph.html # 交互式可视化图(vis.js)
├── GRAPH_REPORT.md # 审计报告:上帝节点、惊人连接、建议问题
├── graph.json # 持久化图数据(可跨会话查询)
└── cache/ # SHA256 缓存(增量更新)
可选输出
| 参数 | 输出 | 用途 |
|---|---|---|
--obsidian |
obsidian/ |
Obsidian 知识库 |
--wiki |
wiki/ |
Wikipedia 风格文章 |
--svg |
graph.svg |
矢量图 |
--graphml |
graph.graphml |
Gephi / yEd |
--neo4j |
cypher.txt |
Neo4j 导入脚本 |
--neo4j-push |
直接推送 | 推送到运行中的 Neo4j |
--mcp |
MCP 服务器 | 其他 Agent 实时查询 |
Obsidian 集成
这是很多人关心的功能:
/graphify . --obsidian --obsidian-dir ~/vaults/myproject
生成的 Obsidian 知识库包含:
- 每个节点作为一个 Markdown 笔记
- 双向链接(
[[node_name]]) - 社区作为标签
- 关系作为链接类型
可以直接在 Obsidian 中浏览整个代码库的知识结构。
第七部分:OpenClaw 集成详解
Graphify 支持四个平台:
- Claude Code
- Codex
- OpenCode
- OpenClaw(重点)
OpenClaw 的特殊之处
安装:
pip install graphifyy && graphify install --platform claw
这会将 skill-claw.md 复制到 ~/.claw/skills/graphify/SKILL.md。
关键差异:
| 特性 | Claude Code | OpenClaw |
|---|---|---|
| 语义提取 | 并行子代理 | 顺序执行 |
| Always-on | CLAUDE.md + PreToolUse hook | AGENTS.md only |
| 首次构建速度 | 快 | 较慢(但结果一致) |
为什么顺序执行?
skill-claw.md 中明确说明:由于 OpenClaw 的多代理支持尚处于早期阶段,提取过程是逐文件顺序执行的。
这意味着:
- AST 提取不受影响(仍然是瞬时完成)
- 语义提取(文档/图片)会变慢
- 但最终图谱质量完全一致
Always-on 模式
graphify claw install
这会在项目根目录创建 AGENTS.md:
graphify 在回答架构或代码库问题前: 1. 读取 `graphify-out/GRAPH_REPORT.md` 了解上帝节点和社区结构 2. 如果存在 `graphify-out/wiki/index.md`,优先导航 wiki 而非直接读源文件 3. 修改代码后自动触发图谱重建
注意:OpenClaw 不支持 Claude Code 的 PreToolUse hook(在每次 Glob/Grep 前自动提醒)。AGENTS.md 是 OpenClaw 上唯一的 always-on 机制。
在 OpenClaw 中使用
构建:
/graphify .
查询:
/graphify query "什么连接了认证模块和数据库?" /pathify query "..." --dfs # 深度追踪特定路径 /graphify path "AuthModule" "Database" # 最短路径 /graphify explain "Gateway" # 节点完整解释
第八部分:运维自动化
Git Hooks
graphify hook install
安装 post-commit 和 post-checkout 钩子:
- 每次 commit 后自动重建图谱
- 每次分支切换后自动重建
- 仅代码文件(AST),零 LLM 开销
- 如果重建失败,钩子以非零退出码结束,Git 会显式报告错误
文件监听
/graphify . --watch
后台监控:
- 代码文件变更:即时触发 AST 重建(无 LLM)
- 文档/图片变更:写 flag 文件并通知执行
--update - 3 秒防抖
增量更新
/graphify . --update
- 比较 SHA256 缓存
- 只处理变更文件
- 合并到现有图谱
如果只改了代码文件,自动跳过语义提取(零 LLM 开销)。
反馈回路
每次 /graphify query 的问答结果自动保存到 graphify-out/memory/。
下次 --update 时,这些结果会被提取为图中的新节点。
知识图谱越用越智能。
第九部分:典型使用场景
场景 1:接手陌生项目
你刚加入团队,面对几十个源文件。
/graphify .
5 分钟后,你知道了:
- 上帝节点:
BaseHandler被 15 个模块依赖 - 社区结构:3 个主要模块边界
- 惊人连接:日志模块和认证模块共享配置解析器
- 建议问题:"为什么错误处理在数据层而非 API 层?"
不需要读一行代码,你已经知道骨架。
场景 2:个人知识库
mkdir ~/knowledge/raw cd ~/knowledge/raw # 扔进去各种素材 # - 论文 PDF # - 推文截图 # - 白板照片 # - 代码片段 # - Markdown 笔记 /graphify . --obsidian
打开 Obsidian,一个跨模态的知识图谱等着你:
- Transformer 论文的"注意力机制"链接到代码中的
Attention类 - 推文里的优化技巧成为独立节点
- 白板草图被解析为架构节点
场景 3:追踪依赖链路
Code Review 时发现改了 DigestAuth 后 Response 模块测试挂了。
/graphify path "DigestAuth" "Response"
输出:
Shortest path (3 hops): DigestAuth --calls--> [EXTRACTED] AuthFlow --shares_data_with--> [INFERRED, 0.82] RequestBuilder --implements--> [EXTRACTED] Response
原来经过 AuthFlow 和 RequestBuilder,而且中间那段是推断关系(共享数据结构)。
场景 4:添加外部资料
读到一篇相关论文:
/graphify add https://arxiv.org/abs/1706.03762 --author "Vaswani"
自动抓取、保存、触发 --update,只提取新文件。
论文中的概念会和代码中的已有节点自动建立跨模态关联。
第十部分:技术栈与隐私
技术栈
| 组件 | 用途 |
|---|---|
| NetworkX | 图数据结构 |
| Leiden (graspologic) | 社区检测 |
| tree-sitter | AST 解析 |
| Claude API | 语义提取 |
| vis.js | 可视化 |
无需 Neo4j,无需服务器,完全本地运行。
隐私
- 代码文件:tree-sitter 本地处理,无文件内容离开你的机器
- 文档/图片:发送到 Anthropic API 进行语义提取
- 无遥测、无使用追踪、无分析
- 唯一的网络调用是 Anthropic API(使用你自己的 API Key)
结语:从文件堆到知识图谱
Graphify 的价值可以用一句话概括:
> 把非结构化的文件堆,变成结构化的知识图谱。
它不是第一个做代码分析的,但它是第一个真正为AI 编程助手设计的知识库工具:
- 71.5x Token 压缩:让大规模代码库查询变得经济可行
- 多模态:代码、文档、论文、图片统一图谱
- 诚实:三级置信度让你知道什么是找到,什么是猜测
- 持久化:一次构建,跨会话复用
- 增量更新:只处理变更,零重复开销
- 丰富导出:HTML、Obsidian、Neo4j、MCP,随你用
对于 Karpathy 那个 /raw 文件夹的问题,Graphify 给出了优雅的答案:
不是让 AI 每次都重新读一遍,而是帮 AI 把文件预先消化成知识。
未来的 AI 编程工作流,一定是先构建知识图谱,再基于图谱进行推理。
Graphify 让这种未来,现在就能用。
参考信息
- GitHub: https://github.com/safishamsi/graphify
- 安装:
pip install graphifyy && graphify install - 教程: https://www.aivi.fyi/llms/graphify
- License: MIT
- Stars: ~2.2k
#知识图谱 #Karpathy #AI编程 #OpenClaw #技能工具 #小凯
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/250852.html