首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-04-22 15:21
  • 4580
  • 9262
juejin.cn

二、从 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 来调用的模型。

向量模型的作用:

  • 文本嵌入:将文本转换为向量表示,以便进行相似度计算和检索。
  • 语义理解:通过向量表示捕捉文本的语义信息,用于文本匹配、聚类和分类等任务。
  • 信息检索:通过向量表示将文本与查询进行比较,找到最相关的文本。
  • 降维:将高维文本向量映射到低维空间,便于可视化和存储。

embed model

我们选用模型 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 模型的原因。

all-MiniLM-L6-v2

下载地址:

shell
代码解读
复制代码
git clone https://gitee.com/anziguoer/models models

transformer.js

Transformers.js 的功能设计与 Hugging Face 的 transforms Python 库相同,这意味着您可以使用非常相似的 API 运行相同的预训练模型。这些模型支持不同模式下的常见任务,例如:

📝自然语言处理:文本分类、命名实体识别、问答、语言建模、摘要、翻译、多项选择和文本生成。 🖼️计算机视觉:图像分类、物体检测、分割和深度估计。 🗣️音频:自动语音识别、音频分类和文本转语音。 🐙多模态:嵌入、零样本音频分类、零样本图像分类和零样本物体检测。

image.png

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。
  • 零拷贝、自动版本控制:无需额外基础设施即可管理数据版本。

image.png 安装:

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

安装 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

相关文章

  • 一、从 0 开始构建一个代码库-codebase 介绍
  • 二、从 0 开始构建一个代码库-技术选型
  • 三、从 0 开始构建一个代码库-代码分块技术实践
  • 四、从 0 开始构建一个代码库-向量数据库的选择与集成
  • 五、从 0 开始构建一个代码库-四:RAG 与 codebase 的深度融合
  • 六、从 0 开始构建一个代码库-codebase 的测试与验证
  • 七、从 0 开始构建一个代码库-Trae 编辑器中 Builder 模式的具体实现
  • 八、从 0 开始构建一个代码库-mcp 实践

如果你喜欢LLM、RAG、代码库感兴趣请一键三连,谢谢。

注:本文转载自juejin.cn的demo007x的文章"https://juejin.cn/post/7495598591488000010"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

142
代码人生
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top