写点什么

TiDB Vector 本地部署体验

  • 2024-11-01
    北京
  • 本文字数:2397 字

    阅读完需:约 8 分钟

作者: CuteRay 原文来源:https://tidb.net/blog/1fe8aa8b


今年 4 月份,TiDB 的向量特性正式开放给大家体验,当时只能在 TiDB Cloud 上提交申请,体验、试用。半年的时间过去了,如今想体验 TiDB Vector 的功能已经不需要提交申请,直接在 TiDB Cloud 创建一个集群,新创建的集群虽然版本还是 V7.1.3,但是默认就自带向量功能了。


这里弄一个 demo,体验一下。


-- 创建一张带有向量字段的表,长度是3维USE test;CREATE TABLE embedded_documents (    id INT PRIMARY KEY,    document  TEXT,    embedding VECTOR(3));
-- 往表中插入向量数据INSERT INTO embedded_documents VALUES (1,'大语言模型','[2.1,4.5,6.7]'), (2,'大语言模型实践','[2.6,4.1,7.1]'), (3,'TiDB V7.1.5 文档','[0.7,2.8,8.7]'), (4,'TiDB 从入门到入土','[0.9,2.3,8.1]'), (5,'语文(六年级)','[4.1,4.5,7.7]'), (6,'golang 从入门到入土','[3.1,4.5,5.7]');
-- 根据指定的向量做搜索SELECT *, vec_cosine_distance(embedding, '[1.3,2.6,5.8]') as distance FROM embedded_documents ORDER BY distance;
+----+---------------------------+---------------+----------------------+| id | document | embedding | distance |+----+---------------------------+---------------+----------------------+| 2 | 大语言模型实践 | [2.6,4.1,7.1] | 0.010422578786698833 || 3 | TiDB V7.1.5 文档 | [0.7,2.8,8.7] | 0.013749613899774693 || 4 | TiDB 从入门到入土 | [0.9,2.3,8.1] | 0.014722191279520014 || 1 | 大语言模型 | [2.1,4.5,6.7] | 0.015064725667609857 || 5 | 语文(六年级) | [4.1,4.5,7.7] | 0.031277385366076604 || 6 | golang 从入门到入土 | [3.1,4.5,5.7] | 0.0475918144531462 |+----+---------------------------+---------------+----------------------+6 rows in set (0.09 sec)


复制代码



这里的distance就是两个向量之间的相似度,这个相似度是用vec_cosine_distance函数计算出来的,意味着两个向量之间的夹角越小相似性越高,夹角大小用余弦值来衡量。


这也意味着不管两个向量是否有关联性,总是能计算出一个相似度,distance越小相似度越高。


上述就是最直接、最简单的体验 TiDB Vector 的方式了,但是某些企业受限于网络,无法访问 TiDB cloud,无法连接到 TiDB serverless 服务,导致无法正常体验这一非常有意思的功能,非常可惜,于是这里教大家一种在本地编译部署的方式去体验 TiDB Vector。

理论基础

在内核设计上,TiDB 分布式数据库将整体架构拆分成了多个模块,各模块之间互相通信,组成完整的 TiDB 系统。



通过架构图不难看出,TiDB 有一个非常大的优势,各组件是分离的,存储、计算、调度完全分开,各个组件分别负责各自的功能,彼此之间通过各种 API 进行通信。其中 TiDB Server 属于计算层,或者说 SQL 层,主要负责接受客户端的连接,执行 SQL 解析和优化,最终生成执行计划。TiKV 属于存储层,主要负责存储数据,以及事务支持。PD 则是整个集群的元信息管理模块。


想体验 TiDB Vector 功能,在 TiDB 集群中,首先就需要搞定 TiDB Server,最起码让 TiDB 能够解析对应的 SQL 语法,理解相关的字段类型,比如 VECTOR


其次,可能需要对存储层做一点处理,毕竟向量数据与普通的数据还是存在着区别。PD 层则不需要过多关注,对主要功能来说,应该没有影响,有影响再做单独处理。


搞定以上步骤,一个 ‘定制化’ 的 TiDB 集群架子就有了,接下来考虑的就是如何部署到服务器上了。这里的思路其实也很简单,先通过 tiup 部署启动一个正常的 TiDB 集群,接着通过 tiup cluster patch ,把我们定制的组件替换进正常 TiDB 集群中就好了。




替换完成之后,就会得到一个支持 TiDB Vector 功能的本地化部署的 TiDB 集群。


理论存在,实践开始!

实践部署

第一步,搞定支持向量功能得 TiDB Server 组件。这个当然不是让你去开发一个,别忘了,TiDB 集群中所有组件均是开源的,既然 TiDB Serveless 新创建的集群都支持 TiDB Vector 功能,那就往往意味着,其开源版本中,有一个分支能找到相关源代码,供我们编译部署安装。最简单的就是去查看master 分支,先去PARSER 模块中,找 parser.y 文件中 VECTOR 关键字,找到其再 ast 语法树中对应的类型。然后再在实现 COLUMN TYPE 的位置搜索关键词 TypeTiDBVectorFloat32




接下来就是将 master 分支的代码编译启动 ,尝试看支不支持向量功能。(具体怎么编译启动 TiDB 源码,这里就不做过多介绍,感兴趣的小伙伴可以去看这篇文章:专栏 - TiDB 7.x 源码编译之 TiDB Server 篇,及新特性详解(文末彩蛋) | TiDB 社区



通过编译启动 TiDB Server 的源码,简单测试了一下,发现对于向量功能的支持是完全 OK 的,那接下来需要做的事情,就是将源码编译打包成二进制文件,这点在源码的 ./cmd/tidb-server/目录下执行 go build 就行,然后就会得到一个名称为 tidb-server 的二进制文件,将这个二进制文件打包成 .tar.gz 格式,这样我们就做好了一个定制化的 patch 包了。


同理,将 tikv 源码的 master 分支也编译打包成二进制文件,然后打包压缩成 .tar.gz 格式,具体编译打包方式跟 tidb server 不太一样,具体可以参考 tikv 源码的 contributing 文档



完成前面的步骤,我们会得到两个 .tar.gz 的包,如下图:



有了这两个包之后,就可以开始对正常的集群来进行打 patch ,来实现我们想要的功能了。



有了这两个包之后,就可以开始对前面正常的集群来进行打patch ,来实现我们想要的功能了。



完成整个 patch 操作之后,display 集群,集群中的 tidbtikv 节点会带有 patch 标识。



完成打包之后,就可以简单测试一下新集群向量功能了。



接下来就是开始愉快的基于向量数据库的 AI 之旅了!


发布于: 刚刚阅读数: 3
用户头像

TiDB 社区官网:https://tidb.net/ 2021-12-15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
TiDB Vector 本地部署体验_8.x 实践_TiDB 社区干货传送门_InfoQ写作社区