## 模块 4：自动嵌入与语义搜索

![demo_203-tidb-x-auto-embedding.jpg 85%](https://lab-static.pingcap.com/images/2025/11/27/82b09527459f4fc0b9f238aa5ff7ba06ca9ceed6.jpg)

> [!NOTE]
> 本模块介绍目前处于预览状态的新特性。

在生成式 AI 的推动下，越来越多的向量数据被存储到数据库中。TiDB Cloud Starter 提供了自动嵌入（Auto Embedding）功能，让向量数据的存储与查询变得更加简单便捷。

### 步骤 1：为自动嵌入与语义搜索创建数据表

自动嵌入（Auto Embedding）特性支持直接通过普通文本实现向量检索。你只需插入文本数据，随后可通过文本查询实现语义搜索，TiDB Cloud Starter 会在后台自动将文本转化为向量。关于自动嵌入的更多细节，请参阅[官方文档](https://docs.pingcap.com/tidbcloud/vector-search-auto-embedding-overview/?plan=starter)。

- 在 [终端1](ssh://monitor1-ssh#1) 中连接到 TiDB（如果尚未连接）。

  ```bash
  mysql \
   --comments -u '${LAB:SERVERLESS_CLUSTER_USERNAME}' -p'${LAB:SERVERLESS_CLUSTER_PASSWORD}' \
   -h ${LAB:SERVERLESS_CLUSTER_HOST} -P ${LAB:SERVERLESS_CLUSTER_PORT} \
   --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/certs/ca-certificates.crt \
   -D ${LAB:SERVERLESS_CLUSTER_DATABASE_NAME}
  ```

- 创建启用自动嵌入的新表 `books_embedding`。本步骤采用 `Amazon Titan Embed Text v2` 嵌入模型。`title_vector` 列用于存储 `title` 字段经嵌入后自动生成的向量，由 `GENERATED ALWAYS AS` 子句定义。所有可用文本嵌入模型请参考[该文档](https://docs.pingcap.com/tidbcloud/vector-search-auto-embedding-overview/?plan=starter#available-text-embedding-models)。

  ```sql
  USE ${LAB:SERVERLESS_CLUSTER_DATABASE_NAME};
  DROP TABLE IF EXISTS `books_embedding`;
  CREATE TABLE `books_embedding` (
      `id` int AUTO_INCREMENT,
      `title` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
      `type` enum(
          'Magazine',
          'Novel',
          'Life',
          'Arts',
          'Comics',
          'Education & Reference',
          'Humanities & Social Sciences',
          'Science & Technology',
          'Kids',
          'Sports'
      ) COLLATE utf8mb4_unicode_ci NOT NULL,
      `published_at` datetime NOT NULL,
      `stock` int DEFAULT '0',
      `price` decimal(15, 2) DEFAULT '0.0',
      `title_vector` VECTOR(1024) GENERATED ALWAYS AS (
          EMBED_TEXT("tidbcloud_free/amazon/titan-embed-text-v2", title)
      ) STORED,
      PRIMARY KEY (`id`)
  );
  ```

  ```output
  Query OK, 0 rows affected (0.12 sec)
  ```

- 从 `books` 表中复制 100 本书的数据到 `books_embedding` 表中，`title_vector` 列会由自动嵌入功能自动赋值。

  ```sql
  INSERT INTO books_embedding (title, type, published_at, stock, price)
  SELECT title, type, published_at, stock, price FROM books WHERE id BETWEEN 1 AND 100;
  ```

  ```output
  Query OK, 100 rows affected (0.60 sec)
  Records: 100  Duplicates: 0  Warnings: 0
  ```

- 从 `books_embedding` 表中选择两行，仅选择 `type`（类别）、`title`（书名）和 `title_vector`（书名向量）字段。为节省展示空间，这里仅展示转换为文本后每个向量的前 40 个字符。

  ```sql
  SELECT id, type, title, LEFT(VEC_AS_TEXT(title_vector),40) as title_vec_head
  FROM books_embedding
  WHERE id IN (1,2)
  ORDER BY id\G
  ```

- 输出如下，展示了 `Greatest Love of All` 和 `The Power of Love` 这两本书的信息。

  ```output
  *************************** 1. row ***************************
              id: 1
            type: Education & Reference
           title: Greatest Love of All
  title_vec_head: [-0.019431183,0.045707557,-0.03952369,-0
  *************************** 2. row ***************************
              id: 2
            type: Novel
           title: The Power of Love
  title_vec_head: [-0.035356652,0.025503386,-0.03312202,-0
  2 rows in set (0.01 sec)
  ```

### 步骤 2：执行语义检索

- 由于书名均以向量形式存储在 `title_vector` 列中，你现在可以通过 `VEC_EMBED_COSINE_DISTANCE` 函数结合 `ORDER BY` 子句实现基于关键词的语义相似度检索。

- 让我们检索与 `boys and girls` 语义最为接近的 3 本书。

  ```sql
  SELECT id, title FROM books_embedding
  ORDER BY VEC_EMBED_COSINE_DISTANCE(
      title_vector,
      "boys and girls"
  )
  LIMIT 3\G
  ```

- 在示例输出中，最接近的书名为 `Body & Soul`、`Cars` 和 `ABC`。你可以思考这些结果是否合理。如果你使用的嵌入模型不是 `Amazon Titan Embed Text v2`，实际结果可能略有不同。

  ```output
  *************************** 1. row ***************************
     id: 51
  title: Body & Soul
  *************************** 2. row ***************************
     id: 99
  title: Cars
  *************************** 3. row ***************************
     id: 60
  title: ABC
  3 rows in set (0.02 sec)
  ```

- 现在，让我们检索与 `sadness and happiness` 语义最相关的 3 本书。在示例输出中，会出现如 `Soul`、`Mood`、`Melody` 这样的书名。

  ```sql
  SELECT id, title FROM books_embedding
  ORDER BY VEC_EMBED_COSINE_DISTANCE(
      title_vector,
      "sadness and happiness"
  )
  LIMIT 3\G
  ```

  ```output
  *************************** 1. row ***************************
     id: 51
  title: Body & Soul
  *************************** 2. row ***************************
     id: 44
  title: Mood Indigo
  *************************** 3. row ***************************
     id: 3
  title: Unchained Melody
  3 rows in set (1.10 sec)
  ```

- 你还可以通过实践实验 [使用 Jupyter Notebook 构建向量检索应用](/labs/demo_408) 更深入地了解如何用生成式 AI 构建向量搜索应用。现在，请保持数据库连接，并继续下一个模块。
