SQL を介して TiDB + AI を使い始める
TiDB は、MySQL 構文を拡張してベクトル検索をサポートし、新しい ベクトルデータ型といくつかのベクトル関数を導入します。
このドキュメントでは、SQL ステートメントだけを使用して TiDB Vector Search を開始する方法を説明します。 MySQLコマンドラインクライアントを使用して、次の操作を実行する方法を学習します。
- TiDBに接続します。
- ベクターテーブルを作成します。
- ベクトル埋め込みを保存する。
- ベクトル検索クエリを実行します。
注記:
- ベクトル検索機能はベータ版であり、予告なく変更される場合があります。バグを発見した場合は、GitHubで問題報告してください。
- ベクトル検索機能は、 TiDBセルフマネージドTiDB Cloud Starter 、 TiDB Cloud Essential 、およびTiDB Cloud Dedicatedで利用できます。TiDB Self-ManagedおよびTiDB Cloud Dedicatedの場合、TiDBのバージョンはv8.4.0以降である必要があります(v8.5.0以降を推奨)。
前提条件
この文書の手順を完了するには、以下が必要です。
- MySQLコマンドラインクライアント(MySQL CLI)がマシンにインストールされています。
- TiDBクラスタ。
TiDBクラスタをお持ちでない場合は、以下の手順で作成できます。
さあ始めましょう
ステップ1. TiDBに接続する
選択したTiDBのデプロイオプションに応じて、TiDBに接続してください。
私のTiDBページに移動し、次に、対象のTiDB Cloud Starterインスタンスの名前をクリックして、概要ページに移動します。
右上隅の「接続」をクリックしてください。接続ダイアログが表示されます。
接続ダイアログで、[接続**方法]ドロップダウンリストから[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次元の列embedded_documentsを持つテーブルVECTOR } を作成するには、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 はテーブル内のベクトル埋め込み間のコサイン距離 ( [1,2,3]計算してソートすることにより、 vec_cosine_distance } に最も近い上位 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の関連性が高くなります。
したがって、出力結果から判断すると、泳いでいる動物は魚か、泳ぎの才能に恵まれた犬である可能性が最も高い。