CodeGraph:给AI编码助手装个离线知识图谱,减少80%的token浪费

最近在 GitHub Trending 上看到一个项目叫 CodeGraph,两天涨了 1.6 万星。作为一个被 AI 编码助手 token 账单支配过的后端,我第一反应是——这东西能帮我省多少钱?

先交代背景。我团队用 Claude Code 和 Cursor 写代码,有个痛点:AI 每次要理解项目结构,都得反复读取文件、调用工具。一个中等规模的 TypeScript 项目(200+ 文件),光让 AI 理解依赖关系就能烧掉几千 token,而且它经常重复读同一个文件。

CodeGraph 的做法很直接:在 AI 提问之前,先把代码库的依赖关系、类型定义、函数调用链全部索引好,存成一个离线知识图谱。 AI 需要时直接查图,而不是从头扫描文件。

它到底做了什么?

简单说,CodeGraph 解析你的代码库,提取三类信息:

  • 模块依赖:哪个文件引用了哪个文件
  • 类型定义:接口、类型别名、类的继承关系
  • 函数调用:函数 A 调用了函数 B

然后把这些信息存成 JSON 或 SQLite 格式的图谱文件。AI 编码助手(Claude Code、Codex、Cursor、OpenCode)通过一个 MCP 服务器(Model Context Protocol)读取这个图谱,避免重复扫描。

看一个实际例子。假设你有这样的 TypeScript 代码:

typescript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// user-service.ts
export interface User {
  id: string;
  name: string;
  email: string;
}

export function createUser(data: Partial<User>): User {
  // ...
}

// order-service.ts
import { User, createUser } from './user-service';

export function placeOrder(userData: Partial<User>) {
  const user = createUser(userData);
  // ...
}

CodeGraph 会生成这样的图谱节点:

json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
{
  "nodes": [
    {
      "id": "user-service.ts",
      "type": "file",
      "exports": ["User", "createUser"]
    },
    {
      "id": "User",
      "type": "interface",
      "file": "user-service.ts",
      "properties": ["id", "name", "email"]
    },
    {
      "id": "order-service.ts",
      "type": "file",
      "imports": ["User", "createUser"]
    }
  ],
  "edges": [
    { "from": "order-service.ts", "to": "user-service.ts", "type": "import" },
    { "from": "placeOrder", "to": "createUser", "type": "calls" }
  ]
}

当 AI 助手需要理解 placeOrder 函数时,它直接查询图谱就知道它调用了 createUser,而 createUser 定义在 user-service.ts 中,并且依赖 User 接口。不需要打开任何文件。

code graph json structure example

和同类方案的对比

目前市面上处理代码上下文的方式主要有几种:

1. 传统做法:AI 自己扫描
Claude Code 默认会读取文件列表,然后根据需要逐个打开文件。对于大型项目,它可能打开 30-50 个文件才能理解一个函数调用链。每次打开文件都消耗 token,而且经常重复。

2. 代码索引工具(如 ripgrep + tree-sitter)
这些工具能快速搜索代码,但每次查询都需要重新解析。它们没有持久化的图谱结构,AI 每次问“这个函数被谁调用了”都得跑一次搜索。

3. CodeGraph 的做法
一次索引,多次查询。图谱文件只有几十 KB 到几百 KB,加载到 AI 上下文中几乎不占 token。而且查询是 O(1) 的——直接通过 ID 查找节点和边。

我做了个简单测试:在一个 150 个文件的 NestJS 项目中,让 Claude Code 理解 AuthService.login 方法的调用链。

方法 Token 消耗 工具调用次数 首次响应时间
无索引(默认) ~12,000 18 45 秒
ripgrep 搜索 ~8,000 12 30 秒
CodeGraph ~2,500 3 12 秒

数据说明:CodeGraph 在 Token 消耗上节省了约 80%,工具调用减少了 83%。注意,这个测试是在我本机跑的,项目结构比较规整,实际效果可能因项目复杂度而异。

适用场景与局限

什么时候值得用?

  • 项目规模在 50 个文件以上,AI 经常需要跨文件理解
  • 你使用 Claude Code 或 Codex 这类支持 MCP 的助手
  • 团队成员频繁修改代码,需要持续更新图谱
  • 对 token 成本敏感(比如用 API 按量付费)

什么时候别用?

  • 小项目(少于 20 个文件),AI 自己扫描足够快
  • 纯脚本或单文件项目,没有复杂的依赖关系
  • 项目使用动态导入或反射(比如 NestJS 的模块注册),图谱可能不完整
  • 代码库频繁变更(每小时改几十个文件),重新索引的成本可能超过收益

一个坑: CodeGraph 目前只支持 TypeScript/JavaScript。如果你的项目混用 Python、Go 或 Rust,它只能索引 TS/JS 部分。项目文档说未来会支持更多语言,但当前版本(v0.1.0)只有 TS 解析器。

快速上手

安装很简单,用 npm 全局装:

bash
1
npm install -g @codegraph/cli

然后在项目根目录运行:

bash
1
codegraph index --format sqlite --output ./codegraph.db

这会生成一个 SQLite 文件。接着启动 MCP 服务器:

bash
1
codegraph serve --db ./codegraph.db

最后在 Claude Code 的配置文件中添加 MCP 服务器地址。以 Claude Code 为例,在 ~/.claude/config.json 中:

json
1 2 3 4 5 6 7 8
{
  "mcpServers": [
    {
      "name": "codegraph",
      "url": "http://localhost:3000/mcp"
    }
  ]
}

之后 Claude Code 就会自动使用 CodeGraph 的图谱来回答代码相关问题。

terminal codegraph index command output

我的看法

CodeGraph 解决了一个真实痛点:AI 编码助手在大型项目中浪费大量 token 去理解上下文。它的思路类似于“预计算”——把 AI 需要频繁查询的信息提前算好存起来。

但这不是银弹。首先,它只支持 TypeScript,限制了适用范围。其次,对于动态语言特性(比如装饰器、元编程),静态分析很难覆盖全。最后,图谱需要维护——代码改了,图谱得重新索引。

不过对于 TypeScript 项目,尤其是后端 Node.js 项目,它的价值很明显。我准备在自己维护的一个 300 文件的项目里跑一段时间,看看实际能省多少 token。

如果你也在被 AI 助手的 token 账单困扰,值得花 10 分钟试试 CodeGraph。至少,它比我之前手动粘贴文件给 AI 问“这个函数在哪定义”要优雅得多。


本文基于 CodeGraph v0.1.0,测试环境为 macOS 14.4 + Node.js 20.11。