二、从 0 开始构建一个代码库-技术选型

二、从 0 开始构建一个代码库-技术选型

上一篇文章中从 0 开始构建一个代码库-codebase 介绍我们介绍了什么是 ragcodebase、 以及编辑中 codebase 的作用等内容。 这篇文章我们来介绍一下技术选型,包括代码库的技术选型、embed LLM、向量数据库、llm 的技术选型等和一些示例。

技术选型

代码库的技术选型

代码库一般是需要跟编辑器结合的,所以代码库的技术选型主要是跟编辑器有关系。我们使用的编辑器是 vscodeTrae,所以代码库的技术选型主要是跟 vscode ,Trea 也一样。 所以开发代码库我们选用 nodeJS,并且 vscode 开发插件用的是 vscode-extension 库,也是 javascript

embed LLM 的技术选型

embed LLM 的技术选型主要是跟 llm 有关系,很多模型产商都提供有 embed LLM 的服务,需要付费使用的, 比如 openaianthropic 等。而我们构建的是一个本地项目的代码库,需要轻量、快速、不占用太多用户机器性能,最好是能在本地使用的向量模型, 而且需要能用 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 Facetransforms 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 来解析代码,提取代码块 functionclass等的内容, 并生成 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 数据库中
  • 存储在向量数据库中以供检索

技术选型:

  • 代码库的技术选型:nodeJSvscode-extension
  • embed LLM 的技术选型:Xenova/all-MiniLM-L6-v2transformer.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

相关文章

相关推荐
Captaincc39 分钟前
如何有效地使用Cursor AI IDE 的十二个关键方法
ai编程·cursor
围巾哥萧尘3 小时前
「网站开发」从构思到上线——AI 设计电子书籍网站开发全流程(Grok & Coze Space Trae AI & Cercel & Cursor)🧣
cursor·coze·trae
航重名了779483 小时前
Trae AI工具上新评测报告
trae
我怎么能这么帅气3 小时前
从零开始开发一个简单的VS Code插件(3)产品化之路 - 从代码到市场发布
visual studio code
几米哥3 小时前
Augment Code全面解析:新晋AI编程助手全面提升开发效率
aigc·visual studio code
DebugEve3 小时前
Trae史诗级大更新,一波追平Cursor!Rule+MCP+Agent...都来了
ai编程·trae
围巾哥萧尘3 小时前
「环境部署」解决在Vercel上部署中文路径资源的静态网站问题🧣
trae
骑猪兜风2333 小时前
万字长文分析 10 种流行 Agent 框架设计思路,教你如何构建真正可靠的 Agent 系统?
openai·ai编程·cursor
Trae首席推荐官4 小时前
掘金 x Trae「超级体验官」创新实践征文
前端·trae
arriettyandray4 小时前
Qt/C++学习系列之列表使用记录
trae