Blog

Blog

PHODAL

AutoDev 预上下文引擎:预生成代码语义化信息,构建 AI 编程的知识基座

在先前《预上下文生成》的文章中,我们介绍了预生成上下文的概念和实践:

预生成上下文是指在用户发起查询或生成请求之前,系统针对特定代码仓库、文档或 SDK,离线构建一组语义化的上下文数据。这些上下文经过理解、 加工与组织,使其在运行时能够被快速检索和引用,从而提升代码智能体在生成、解释或检索代码时的准确性、相关性和响应速度。

我们在 AutoDev Workbench 中实现了这一概念的分析端与后端,对应的分析侧即 AutoDev Context Worker。你可以使用这个工具, 对你的代码仓库进行上下文生成:

npx @autodev/context-worker@latest

PS:npx 是 Node.js 的包管理工具,可以直接运行 npm 包中的命令。

引子:寻找更高效的 RAG 方式

RAG 是在 AI 应用中一个重要的话题。尽管我们在 AutoDev 的 VSCode 版本中,构建了多种向量化 RAG 的方式,但是我一直认为在 AI 编程中, 对于大量的项目来说基于向量化方式的 RAG 的性价比并不高。

所以,有必要重新审视 RAG 的方式,尤其是对于代码检索来说。

性价比低的向量化代码检索

我认为向量化代码检索的性价比并不高,主要有以下几个原因:

  • 向量化索引是一个昂贵的过程,不论是你使用本地的向量化还是云端的向量化。
  • 向量化的实时刷新又是另外一个头疼的过程,特别是它会拉跨你的本地机器。
  • 代码库中并没有大量的文档知识,更多的是代码本身的语义信息。

而从 2025 年技术趋势来说,基于向量化的 RAG 已经变成了次要的选择,只当当前阶段,AI 检索不到相关信息时,有些工具如 Cursor 才会使用向量化的方式进行检索。

内部框架等固定知识的预生成

另外一方面,作为一个 AI 编程工具,我们还需要面对大量的内部框架、SDK、API 等固定知识的预生成。因为这些知识是相对固定的,对于用户来说, 通常问题也是颇为明确的 —— 用户不会去询问:如何使用 Spring Boot 来构建一个 Web 应用?而是会询问:如何在 Spring Boot 中使用 xx 框架。

那么,针对这类需要提供固定知识的场景:

  1. 内部开发框架。可以分为单个组件的问题,或者多个组件一起使用等,在排查问题时需要知道部分代码信息。
  2. SDK、API 等。用户通常不想去了解 SDK、API 的实现细节,而是想要了解如何使用它们来完成特定的任务。
  3. 其它公共代码库。比如,如何使用某个公共库来完成特定的任务。

我们就可以用更高效的方式来生成它们。

Context Worker:预生成代码上下文

如上所述,针对于这一类场景,我们可以使用预生成上下文的方式来提升 RAG 的效果。Context Worker 就是为此而设计的。

AutoDev Context Worker 是一个用于深度解析和分析代码的工具,旨在为开发者提供更好的上下文理解和智能化的代码处理能力。 它可以帮助开发者更高效地理解和使用代码库。

Context Worker 的设计与目标

Context Worker 是基于我们先前的 VSCode 版本开发的,我们从中提取核心的代码解析和分析功能,构建了一个独立的工具。 我们进一步扩充了他的多语言的解析支持,现在可以支持 Java、JavaScript、TypeScript、Python、Golang、Rust、C/C++、Ruby、C# 等十几种主流语言。

结合 AutoDev Workbench 的服务端功能,Context Worker 可以为开发者提供以下能力:

  • 深度项目解析与 AST 构建结构化,Context Worker 对整个项目(或指定的模块范围)进行深度解析。这包括构建完整的 AST,识别所有的函数、类、接口及其签名、注释(docstrings)。同时,分析项目依赖(内部模块间和外部库依赖),构建初步的依赖图。
  • 自动化代码摘要与"意图"标注:对于缺乏良好注释的代码块(函数、复杂逻辑段),尝试使用 LLM 预先生成简洁的摘要或"意图描述" 。对于一些关键的架构组件或核心算法,可以预先打上特定的标签或元数据。
  • 构建项目级知识图谱:将解析出的代码实体(类、函数、变量等)及其关系(调用、继承、实现、引用等),并围绕领域模型构建知识图谱, 标注实体的语义和上下文信息。

使用 AutoDev Context Worker

Context Worker 的使用非常简单,你只需要运行以下命令:

npx @autodev/context-worker --path /path/to/project --upload --server-url https://your-server/api/context --non-interactive

它将会启动 Context Worker,并对当前目录下的代码进行解析和分析。如下是一个生成数据的示例:

接口: UserRepository
文件: /path/to/UserRepository.java

接口定义:

```java
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByUsername(String username);
    List<User> findByEmail(String email);
}
```

=== 实现类 (1) ===

实现类: UserRepositoryImpl
文件: /path/to/UserRepositoryImpl.java

```java
@Repository
public class UserRepositoryImpl implements UserRepository {
    // ...实现代码...
    @Override
    public Optional<User> findByUsername(String username) {
        // ...方法实现...
    }

    @Override
    public List<User> findByEmail(String email) {
        // ...方法实现...
    }
}
```

Context Worker 会自动分析代码中的接口、实现类、方法等信息,并生成相应的上下文知识。你可以将这些信息存储在知识库中,而后调用 AI 来直接生成 相应的 name 和 description 描述,以在不同的场景中使用。

使用 MCP 获取上下文知识

结合我们在 AutoDev Workbench 还提供的 MCP(Model Context Protocol)服务,你就可以使用 AI 编程工具通过 MCP 获取已知问题所需要的上下文知识。

总结

欢迎使用 AutoDev Context Worker 来提升你的 RAG 效果:https://github.com/unit-mesh/autodev-workbench 。


或许您还需要下面的文章:

关于我

Github: @phodal     微博:@phodal     知乎:@phodal    

微信公众号(Phodal)

围观我的Github Idea墙, 也许,你会遇到心仪的项目

QQ技术交流群: 321689806
comment

Feeds

RSS / Atom

最近文章

关于作者

Phodal Huang

Engineer, Consultant, Writer, Designer

ThoughtWorks 技术专家

工程师 / 咨询师 / 作家 / 设计学徒

开源深度爱好者

出版有《前端架构:从入门到微前端》、《自己动手设计物联网》、《全栈应用开发:精益实践》

联系我: h@phodal.com

微信公众号: 最新技术分享

标签