📣

TiDB Cloud Serverless 现已更名为
Starter
!此页面由 AI 自动翻译,英文原文请见
此处。

使用 SQL 快速入门向量搜索

TiDB 扩展了 MySQL 语法,支持 Vector Search,引入了新的 Vector data types 和多个 vector functions

本教程演示了如何仅使用 SQL 语句在 TiDB 中开始向量搜索。你将学习如何使用 MySQL command-line client 完成以下操作:

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

前提条件

完成本教程,你需要:

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

开始操作

Step 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 Self-Managed 集群启动后,在终端中执行你的集群连接命令。

    以下是 macOS 的示例连接命令:

    mysql --comments --host 127.0.0.1 --port 4000 -u root

    Step 2. 创建向量表

    在创建表时,可以通过指定 VECTOR 数据类型,将某一列定义为 vector 列。

    例如,要创建一个名为 embedded_documents,包含一个三维 VECTOR 列的表,使用你的 MySQL CLI 执行以下 SQL 语句:

    USE test; CREATE TABLE embedded_documents ( id INT PRIMARY KEY, -- 用于存储文档的原始内容。 document TEXT, -- 用于存储文档的向量表示。 embedding VECTOR(3) );

    预期输出如下:

    Query OK, 0 rows affected (0.27 sec)

    Step 3. 插入向量嵌入到表中

    embedded_documents 表插入三个文档及其 vector embeddings

    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

    Step 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)

    Step 5. 执行向量搜索查询

    类似全文搜索,用户在使用向量搜索时会向应用提供搜索词。

    在本例中,搜索词为 “a swimming animal”,其对应的向量嵌入假设为 [1,2,3]。在实际应用中,你需要使用 embedding 模型将用户的搜索词转换为向量嵌入。

    执行以下 SQL 语句,TiDB 将通过计算并排序表中向量嵌入的余弦距离(vec_cosine_distance),找到与 [1,2,3] 最接近的前三个文档。

    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)

    搜索结果中的三个词条按照它们与查询向量的距离排序:距离越小,相关性越高。

    因此,根据输出,最有可能的“会游泳的动物”是鱼,或者是擅长游泳的狗。

    文档内容是否有帮助?