0
2
0
0
专栏/.../

TiDB Vector 本地部署体验

 CuteRay  发表于  2024-10-28

今年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)


image-20241025112433476

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

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

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

理论基础

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

tidb-architecture-v6

通过架构图不难看出,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

image-20241028111018420

image-20241028111352389

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

image-20241028141709418

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

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

image-20241028143259321

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

image-20241028143148567

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

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

image-20241028115305923

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

image-20241028115409262

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

image-20241028144141239

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

0
2
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论