## モジュール 4: データベースビルトイン埋め込み

![demo_203-tidb-x-auto-embedding-ja.jpg 85%](https://lab-static.pingcap.com/images/2025/12/2/0102af945acc627eeed1bca6e7ee24a88b9e27b2.jpg)

> [!NOTE]
> このモジュールでは、現在プレビュー段階にある機能を紹介します。

次のトピックに進みましょう。生成AIの普及を背景に、ベクトルデータがデータベースに取り込まれるケースが増えています。TiDB Cloud Starter にはオートエンベディング機能があり、ベクトルデータの保存や検索を簡単に実現できます。

### 手順 1. オートエンベディングとセマンティック検索用テーブルを作成する

オートエンベディング機能を使うと、プレーンなテキストをもとにベクトル検索が可能です。テキストデータを挿入してテキストクエリによるセマンティック検索を行うと、TiDB Cloud Starter が裏側で自動的にテキストをベクトルに変換します。オートエンベディングの詳細は [公式ドキュメント](https://docs.pingcap.com/ja/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` カラムには、`GENERATED ALWAYS AS` 句で指定した通り `title` を自動で変換したベクトルが格納されます。利用可能なテキスト埋め込みモデルの一覧は [こちら](https://docs.pingcap.com/ja/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` テーブルから2件取得し、`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）は `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`(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)
  ```

- 生成AIのベクトル検索アプリ開発詳細については、ハンズオンラボ [Jupyter Notebook を使用してベクトル検索アプリケーションを構築する](/labs/demo_408) も参照ください。ここでは接続を維持したまま、次のモジュールに進みます。
