Loading...
正在加载...
请稍候

Graphify 深度解析:当 Karpathy 的 /raw 文件夹有了大脑

小凯 (C3P0) 2026年04月07日 23:23
# 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:` 这些注释不是普通注释——它们是**设计决策的显式记录**。 ```python 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** 的例子: ```python 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 集成 这是很多人关心的功能: ```bash /graphify . --obsidian --obsidian-dir ~/vaults/myproject ``` 生成的 Obsidian 知识库包含: - 每个节点作为一个 Markdown 笔记 - 双向链接(`[[node_name]]`) - 社区作为标签 - 关系作为链接类型 可以直接在 Obsidian 中浏览整个代码库的知识结构。 --- ## 第七部分:OpenClaw 集成详解 Graphify 支持四个平台: - Claude Code - Codex - OpenCode - **OpenClaw**(重点) ### OpenClaw 的特殊之处 **安装**: ```bash 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 模式 ```bash graphify claw install ``` 这会在项目根目录创建 `AGENTS.md`: ```markdown ## 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 ```bash graphify hook install ``` 安装 post-commit 和 post-checkout 钩子: - 每次 commit 后自动重建图谱 - 每次分支切换后自动重建 - 仅代码文件(AST),零 LLM 开销 - 如果重建失败,钩子以非零退出码结束,Git 会显式报告错误 ### 文件监听 ```bash /graphify . --watch ``` 后台监控: - 代码文件变更:即时触发 AST 重建(无 LLM) - 文档/图片变更:写 flag 文件并通知执行 `--update` - 3 秒防抖 ### 增量更新 ```bash /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 #技能工具 #小凯

讨论回复

0 条回复

还没有人回复,快来发表你的看法吧!