📣
TiDB Cloud Essential 开放公测中。此页面由 AI 自动翻译,英文原文请见此处。

通过 SQL 快速入门向量检索

TiDB 扩展了 MySQL 语法以支持 向量检索,并引入了新的 向量数据类型 以及若干 向量函数

本教程演示了如何仅使用 SQL 语句在 TiDB 中快速开始向量检索。你将学习如何使用 MySQL 命令行客户端 完成以下操作:

  • 连接到你的 TiDB 集群。
  • 创建向量表。
  • 存储向量嵌入。
  • 执行向量检索查询。

前置条件

完成本教程,你需要:

如果你还没有 TiDB 集群,可以按如下方式创建:

快速开始

第 1 步:连接到 TiDB 集群

根据你选择的 TiDB 部署方式,连接到你的 TiDB 集群。

    1. 进入 Clusters 页面,然后点击目标集群名称进入其概览页面。

    2. 点击右上角的 Connect,弹出连接对话框。

    3. 在连接对话框中,从 Connect With 下拉列表中选择 MySQL CLI,并保持 Connection Type 的默认设置为 Public

    4. 如果你还未设置密码,点击 Generate Password 生成一个随机密码。

    5. 复制连接命令并粘贴到你的终端中。以下是 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。

    参见

    文档内容是否有帮助?