在先前《预上下文生成》的文章中,我们介绍了预生成上下文的概念和实践:
预生成上下文是指在用户发起查询或生成请求之前,系统针对特定代码仓库、文档或 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 框架。
那么,针对这类需要提供固定知识的场景:
- 内部开发框架。可以分为单个组件的问题,或者多个组件一起使用等,在排查问题时需要知道部分代码信息。
- SDK、API 等。用户通常不想去了解 SDK、API 的实现细节,而是想要了解如何使用它们来完成特定的任务。
- 其它公共代码库。比如,如何使用某个公共库来完成特定的任务。
我们就可以用更高效的方式来生成它们。
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 。
或许您还需要下面的文章: