OceanBaseはSQL言語によるベクトル検索をサポートしています。本記事では、クイックスタートの方法を紹介します。
前提条件
OceanBaseクラスタのデプロイが完了し、MySQLテナントが作成されていることを確認してください。
OceanBaseデータベースに接続されていることを確認してください。詳細については、接続方法の概要を参照してください。
クイックスタート
ベクトル検索機能の有効化
OceanBaseのベクトル検索では、ob_vector_memory_limit_percentage設定を使ってベクトルインデックスのメモリを設定します:
V4.4.1 より前のバージョンでは、HNSW/HNSW_SQ/HNSW_BQ ベクトルインデックスを使用する前に、手動で
ob_vector_memory_limit_percentageを設定してベクトル機能を有効にする必要があります。最適な検索パフォーマンスを得るために、値は30に設定することを推奨します。デフォルト値のままだと、ベクトルインデックスにメモリが割り当てられず、インデックス作成時にエラーが発生します。IVF/IVF_PQ インデックスは常駐メモリを必要としないため、このパラメータについては気にする必要はありません。設定例は以下の通りです:ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30;V4.4.1 以降のバージョンでは、ベクトル検索機能はデフォルトで有効になっています。デフォルト値の
0は適応モードを意味し、システムがテナント内のベクトルインデックスデータのメモリ使用率を自動調整します。手動で調整する必要はありません:- テナントの実メモリが 8GB 以下の場合、この値は自動的に
40に設定されます。 - テナントの実メモリが 8GB を超える場合、この値は自動的に
50に設定されます。
- テナントの実メモリが 8GB 以下の場合、この値は自動的に
ベクトル列とインデックスの作成
テーブル作成時に、VECTOR(dim) データ型を使用して、指定した列をベクトル列として宣言し、その次元数を指定できます。ベクトルインデックスはベクトル列に作成する必要があり、少なくとも type と distance の 2つのパラメータを指定する必要があります。
例では、ベクトル列 embedding を作成し、ベクトルデータの次元を 3 に設定します。また、embedding 列に HNSW インデックスを作成し、距離アルゴリズムを L2 に指定します。
CREATE TABLE t1(
id INT PRIMARY KEY,
doc VARCHAR(200),
embedding VECTOR(3),
VECTOR INDEX idx1(embedding) WITH (distance=L2, type=hnsw)
);
データ量が多い場合は、データを全量インポートしてからベクトルインデックスを作成することを推奨します。
ベクトルデータの書き込み
ベクトル検索のシナリオをシミュレートするために、まずいくつかのベクトルデータを作成する必要があります。各行データには、データの説明と対応するベクトルが含まれます。例では、'リンゴ' が [1.2,0.7,1.1]'、'ニンジン' が [5.3,4.8,5.4]' に対応するベクトルであると仮定しています。
INSERT INTO t1
VALUES (1, 'リンゴ', '[1.2,0.7,1.1]'),
(2, 'バナナ', '[0.6,1.2,0.8]'),
(3, 'オレンジ','[1.1,1.1,0.9]'),
(4, 'ニンジン', '[5.3,4.8,5.4]'),
(5, 'ほうれん草', '[4.9,5.3,4.8]'),
(6, 'トマト','[5.2,4.9,5.1]');
表示の簡略化のため、この例ではベクトルの次元を 3 次元にし、ベクトルは人工的に生成されたものです。実際のアプリケーションでは、埋め込みモデルを使用して実際のテキストを生成するため、次元は数百から数千に達します。
テーブル内のデータをクエリすることで、書き込みが成功したかどうか確認できます。
SELECT * FROM t1;
期待される実行結果は次のとおりです:
+----+-----------+---------------+
| id | doc | embedding |
+----+-----------+---------------+
| 1 | 苹果 | [1.2,0.7,1.1] |
| 2 | 香蕉 | [0.6,1.2,0.8] |
| 3 | 橙子 | [1.1,1.1,0.9] |
| 4 | 胡萝卜 | [5.3,4.8,5.4] |
| 5 | 菠菜 | [4.9,5.3,4.8] |
| 6 | 西红柿 | [5.2,4.9,5.1] |
+----+-----------+---------------+
6 rows in set
ベクトル検索の実行
ベクトル検索を実行するには、検索条件としてベクトルを指定する必要があります。例えば、'果物' に対応するベクトルが [0.9, 1.0, 0.9] であるすべての要素を見つける場合、対応するSQLは次のとおりです。
SELECT id, doc FROM t1
ORDER BY l2_distance(embedding, '[0.9, 1.0, 0.9]')
APPROXIMATE LIMIT 3;
期待される実行結果は次のとおりです:
+----+--------+
| id | doc |
+----+--------+
| 3 | 橙子 |
| 2 | 香蕉 |
| 1 | 苹果 |
+----+--------+
3 rows in set
関連ドキュメント
- ベクトルデータの詳細については、ベクトルデータを参照してください。
- ベクトルインデックスに関する説明については、ベクトルインデックスを参照してください。