二、从 0 开始构建一个代码库-技术选型
上一篇文章中从 0 开始构建一个代码库-codebase 介绍我们介绍了什么是 rag
、codebase
、 以及编辑中 codebase
的作用等内容。 这篇文章我们来介绍一下技术选型,包括代码库的技术选型、embed LLM
、向量数据库、llm
的技术选型等和一些示例。
技术选型
代码库的技术选型
代码库一般是需要跟编辑器结合的,所以代码库的技术选型主要是跟编辑器有关系。我们使用的编辑器是 vscode
、 Trae
,所以代码库的技术选型主要是跟 vscode
,Trea
也一样。 所以开发代码库我们选用 nodeJS
,并且 vscode
开发插件用的是 vscode-extension
库,也是 javascript
。
embed LLM 的技术选型
embed LLM
的技术选型主要是跟 llm
有关系,很多模型产商都提供有 embed LLM
的服务,需要付费使用的, 比如 openai
、anthropic
等。而我们构建的是一个本地项目的代码库,需要轻量、快速、不占用太多用户机器性能,最好是能在本地使用的向量模型, 而且需要能用 JavaScript
来调用的模型。
向量模型的作用:
- 文本嵌入:将文本转换为向量表示,以便进行相似度计算和检索。
- 语义理解:通过向量表示捕捉文本的语义信息,用于文本匹配、聚类和分类等任务。
- 信息检索:通过向量表示将文本与查询进行比较,找到最相关的文本。
- 降维:将高维文本向量映射到低维空间,便于可视化和存储。

我们选用模型 Xenova/all-MiniLM-L6-v2
这也是很多构建本地知识库首选的向量模型。 all-MiniLM-L6-v2
是一个小型语言模型,属于 MiniLM
系列,它通过知识蒸馏技术从更大的模型中压缩而来,旨在保持较高性能的同时减少计算资源需求。
all-MiniLM-L6-v2
是一个高效的轻量级语言模型,适合资源有限的环境,能够胜任多种 NLP
任务。为众多轻量级应用提供了高效且实用的解决方案。
all-MiniLM-L6-v2
模型支持使用 transformer.js
来调用模型, 这也是我们选用 all-MiniLM-L6-v2
模型的原因。

下载地址:
shell
git clone https://gitee.com/anziguoer/models models
transformer.js
Transformers.js
的功能设计与 Hugging Face
的 transforms Python
库相同,这意味着您可以使用非常相似的 API
运行相同的预训练模型。这些模型支持不同模式下的常见任务,例如:
📝自然语言处理:文本分类、命名实体识别、问答、语言建模、摘要、翻译、多项选择和文本生成。 🖼️计算机视觉:图像分类、物体检测、分割和深度估计。 🗣️音频:自动语音识别、音频分类和文本转语音。 🐙多模态:嵌入、零样本音频分类、零样本图像分类和零样本物体检测。

