SQL によるベクトル検索を始める
TiDB は MySQL 構文を拡張してベクトル検索サポートし、新しいベクトルデータ型といくつかのベクトル関数を導入します。
このチュートリアルでは、SQL ステートメントのみを使用して TiDB Vector Search を開始する方法を説明しますMySQL コマンドラインクライアントを使用して次の操作を完了する方法を学習します。
- TiDB クラスターに接続します。
- ベクターテーブルを作成します。
- ベクトル埋め込みを保存します。
- ベクトル検索クエリを実行します。
注記:
ベクトル検索機能は、TiDB セルフマネージド クラスターとTiDB Cloudサーバーレスクラスターでのみ使用できます。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- MySQL コマンドラインクライアント (MySQL CLI) がマシンにインストールされています。
- TiDB クラスター。
TiDB クラスターがない場合は、次のように作成できます。
- ローカルテストTiDBクラスタをデプロイまたは本番のTiDBクラスタをデプロイに従ってローカル クラスターを作成します。
- TiDB Cloud Serverless クラスターの作成に従って、独自のTiDB Cloudクラスターを作成します。
始める
ステップ1. TiDBクラスターに接続する
選択した TiDB デプロイメント オプションに応じて、TiDB クラスターに接続します。
- TiDB Cloud Serverless
- TiDB Self-Managed
クラスターページに移動し、ターゲット クラスターの名前をクリックして概要ページに移動します。
右上隅の「接続」をクリックします。接続ダイアログが表示されます。
接続ダイアログで、 「接続先」ドロップダウンリストから「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
の関連性が高くなります。
したがって、出力によると、泳いでいる動物は魚、または泳ぐ才能のある犬である可能性が最も高いです。