从 0 开始构建一个代码库-codebase 介绍
RAG 相关内容
RAG是什么,RAG的发展历程?
RAG(Retrieval-Augmented Generation)即检索增强生成,是一种结合信息检索与文本生成的技术架构。它通过以下两个核心组件工作:
- 检索组件:从知识库中检索与输入相关的文档片段
- 生成组件:基于检索结果生成更准确、可靠的回答
RAG的发展经历了几个关键阶段:
- 2021年:引入稠密检索(Dense Retrieval)技术,显著提升检索质量
- 2022年:与大型语言模型(如GPT-3)结合,形成现代RAG架构
- 2023年至今:RAG成为企业级AI应用的标准,广泛应用于客服、医疗、法律等领域
RAG 在传统知识问答领域的应用
在传统知识文案工作流程中,RAG技术主要发挥以下作用:
-
知识检索增强
- 自动关联分散在手册、FAQ、案例库中的相关内容
- 解决传统关键词检索的"词汇不匹配"问题
- 示例:客服对话中自动关联常见问题答案
-
内容生成辅助
- 基于检索结果自动生成文案初稿
- 保持专业术语和表达风格的一致性
- 示例:医疗报告生成时确保符合行业规范
-
质量校验
- 通过检索验证生成内容的准确性
- 自动标注内容中需要人工复核的部分
- 示例:金融产品说明书中风险提示的自动校验
-
多版本管理
- 跟踪不同版本文案的知识来源
- 自动识别内容更新导致的知识变更
- 示例:产品说明书随法规变化的版本控制
RAG 的流程图

从上图中可以看到构建一个 RAG
需要下面的概念和技术:
1、知识库(Documents):存储所有的知识内容,包括文本、图片、音频等。 2、文档嵌入(Document Embeddings):将文档内容转换为向量表示,以便进行相似度计算。
- chunk ( 文档块)
- chunkSize (文档快大小)
- overloop (文档重复数)
3、向量数据库(Vector Database):将文档内容转换为向量表示,并存储在数据库中,以便快速检索。 下面是常见的向量数据库:
4、检索组件(Retriever):从向量数据库中检索与输入相关的文档片段。 5、构建 RAG
的 prompt
模板 6、LLM(最终回答用户的问题)
codebase 相关内容
什么是 codebase?
Codebase,直译为代码库,指的是一个项目中所有源代码文件的集合,它包含了项目开发过程中所编写的各类代码、配置文件以及相关文档等内容。Codebase 是软件项目的核心资产,它承载着项目的业务逻辑、功能实现和技术架构。
为什么要做 codebase?
做代码库主要是为了帮助用户更好地理解和处理代码相关的工作,以提高开发效率和代码质量。
我们先了解一下 Trae 代码编辑器的 #Folder:
功能,它可以帮助用户更好地理解项目。
如果你使用过 Trae
代码编辑器中 Builder
模式的 #Folder:
功能,可能熟悉它对理解代码库的作用。无论你需要查找相关文件、跟踪执行流程还是了解如何使用类和方法,#Folder:
都会收集必要的上下文来提供帮助。

在Trae
代码编辑器中 Builder
模式中,有 #File
、#code
、#Folder
等功能,它们都可以帮助我们更好地理解代码库。让 LLM
更好的理解代码库,从而更好的帮我们写整个项目的代码,让我们的工作效率更高。这些功能都离不开代码库的支持。

构建代码库有下面几个重要得点:
1、理解代码库 :对于大型或复杂的项目,理解其结构、各部分的功能以及代码之间的关系是一项具有挑战性的任务。代码库相关的功能(如 Cursor
代码编辑器的 @codebase
功能)。帮助用户查找相关文件、跟踪执行流程、理解类和方法的使用方式等,从而更轻松地理解整个代码库。
2、自然语言提问:当用户对项目有疑问并以自然语言提出问题时,如 "这个 git 存储库是关于什么的?" 等,代码库能够用准确、相关的信息进行回答,满足用户对代码库相关知识的查询需求。这对于新接触项目的开发人员来说尤为重要。
3、提供上下文代码片段与分析模式:代码库可以提供上下文代码片段,帮助用户更直观地看到代码的实际应用情况。同时,还能分析代码使用模式,包括特定类和方法的使用方式、类构造函数和实现的详细信息等,有助于用户学习和借鉴代码库中的优秀实践,改进自己的代码。
4、跟踪和利用代码引用: 通过跟踪代码引用,代码库能够确定代码库中代码元素的使用位置,并为所有答案提供来源参考。这对于代码的维护、调试和重构非常重要,可以快速定位到代码的使用场景,了解其依赖关系。
5、辅助代码生成和建议: 利用收集到的上下文信息,代码库可以辅助代码生成,为用户提供代码建议。这在开发过程中可以提高代码编写的效率和质量,减少错误和重复工作。
6、弥补现有语言模型的不足: 现在的大型语言模型虽然在一般编程问题上有一定的回答能力,但对于特定的代码库,由于不了解其中定义的类、方法和项目的整体目的,无法准确回答相关问题。因此,构建专门的代码库可以针对特定代码库提供更准确的答案,避免出现虚构答案的情况。
如何做 codebase,需要哪些技术?


codebase 在现在的编程中占据了很重要的位置,而且也是个大编辑器都在做的事情。(Trae
、 Marscode
、vscode
、cursor
、 Jetbrans june
等)
codebase 本质也是 RAG 的典型应用场景。那么 codebase 相关的技术也少不了 [RAG 的传统技术](#RAG 的传统技术 "#rag-%E7%9A%84%E6%B5%81%E7%A8%8B%E5%9B%BE")。
代码分块技术: 由于嵌入模型处理文本的长度有限,且代码具有特定的结构和语义,做代码库需要采用合适的代码分块技术。与传统简单的按固定长度或段落分块文本不同,对于代码分块,不仅有方法 / 类级别分块,更强调语法级别分块,如将代码解析为抽象语法树(AST),根据 AST 的结构提取相关子树或节点作为分块,以保持代码的语义完整性。例如,使用 langchain
和 llama-index
等库中的分块工具,以及利用 tree-sitter
进行语法级别的代码分块。
抽象语法树(AST)处理技术: 为了更好地理解代码的结构和语义,做代码库需要掌握 AST
处理技术。通过将代码解析为 AST
,可以方便地遍历和分析代码的各个组成部分,如函数声明、类定义等。Python
有内置的ast
库用于处理 Python
代码的 AST
,但对于多语言的代码库,需要像 tree-sitter
这样更具语言通用性的工具来构建和处理 AST
,以实现跨语言的代码分析和处理。
使用语法树来进行代码块的拆分,也是保证 codebase 的质量的重要方法。
vscode、Trae、cursor 等编辑器是如何做 codebase 的?
在这些现代编辑中,都在做 codebase
相关的功能。在国内 Trae
是第一个做 codebase
的编辑器。在接下来的系列文章中,我会介绍 Trae
中的 Builder 模式功能的实现技术。