transformer.js
可以在浏览器和 Node.js
中使用 JavaScript
中的机器学习模型。它使用 ONNX
运行时来实现这一点;它适用于已发布ONNX
权重的模型。
ONNX(Open Neural Network Exchange)是一种开放的格式,用于表示深度学习模型。它允许开发者在不同的框架(如PyTorch、TensorFlow等)之间转换和共享模型。ONNX 模型可以在多种平台上运行,包括 CPU、GPU 和专用硬件加速器,从而提高了模型的灵活性和可移植性
www.npmjs.com/package/@xe...
安装:
shell
npm i @xenova/transformers
向量数据库的技术选型
LanceDB 是一个面向人工智能的开源矢量数据库,在存储、管理、查询和检索大规模多模态数据上的嵌入。
LanceDB 的特点:
- 生产级向量搜索:无需管理服务器。
- 存储、查询和过滤向量、元数据以及多模态数据(如文本、图像、视频、点云等)。
- 支持向量相似性搜索、全文搜索和 SQL。
- 原生支持Python 和Javascript/Typescript。
- 零拷贝、自动版本控制:无需额外基础设施即可管理数据版本。
安装:
shell
npm install @lancedb/lancedb
terr-sitter RAT
语法树工具
tree-sitter 是一个解析器生成工具和增量解析库。它可以为源文件构建具体的语法树,并在源文件被编辑时有效地更新语法树。具有以下特点:
- 通用性:足够通用,能够解析任何编程语言。
- 高效性:速度足够快,能够在每次按键时进行解析。
- 鲁棒性:足够健壮,即使存在语法错误也能提供有用的结果。
- 无依赖性:具有纯 C 运行时库,不依赖其他复杂的环境。
在代码库中的作用:
- 构建抽象语法树(AST):可以将代码解析成抽象语法树表示形式,便于对代码进行分析和处理。例如在 Python 代码中,能够将代码解析为包含类定义、函数定义等节点的 AST,清晰地展示代码结构。
- 提取代码结构:通过遍历 AST,提取相关的子树或节点作为代码块,如函数声明、类定义、整个类代码或构造函数调用等。支持从不同粒度进行提取,甚至可以细化到单个变量,有助于维护代码的语义完整性。
- 支持多种语言:具有广泛的语言支持,提供了预构建的针对各种编程语言的解析器,解决了多语言代码库的处理问题,使得在不同语言的代码中都能应用统一的分析方法。
- 增量解析:其关键特性是增量解析,当代码发生变化时,能够高效地更新语法树,非常适合用于 IDE 的语法高亮、自动缩进等功能,为开发者提供实时的代码反馈。
- 代码搜索和分析 :在代码搜索场景中,利用
tree-sitter
提取的代码结构信息,可以更准确地进行语义搜索,例如在构建语义代码搜索系统时,帮助找到与查询相关的代码块。同时,对于代码分析、重构、文档生成等任务也有很大的帮助,能够提取出代码中的关键信息和结构。
在代码库中我们主要使用 tree-sitter
来解析代码,提取代码块 function
、class
等的内容, 并生成 embedding
。

安装 tree-sitter:
shell
npm install tree-sitter
npm install tree-sitter-javascript
npm install web-tree-sitter
sqlite 数据库
sqlite
是一个轻量级的关系型数据库管理系统,它提供了一个简单、高效的方式来存储和管理数据。sqlite
数据库的主要特点包括:
- 轻量级:
sqlite
是一个独立的数据库引擎,不需要额外的服务器进程或配置。它可以直接嵌入到应用程序中,不需要额外的安装或管理。 - 跨平台:
sqlite
支持多种操作系统,包括 Windows、Linux、macOS 等。这使得开发者可以在不同的平台上使用sqlite
数据库,而无需担心兼容性问题。 - 简单易用:
sqlite
的语法简单,易于学习和使用。它提供了简单的 SQL 语言来创建、查询和管理数据库。 - 事务支持:
sqlite
支持事务处理,确保数据的一致性和完整性。事务可以包含多个 SQL 语句,要么全部执行成功,要么全部回滚。 - 支持多种数据类型:
sqlite
支持多种数据类型,包括整数、浮点数、文本、日期和时间等。 - 支持索引:
sqlite
支持索引,用于加快查询速度。可以为表中的列创建索引,以提高查询性能。
使用 sqlite
是因为我们需要将执行 codebaseIndex
后,将代码文件以及代码块的信息存储到数据库中,方便后续的查询。
安装 sqlite:
shell
npm install sqlite3
总结:
codebaseIndex 执行流程:

- 从本地文件系统读取代码文件
- 提取文件扩展名
- 使用 Tree-sitter 将代码拆分为语义块
- 为每个块生成向量嵌入
- 将嵌入向量和元数据存储在 SQLite 数据库中
- 存储在向量数据库中以供检索
技术选型:
- 代码库的技术选型:
nodeJS
、vscode-extension
embed LLM
的技术选型:Xenova/all-MiniLM-L6-v2
、transformer.js
- 向量数据库的技术选型:
LanceDB
- 代码块解析工具:
tree-sitter
- 数据库:
sqlite
依赖安装
node 初始化项目:
shell
npm init -y
git clone https://gitee.com/anziguoer/models models
安装 node 依赖包:
shell
npm install @xenova/transformers
npm install @lancedb/lancedb
npm install tree-sitter
npm install tree-sitter-javascript
npm install web-tree-sitter
npm install sqlite3