今年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
集群,集群中的 tidb
、tikv
节点会带有 patch
标识。
完成打包之后,就可以简单测试一下新集群向量功能了。
接下来就是开始愉快的基于向量数据库的 AI 之旅了!