SQL によるベクトル検索を始める
TiDB は MySQL 構文を拡張してベクトル検索サポートし、新しいベクトルデータ型といくつかのベクトル関数を導入します。
このチュートリアルでは、SQL文だけを使ってTiDB Vector Searchを使い始める方法を説明します。1 MySQLコマンドラインクライアント使って以下の操作を実行する方法を学習します。
- TiDB クラスターに接続します。
 - ベクターテーブルを作成します。
 - ベクトル埋め込みを保存します。
 - ベクター検索クエリを実行します。
 
注記:
ベクター検索機能はベータ版です。予告なく変更される可能性があります。バグを発見した場合は、GitHubで問題報告を行ってください。
注記:
ベクトル検索機能は、TiDB Self-Managed、 TiDB Cloudスターター TiDB Cloudエッセンシャル利用できますTiDB Cloud専用 Self-ManagedおよびTiDB Cloud Dedicatedの場合、TiDBバージョンはv8.4.0以降である必要があります(v8.5.0以降を推奨)。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- MySQLコマンドラインクライアント (MySQL CLI) がマシンにインストールされています。
 - TiDB クラスター。
 
TiDB クラスターがない場合は、次のように作成できます。
- (推奨) TiDB Cloud Starter クラスターの作成に従って、独自のTiDB Cloudクラスターを作成します。
 - ローカルテストTiDBクラスタをデプロイまたは本番のTiDBクラスタをデプロイに従って、v8.4.0 以降のバージョンのローカル クラスターを作成します。
 
始めましょう
ステップ1. TiDBクラスターに接続する
選択した TiDB デプロイメント オプションに応じて、TiDB クラスターに接続します。
クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログで、 「接続先」ドロップダウンリストから「MySQL CLI」を選択し、「接続タイプ」のデフォルト設定を「パブリック」のままにします。
まだパスワードを設定していない場合は、 「パスワードの生成」をクリックしてランダムなパスワードを生成します。
接続コマンドをコピーしてターミナルに貼り付けます。以下は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データ型を指定して列をベクター列として定義できます。
たとえば、3 次元の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. テーブルにベクトル埋め込みを挿入する
ベクトル埋め込みを持つ 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
注記
この例では、ベクトル埋め込みの次元を簡略化し、デモンストレーションの目的で 3 次元ベクトルのみを使用します。
実際のアプリケーションでは、数百または数千の次元を持つベクトル埋め込みが生成されることがよくあり埋め込みモデル 。
ステップ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.ベクター検索クエリを実行する
全文検索と同様に、ベクター検索を使用する場合、ユーザーはアプリケーションに検索用語を提供します。
この例では、検索語は「泳ぐ動物」であり、対応するベクトル埋め込みは[1,2,3]と仮定されています。実際のアプリケーションでは、埋め込みモデルを使用してユーザーの検索語をベクトル埋め込みに変換する必要があります。
次のSQL文を実行すると、TiDBはテーブル内のベクトル埋め込み間のコサイン距離( vec_cosine_distance )を計算してソートし、 [1,2,3]に最も近い上位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)
検索結果の 3 つの用語は、クエリされたベクトルからのそれぞれの距離によって並べ替えられます。距離が小さいほど、対応するdocument関連性が高くなります。
したがって、出力によれば、泳いでいる動物は魚、または泳ぐ才能のある犬である可能性が最も高いです。