通过 SQL 快速入门向量检索
TiDB 扩展了 MySQL 语法以支持 向量检索,并引入了新的 向量数据类型 以及若干 向量函数。
本教程演示了如何仅使用 SQL 语句在 TiDB 中快速开始向量检索。你将学习如何使用 MySQL 命令行客户端 完成以下操作:
- 连接到你的 TiDB 集群。
- 创建向量表。
- 存储向量嵌入。
- 执行向量检索查询。
前置条件
完成本教程,你需要:
- 在本地安装 MySQL 命令行客户端(MySQL CLI)。
- 一个 TiDB 集群。
如果你还没有 TiDB 集群,可以按如下方式创建:
- (推荐)参考 创建 TiDB Cloud Starter 集群 创建属于你自己的 TiDB Cloud 集群。
- 参考 部署本地测试 TiDB 集群 或 部署生产环境 TiDB 集群 创建 v8.4.0 或更高版本的本地集群。
快速开始
第 1 步:连接到 TiDB 集群
根据你选择的 TiDB 部署方式,连接到你的 TiDB 集群。
进入 Clusters 页面,然后点击目标集群名称进入其概览页面。
点击右上角的 Connect,弹出连接对话框。
在连接对话框中,从 Connect With 下拉列表中选择 MySQL CLI,并保持 Connection Type 的默认设置为 Public。
如果你还未设置密码,点击 Generate Password 生成一个随机密码。
复制连接命令并粘贴到你的终端中。以下是 macOS 的示例:
mysql -u '<prefix>.root' -h '<host>' -P 4000 -D 'test' --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/cert.pem -p'<password>'
当你的 TiDB 自建集群启动后,在终端执行集群连接命令。
以下是 macOS 的示例连接命令:
mysql --comments --host 127.0.0.1 --port 4000 -u root
第 2 步:创建向量表
在创建表时,你可以通过指定 VECTOR 数据类型,将某一列定义为 向量 列。
例如,若要创建一个包含三维 VECTOR 列的 embedded_documents 表,可在 MySQL CLI 中执行如下 SQL 语句:
USE test;
CREATE TABLE embedded_documents (
id INT PRIMARY KEY,
-- Column to store the original content of the document.
document TEXT,
-- Column to store the vector representation of the document.
embedding VECTOR(3)
);
预期输出如下:
Query OK, 0 rows affected (0.27 sec)
第 3 步:向表中插入向量嵌入
向 embedded_documents 表中插入三条带有 向量嵌入 的文档:
INSERT INTO embedded_documents
VALUES
(1, 'dog', '[1,2,1]'),
(2, 'fish', '[1,2,4]'),
(3, 'tree', '[1,0,0]');
预期输出如下:
Query OK, 3 rows affected (0.15 sec)
Records: 3 Duplicates: 0 Warnings: 0
第 4 步:查询向量表
为验证文档是否已正确插入,可查询 embedded_documents 表:
SELECT * FROM embedded_documents;
预期输出如下:
+----+----------+-----------+
| id | document | embedding |
+----+----------+-----------+
| 1 | dog | [1,2,1] |
| 2 | fish | [1,2,4] |
| 3 | tree | [1,0,0] |
+----+----------+-----------+
3 rows in set (0.15 sec)
第 5 步:执行向量检索查询
与全文检索类似,用户在使用向量检索时会向应用提供检索词。
在本示例中,检索词为 “a swimming animal”,其对应的向量嵌入假定为 [1,2,3]。在实际应用中,你需要使用嵌入模型将用户的检索词转换为向量嵌入。
执行如下 SQL 语句,TiDB 会通过计算并排序表中向量嵌入与 [1,2,3] 之间的余弦距离(vec_cosine_distance),找出与该向量最接近的前三个文档。
SELECT id, document, vec_cosine_distance(embedding, '[1,2,3]') AS distance
FROM embedded_documents
ORDER BY distance
LIMIT 3;
预期输出如下:
+----+----------+---------------------+
| id | document | distance |
+----+----------+---------------------+
| 2 | fish | 0.00853986601633272 |
| 1 | dog | 0.12712843905603044 |
| 3 | tree | 0.7327387580875756 |
+----+----------+---------------------+
3 rows in set (0.15 sec)
检索结果中的三个词条按照与查询向量的距离升序排列:距离越小,document 与检索向量的相关性越高。
因此,根据输出,最有可能的“swimming animal”是 fish,其次可能是会游泳的 dog。