MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
MySQL - VECTOR型のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
MySQL - VECTOR型
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == MySQL VECTOR型は、MySQL 9.0 (2024年7月リリース、Innovation Release) で導入されたベクトル埋め込み格納用のデータ型である。<br> 機械学習およびAIアプリケーションにおけるベクトル埋め込み (embeddings) の格納と検索を目的としている。<br> <br> VECTOR型は、最大16,383次元のベクトルを格納でき、セマンティック検索、RAG (Retrieval-Augmented Generation) パイプライン、レコメンデーションシステム、画像類似検索等のユースケースに対応している。<br> <br> VECTOR型は、MySQL 9.0以降のInnovation Releaseで利用可能であり、MySQL 8.4 LTSには含まれていない。<br> Innovation Releaseは短期サポートで新機能が追加されるバージョンであり、LTS Releaseは5年間のプレミアムサポートと3年間の拡張サポートを提供する長期サポートバージョンである。<br> <br> VECTOR型は、InnoDBストレージエンジン専用であり、MyISAMなど他のストレージエンジンでは使用できない。<br> <br> ベクトル距離計算には、<code>DISTANCE()</code> 関数 および <code>VECTOR_DISTANCE()</code> 関数を使用し、コサイン距離、ユークリッド距離、内積の3種類の距離メトリクスがサポートされている。<br> <br> ベクトルインデックスには、HNSW (Hierarchical Navigable Small World) アルゴリズムが採用されており、近似最近傍検索 (ANN) による高速な類似ベクトル検索が可能である。<br> <br><br> == VECTOR型の基礎 == ==== VECTOR型の定義 ==== VECTOR型は、カラム定義時に次元数を指定して使用する。<br> <br> 構文を以下に示す。<br> VECTOR(N) <br> パラメータを以下に示す。<br> * N *: ベクトルの次元数 (1〜16,383) <br> 次元数を省略した場合、デフォルトの2,048次元が使用される。<br> <br> VECTOR型のカラム定義例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> CREATE TABLE documents ( id INT PRIMARY KEY, content TEXT, embedding VECTOR(1536) -- OpenAI Embeddings互換 ); </syntaxhighlight> <br> 下表に、VECTOR型の主要仕様を示す。<br> <br> <center> {| class="wikitable" |+ VECTOR型の仕様 ! 項目 !! 仕様 |- | 定義形式 || VECTOR(N) |- | 次元数範囲 || 1〜16,383 |- | デフォルト次元数 || 2,048 |- | 要素型 || 4バイト単精度浮動小数点 (IEEE 754) |- | ストレージ形式 || バイナリ文字列形式 |- | 最大出力サイズ || 262,128バイト (16 × 16,383) |- | 対応ストレージエンジン || InnoDB専用 |- | 対応バージョン || MySQL 9.0以降 (Innovation Release) |} </center> <br> <u>VECTOR型の要素は、IEEE 754規格の単精度浮動小数点数 (4バイト) として格納される。</u><br> <u>したがって、N次元のベクトルは、<math>\mbox{N} \times 4</math> バイトのストレージ領域を必要とする。</u><br> <br> 例として、1,536次元のベクトルの場合、<math>1,536 \times 4 = 6,144</math> バイトのストレージ領域を使用する。<br> <br> ==== データ形式 ==== VECTOR型のデータは、文字列リテラルまたはバイナリ形式で表現される。<br> <br> 文字列リテラル形式は、角括弧で囲まれたカンマ区切りの数値リストである。<br> "[1.05, -17.8, 32]" <br> 科学記法もサポートされており、以下のような表現も可能である。<br> "[1e0, 2.5e1, 3.2e-2]" <br> VECTOR型のデータ挿入例を以下に示す。<br> <syntaxhighlight lang="mysql"> INSERT INTO documents (id, content, embedding) VALUES (1, 'First document', '[0.1, 0.2, 0.3, 0.4]'), (2, 'Second document', '[1.5, -2.8, 3.1, 0.9]'), (3, 'Third document', '[1e0, 2.5e1, 3.2e-2, 4.1e-1]'); </syntaxhighlight> <br> バイナリ形式は、内部的に使用されるストレージ形式である。<br> 通常のSQL操作では、文字列リテラル形式を使用することが推奨される。<br> <br> ==== 型変換関数 ==== VECTOR型と文字列型の間の変換には、専用の型変換関数を使用する。<br> <br> 下表に、VECTOR型の型変換関数一覧を示す。<br> <br> <center> {| class="wikitable" |+ VECTOR型変換関数 ! 関数 !! 説明 !! 入力 !! 出力 |- | <code>STRING_TO_VECTOR()</code> || 文字列をバイナリベクトルに変換 || 文字列 || バイナリ |- | <code>TO_VECTOR()</code> || <code>STRING_TO_VECTOR()</code>のエイリアス || 文字列 || バイナリ |- | <code>VECTOR_TO_STRING()</code> || バイナリベクトルを文字列に変換 || バイナリ || 文字列 |- | <code>FROM_VECTOR()</code> || <code>VECTOR_TO_STRING()</code>のエイリアス || バイナリ || 文字列 |- | <code>VECTOR_DIM()</code> || ベクトルの次元数を取得 || バイナリ || 整数 |} </center> <br> * <code>STRING_TO_VECTOR()</code> / <code>TO_VECTOR()</code> の使用例 *: <syntaxhighlight lang="mysql"> SELECT STRING_TO_VECTOR('[1, 2, 3, 4]') AS binary_vector; </syntaxhighlight> *: <br> * <code>VECTOR_TO_STRING()</code> / <code>FROM_VECTOR()</code> の使用例 *: <syntaxhighlight lang="mysql"> SELECT VECTOR_TO_STRING(embedding) AS string_vector FROM documents WHERE id = 1; </syntaxhighlight> *: <br> * <code>VECTOR_DIM()</code> の使用例 *: <syntaxhighlight lang="mysql"> SELECT VECTOR_DIM(embedding) AS dimensions FROM documents WHERE id = 1; </syntaxhighlight> <br> <u>型変換関数は、クエリ内でベクトルデータを操作する際に使用される。</u><br> <u>特に、<code>DISTANCE()</code> 関数と組み合わせて使用される場合が多い。</u><br> <br><br> == 距離関数 == ==== DISTANCE()関数 ==== <code>DISTANCE()</code> 関数は、2つのベクトル間の距離を計算する関数である。<br> <br> 構文を以下に示す。<br> DISTANCE(vector1, vector2, 'metric') <br> 下表に、パラメータを示す。<br> <br> <center> {| class="wikitable" |+ パラメータ |- ! パラメータ !! 説明 |- | vector1 || 比較対象の第1ベクトル (VECTOR型または <code>STRING_TO_VECTOR()</code> で変換された文字列) |- | vector2 || 比較対象の第2ベクトル (VECTOR型または <code>STRING_TO_VECTOR()</code> で変換された文字列) |- | metric || 距離メトリクス (COSINE、EUCLIDEAN、DOTのいずれか) |} </center> <br> <code>DISTANCE()</code> 関数の使用例を以下に示す。<br> <syntaxhighlight lang="mysql"> SELECT id, content, DISTANCE(embedding, STRING_TO_VECTOR('[1, 1, 3, 2]'), "COSINE") AS similarity FROM documents ORDER BY similarity LIMIT 5; </syntaxhighlight> <br> <code>VECTOR_DISTANCE()</code> 関数は、<code>DISTANCE()</code> 関数のエイリアスである。<br> どちらを使用しても同じ結果が得られる。<br> <br> <u>※注意</u><br> * <u><code>DISTANCE()</code> 関数は、MySQL HeatWave on OCI および MySQL AIで利用可能である。</u> * <u>MySQL Community Edition および Commercial Editionの標準版では、<code>DISTANCE()</code> 関数の利用に制限がある場合がある。</u> * <u>Cloud SQL for MySQLなど、クラウドサービスでは <code>DISTANCE()</code> 関数が完全にサポートされている。</u> <br> ==== コサイン類似度 / ユークリッド距離 / 内積 ==== <code>DISTANCE()</code> 関数では、3種類の距離メトリクスがサポートされている。<br> <br> 距離メトリクスの比較を以下に示す。<br> <br> <center> {| class="wikitable" |+ 距離メトリクス比較 ! メトリクス !! 計算式 !! 値範囲 !! 用途 |- | COSINE || 1 - コサイン類似度 || 0〜2 || テキスト埋め込み、セマンティック検索 |- | EUCLIDEAN || L2距離 (2点間の直線距離) || 0〜無限大 || 空間的距離、画像検索 |- | DOT || 負の内積 || -無限大〜無限大 || 最大類似度検索、推奨システム |} </center> <br> <center> {| class="wikitable" |+ 距離メトリクスの特徴 |- ! メトリクス !! 特徴 !! 説明 |- | rowspan="5" | コサイン距離 (COSINE) | 計算式 || <math>1 - \frac{\vec{A} \cdot \vec{B}}{\|\vec{A}\| \times \|\vec{B}\|}</math> |- | 値範囲 || <math>0 \sim 2</math><br>ただし、<u>0は完全一致</u>、<u>2は完全不一致</u> の場合である。 |- | colspan="2" | ベクトルの方向の類似度を測定 |- | colspan="2" | ベクトルの大きさには依存しない |- | colspan="2" | テキスト埋め込みベクトルの比較に最適 |- | rowspan="5" | ユークリッド距離 (EUCLIDEAN) | 計算式 || <math>\sqrt{\sum (A_i - B_i)^{2}}</math> |- | 値範囲 || <math>0 \sim \infty</math><br>ただし、<u>0は完全一致</u> の場合である。 |- | colspan="2" | ベクトル間の直線距離を測定 |- | colspan="2" | ベクトルの大きさと方向の両方に依存 |- | colspan="2" | 空間的な距離の測定に最適 |- | rowspan="5" | 内積 (DOT) | 計算式 || <math>- (\sum (A_i \times B_i))</math> |- | 値範囲 || <math>- \infty \sim \infty</math> |- | colspan="2" | ベクトルの射影の大きさを測定 |- | colspan="2" | 負の値として返される (小さい値ほど類似度が高い) |- | colspan="2" | レコメンデーションシステムに最適 |} </center> <br> メトリクス別の使用例を以下に示す。<br> <syntaxhighlight lang="mysql"> -- コサイン距離による検索 SELECT id, DISTANCE(embedding, STRING_TO_VECTOR('[1,2,3]'), "COSINE") AS dist FROM documents ORDER BY dist LIMIT 5; -- ユークリッド距離による検索 SELECT id, DISTANCE(embedding, STRING_TO_VECTOR('[1,2,3]'), "EUCLIDEAN") AS dist FROM documents ORDER BY dist LIMIT 5; -- 内積による検索 SELECT id, DISTANCE(embedding, STRING_TO_VECTOR('[1,2,3]'), "DOT") AS dist FROM documents ORDER BY dist LIMIT 5; </syntaxhighlight> <br><br> == ベクトルインデックス == ==== VECTOR INDEXの作成 ==== <code>VECTOR INDEX</code> は、ベクトルカラムに対するインデックスであり、<u>近似最近傍検索 (ANN) を高速化</u> する。<br> <br> 標準のMySQL 9.0 / 9.1でのVECTOR INDEXサポートは限定的である。<br> Cloud SQL for MySQLやMySQL HeatWaveでは、より高度なVECTOR INDEX機能が提供されている。<br> <br> Cloud SQL for MySQLでのVECTOR INDEX作成構文を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> CREATE VECTOR INDEX idx_embedding ON documents(embedding) USING SCANN DISTANCE_MEASURE = COSINE; </syntaxhighlight> <br> <center> {| class="wikitable" |+ パラメータ |- ! パラメータ !! 説明 |- | idx_embedding || インデックス名 |- | documents(embedding) || テーブル名とカラム名 |- | USING SCANN || インデックスアルゴリズム (SCANNまたはHNSW) |- | DISTANCE_MEASURE || 距離メトリクス (COSINE、EUCLIDEAN、DOTのいずれか) |} </center> <br> <u>VECTOR INDEXの構築には、最低1,000行以上のデータが推奨される。</u><br> <u>行数が少ない場合、インデックスの効果が限定的である。</u><br> <br> * VECTOR INDEXの作成例 (複数メトリクス) *: <syntaxhighlight lang="mysql"> -- コサイン距離用インデックス CREATE VECTOR INDEX idx_embedding_cosine ON documents(embedding) USING SCANN DISTANCE_MEASURE = COSINE; -- ユークリッド距離用インデックス CREATE VECTOR INDEX idx_embedding_euclidean ON documents(embedding) USING SCANN DISTANCE_MEASURE = EUCLIDEAN; </syntaxhighlight> *: <br> * VECTOR INDEXの削除構文 *: <syntaxhighlight lang="mysql"> DROP INDEX idx_embedding ON documents; </syntaxhighlight> <br> ==== HNSWアルゴリズム ==== HNSW (Hierarchical Navigable Small World) は、ベクトルインデックスで使用される <u>近似最近傍検索アルゴリズム</u> である。<br> <br> <center> {| class="wikitable" |+ HNSWの特徴 |- ! 特徴 !! 説明 |- | 階層的グラフ構造 || 複数の階層を持つグラフ構造でベクトルを管理 |- | O(log n) の検索性能 || データ量に対して対数的な検索時間 |- | 高速なANN検索 || 厳密検索よりも高速だが、近似結果を返す |- | メモリ使用量 || インデックス構造のために追加メモリが必要 |} </center> <br> HNSWアルゴリズムの動作原理を以下に示す。<br> # 最上位階層から検索開始 # 現在の階層で最も近いノードを検索 # 次の階層に移動して検索を継続 # 最下位階層で最近傍ノードを特定 <br> HNSWの階層構造は、検索効率を向上させるために使用される。<br> 上位階層では広範囲を探索し、下位階層では詳細な探索を行う。<br> <br> 下表に、HNSWの主要パラメータを示す。<br> <br> <center> {| class="wikitable" |+ HNSWパラメータ ! パラメータ !! 説明 !! 影響 |- | M || 各ノードの接続数 || 検索精度とメモリ使用量に影響 |- | ef_construction || インデックス構築時の探索幅 || インデックス品質と構築時間に影響 |- | ef_search || 検索時の探索幅 || 検索精度と検索時間に影響 |} </center> <br> Mパラメータは、各ノードが持つ接続数を制御する。<br> 値が大きいほど検索精度が向上するが、メモリ使用量も増加する。<br> <br> ef_constructionパラメータは、インデックス構築時の探索幅を制御する。<br> 値が大きいほどインデックス品質が向上するが、構築時間も増加する。<br> <br> ef_searchパラメータは、検索時の探索幅を制御する。<br> 値が大きいほど検索精度が向上するが、検索時間も増加する。<br> <br><br> == 近傍検索 == ==== 基本的な近傍検索 ==== VECTOR型を使用した基本的な近傍検索は、<code>DISTANCE()</code> 関数 と <code>ORDER BY</code> 句を組み合わせて実行する。<br> <br> 基本的なKNN検索 (K-Nearest Neighbors) の例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> SELECT id, content, DISTANCE(embedding, STRING_TO_VECTOR('[1, 1, 3, 2]'), "COSINE") AS similarity FROM documents ORDER BY similarity LIMIT 5; </syntaxhighlight> <br> この検索は、指定されたベクトル [1, 1, 3, 2] に最も近い5件のドキュメントを返す。<br> <br> * 複数カラムを含む近傍検索の例 *: この検索は、カテゴリが <u>technology</u> のレコードの中から、最も類似した10件を返す。 *: <syntaxhighlight lang="mysql"> SELECT id, title, content, DISTANCE(embedding, STRING_TO_VECTOR('[0.1, 0.2, 0.3]'), "COSINE") AS similarity FROM articles WHERE category = 'technology' ORDER BY similarity LIMIT 10; </syntaxhighlight> *: <br> * 検索結果の距離値を表示する例 *: 複数の距離メトリクスを同時に計算することも可能である。 *: <syntaxhighlight lang="mysql"> SELECT id, content, DISTANCE(embedding, STRING_TO_VECTOR('[1,2,3]'), "COSINE") AS cosine_distance, DISTANCE(embedding, STRING_TO_VECTOR('[1,2,3]'), "EUCLIDEAN") AS euclidean_distance FROM documents ORDER BY cosine_distance LIMIT 5; </syntaxhighlight> <br> ==== 近似最近傍検索 (ANN) ==== 近似最近傍検索 (Approximate Nearest Neighbors, ANN) は、厳密な最近傍検索よりも高速だが、<u>近似結果を返す検索手法</u> である。<br> <br> VECTOR INDEXを使用すると、自動的にANN検索が実行される。<br> <br> ANN検索の特徴を以下に示す。<br> <br> <center> {| class="wikitable" |+ ANN検索 vs 厳密検索 ! 項目 !! ANN検索 !! 厳密検索 |- | 検索速度 || 高速 (O(log n)) || 低速 (O(n)) |- | 検索精度 || 近似 (recall依存) || 100% |- | インデックス || 必要 || 不要 |- | メモリ使用量 || 高 || 低 |- | 用途 || 大規模データセット || 小規模データセット |} </center> <br> Recall (再現率) は、ANN検索の精度指標である。<br> Recallが高いほど、厳密検索に近い結果が得られる。<br> <br> Recall計算式を以下に示す。<br> Recall = (ANN検索で取得された正解の数) / (厳密検索での正解の数) <br> 例として、厳密検索で10件の正解があり、ANN検索で9件の正解を取得した場合、<math>\mbox{Recall} = \dfrac{9}{10} = 0.9 = 90 \, \, [ \% ]</math> である。<br> <br> ANN検索のパフォーマンスとRecallのトレードオフを以下に示す。<br> * 高いRecall (95[%]以上) *: 検索精度が高いが、検索時間が増加 * 中程度のRecall (80[%]〜95[%]) *: バランスの取れた性能 * 低いRecall (80[%]未満) *: 検索時間は短いが、精度が低下 <br> ANN検索の使用例を以下に示す。<br> <syntaxhighlight lang="mysql"> -- VECTOR INDEXが存在する場合、自動的にANN検索が使用される SELECT id, content, DISTANCE(embedding, STRING_TO_VECTOR('[1,2,3]'), "COSINE") AS similarity FROM documents ORDER BY similarity LIMIT 10; </syntaxhighlight> <br> ==== フィルタ付き検索 ==== フィルタ付き検索は、WHERE句による条件フィルタリングと近傍検索を組み合わせた検索である。<br> <br> <center> {| class="wikitable" |+ フィルタ付き検索のパフォーマンス特性 |- ! 条件 !! 説明 |- | フィルタ条件が厳しい場合 || 検索対象レコード数が減少し、検索時間が短縮される |- | フィルタ条件が緩い場合 || 検索対象レコード数が多く、検索時間が増加する |} </center> <br> * フィルタ付き検索の例 *: <br> *: 以下の例では、以下に示す条件を満たすレコードを返す。<br> ** 公開日が2024-01-01以降 ** カテゴリが <u>technology</u> または <u>science</u> ** 上記条件を満たすレコードの中で、最も類似した10件 *: <syntaxhighlight lang="mysql"> SELECT id, title, content, DISTANCE(embedding, STRING_TO_VECTOR('[0.1, 0.2, 0.3]'), "COSINE") AS similarity FROM articles WHERE publish_date > '2024-01-01' AND category IN ('technology', 'science') ORDER BY similarity LIMIT 10; </syntaxhighlight> *: <br> * 複数条件のフィルタ付き検索の例 *: <syntaxhighlight lang="mysql"> SELECT id, product_name, price, DISTANCE(feature_vector, STRING_TO_VECTOR('[1,2,3,4,5]'), "COSINE") AS similarity FROM products WHERE price BETWEEN 100 AND 500 AND stock_quantity > 0 AND brand = 'BrandA' ORDER BY similarity LIMIT 20; </syntaxhighlight> <br><br> == サンプルクエリ == ==== セマンティック検索 ==== セマンティック検索は、テキストの意味的類似性に基づく検索である。<br> テキスト埋め込みベクトルを使用して、キーワード検索では発見できない関連文書を検索できる。<br> <br> セマンティック検索のワークフローを以下に示す。<br> # テキストを埋め込みモデル (OpenAI Embeddings、Sentence Transformers等) でベクトル化 # ベクトルをVECTOR型カラムに格納 # クエリテキストをベクトル化 # <code>DISTANCE()</code> 関数で類似文書を検索 <br> テーブル定義例を以下に示す。<br> <syntaxhighlight lang="mysql"> CREATE TABLE documents ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(255), content TEXT, embedding VECTOR(1536), -- OpenAI text-embedding-3-small created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB; </syntaxhighlight> <br> * 文書の挿入例 *: <syntaxhighlight lang="mysql"> INSERT INTO documents (title, content, embedding) VALUES ('Introduction to MySQL', 'MySQL is a relational database...', '[0.12, -0.34, 0.56, ...]'), ('Vector Search Guide', 'Vector search enables semantic search...', '[0.23, 0.45, -0.12, ...]'); </syntaxhighlight> *: <br> * セマンティック検索クエリ例 *: セマンティック検索の応用例を以下に示す。 ** FAQ検索 **: ユーザの質問に最も関連するFAQを検索 ** ドキュメント検索 **: 技術文書や社内ナレッジベースから関連情報を検索 ** ニュース記事検索 **: 類似トピックのニュース記事を検索 *: <syntaxhighlight lang="mysql"> -- クエリ: "database performance optimization"のベクトル SET @query_vector = '[0.15, -0.28, 0.42, ...]'; SELECT id, title, DISTANCE(embedding, STRING_TO_VECTOR(@query_vector), "COSINE") AS similarity FROM documents ORDER BY similarity LIMIT 5; </syntaxhighlight> <br> ==== 画像の類似検索 ==== 画像の類似検索は、<u>画像特徴ベクトルを使用した類似画像の検索</u> である。<br> CNN (Convolutional Neural Network) などの深層学習モデルで画像を特徴ベクトルに変換し、VECTOR型に格納する。<br> <br> 画像検索のワークフローを以下に示す。<br> # 画像を特徴抽出モデル (ResNet、VGG、CLIP等) で特徴ベクトルに変換する。 # 特徴ベクトルをVECTOR型カラムに格納する。 # クエリ画像を特徴ベクトルに変換する。 # <code>DISTANCE()</code> 関数で類似画像を検索する。 <br> テーブル定義例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> CREATE TABLE images ( id INT PRIMARY KEY AUTO_INCREMENT, filename VARCHAR(255), file_path VARCHAR(500), feature_vector VECTOR(512), -- ResNet-50の特徴ベクトル uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB; </syntaxhighlight> <br> * 画像の挿入例 *: <syntaxhighlight lang="mysql"> INSERT INTO images (filename, file_path, feature_vector) VALUES ('cat001.jpg', '/images/cat001.jpg', '[0.45, -0.12, 0.89, ...]'), ('dog001.jpg', '/images/dog001.jpg', '[0.23, 0.67, -0.34, ...]'); </syntaxhighlight> *: <br> * 類似画像検索クエリ例 *: <br> ** 画像類似検索の応用例 ** Eコマース **: 商品画像から類似商品を検索 ** 写真管理 **: 類似写真のグループ化、重複検出 ** 医療画像 **: 類似症例の検索 *: <syntaxhighlight lang="mysql"> -- クエリ画像の特徴ベクトル SET @query_vector = '[0.42, -0.15, 0.78, ...]'; SELECT id, filename, file_path, DISTANCE(feature_vector, STRING_TO_VECTOR(@query_vector), "EUCLIDEAN") AS distance FROM images ORDER BY distance LIMIT 10; </syntaxhighlight> <br> ==== レコメンデーションシステム ==== レコメンデーションシステムは、ユーザの嗜好や商品の特徴をベクトル化し、類似アイテムを推薦するシステムである。<br> <br> レコメンデーションのワークフローを以下に示す。<br> # ユーザの行動履歴や属性を埋め込みベクトルに変換する。 # 商品の特徴や属性を埋め込みベクトルに変換する。 # <code>DISTANCE()</code> 関数でユーザベクトルと商品ベクトルの類似度を計算する。 # 類似度の高い商品を推薦 <br> テーブル定義例を以下に示す。<br> <syntaxhighlight lang="mysql"> CREATE TABLE users ( user_id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(100), user_embedding VECTOR(128) -- ユーザ嗜好ベクトル ) ENGINE=InnoDB; CREATE TABLE products ( product_id INT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(255), category VARCHAR(100), price DECIMAL(10, 2), product_embedding VECTOR(128) -- 商品特徴ベクトル ) ENGINE=InnoDB; </syntaxhighlight> <br> * レコメンデーションクエリ例 *: <br> *: レコメンデーションシステムの応用例を以下に示す。 ** Eコマース **: 商品推薦、関連商品表示 ** 動画配信 **: 映画・番組の推薦 ** 音楽配信 **: 楽曲・アーティストの推薦 *: <syntaxhighlight lang="mysql"> -- ユーザID=123の嗜好ベクトル取得 SET @user_vector = (SELECT user_embedding FROM users WHERE user_id = 123); -- 類似商品の推薦 SELECT product_id, product_name, category, price, DISTANCE(product_embedding, @user_vector, "DOT") AS recommendation_score FROM products WHERE price BETWEEN 10 AND 100 ORDER BY recommendation_score LIMIT 20; </syntaxhighlight> <br><br> == 制限事項 == VECTOR型には、下表のような制限事項が存在する。<br> <br> <center> {| class="wikitable" |+ VECTOR型の制限事項 ! 制限項目 !! 詳細 |- | プライマリキー || VECTOR型カラムはプライマリキーに指定不可 |- | 外部キー || VECTOR型カラムは外部キーに指定不可 |- | ユニークキー || VECTOR型カラムはユニークキーに指定不可 |- | パーティションキー || VECTOR型カラムはパーティションキーに指定不可 |- | DEFAULT句 || VECTOR型カラムにDEFAULT句は使用不可 |- | ヒストグラム統計 || VECTOR型カラムはヒストグラム統計の対象外 |- | 比較演算 || 他の型との比較不可 (同VECTOR型の等価比較のみ可能) |- | ストレージエンジン || InnoDB専用 (MyISAM等は非対応) |- | バージョン || MySQL 9.0以降のInnovation Releaseでのみ利用可能 |- | DISTANCE()関数 || MySQL HeatWave、MySQL AI、Cloud SQL等で利用可能 (標準版は制限あり) |} </center> <br> プライマリキー、外部キー、ユニークキーの制限について、以下に示す。<br> VECTOR型カラムは、これらのキー制約に使用できない。<br> IDカラムなど別のカラムをキーとして使用する必要がある。<br> <br> * 正しい使用例 *: <syntaxhighlight lang="mysql"> -- 正しい: 別のカラムをプライマリキーに使用 CREATE TABLE documents ( id INT PRIMARY KEY AUTO_INCREMENT, content TEXT, embedding VECTOR(128) ); </syntaxhighlight> *: <br> * 誤った使用例 *: <syntaxhighlight lang="mysql"> -- エラー: VECTOR型はプライマリキーに使用不可 CREATE TABLE documents ( embedding VECTOR(128) PRIMARY KEY, content TEXT ); </syntaxhighlight> <br> DEFAULT句の制限について、以下に示す。<br> VECTOR型カラムにはDEFAULT値を指定できない。<br> <br> 誤った使用例を以下に示す。<br> <syntaxhighlight lang="mysql"> -- エラー: VECTOR型にDEFAULT句は使用不可 CREATE TABLE documents ( id INT PRIMARY KEY, embedding VECTOR(128) DEFAULT '[0, 0, 0, ...]' ); </syntaxhighlight> <br> 比較演算の制限について、以下に示す。<br> VECTOR型カラムは、他の型との比較演算ができない。<br> 同一VECTOR型カラム間の等価比較のみ可能である。<br> <br> 等価比較の例を以下に示す。<br> <syntaxhighlight lang="mysql"> SELECT * FROM documents WHERE embedding = STRING_TO_VECTOR('[1, 2, 3]'); </syntaxhighlight> <br><br> == パフォーマンス == VECTOR型の検索パフォーマンスは、検索方法とインデックスの有無によって大きく異なる。<br> <br> 下表に、検索パフォーマンスの比較を示す。<br> <br> <center> {| class="wikitable" |+ 検索方法の比較 ! 検索方法 !! 計算量 !! 精度 !! レイテンシ !! 用途 |- | 厳密KNN検索 (インデックスなし) || <math>O(n)</math> || 100[%] || 高 || 小規模データセット (〜10万件) |- | 近似最近傍検索 (ANN、VECTOR INDEX) || <math>O(\log{n})</math> || Recall依存 || 低 || 大規模データセット (10万件〜) |} </center> <br> <center> {| class="wikitable" |+ 厳密KNN検索と近似最近傍検索 (ANN) の特徴 |- ! 検索方式 !! 特徴 |- | rowspan="4" | 厳密KNN検索 || 全レコードを線形スキャンして距離を計算 |- | 100%の精度を保証 |- | データ量が増えると検索時間が線形的に増加 |- | 小規模データセット (〜10万件) に適している |- | rowspan="4" | 近似最近傍検索 (ANN) || VECTOR INDEXを使用した高速検索 |- | Recall (再現率) に応じた精度 |- | データ量に対して対数的な検索時間 |- | 大規模データセット (10万件〜) に適している |} </center> <br> 下表に、Recallとパフォーマンスのトレードオフを示す。<br> <br> <center> {| class="wikitable" |+ Recallとパフォーマンスのトレードオフ ! Recall !! 検索精度 !! 検索速度 !! 推奨用途 |- | 95[%]以上 || 非常に高い || やや遅い || 高精度が必要な用途 |- | 85[%]〜95[%] || 高い || 速い || 一般的な用途 |- | 70[%]〜85[%] || 中程度 || 非常に速い || 大規模データセット、リアルタイム検索 |- | 70[%]未満 || 低い || 極めて速い || 非推奨 |} </center> <br> メモリ使用量について、以下に示す。<br> VECTOR型カラムは、次元数 × 4バイト/要素のストレージを使用する。<br> <br> メモリ使用量の計算例を以下に示す。<br> * 次元数 *: 1,536 * 要素サイズ *: 4バイト (単精度浮動小数点) * 1レコードのベクトルサイズ *: <math>1,536 \times 4 = 6,144 \, \, \mbox{byte}</math> * 100万レコードの場合 *: <math>6,144 \times 1,000,000 = 6,144,000,000 \, \, \mbox{byte} \cong 5.7 \, \, \mbox{GB}</math> <br> VECTOR INDEXのメモリオーバーヘッドは、インデックスアルゴリズムとパラメータに依存する。<br> HNSWインデックスの場合、元データの1.5〜2倍のメモリを使用する場合がある。<br> <br> パフォーマンスチューニングの推奨事項を以下に示す。<br> * 大規模データセット (10万件以上) では、VECTOR INDEXを作成する * Recallとレイテンシのバランスを考慮してパラメータを調整する * フィルタ条件を使用して検索対象レコード数を削減する * 不要な次元数を削減する (次元削減技術: PCA、t-SNE等) * メモリ容量を考慮してデータセットサイズを計画する <br> パフォーマンス測定の例を以下に示す。<br> <br> <syntaxhighlight lang="mysql"> -- クエリ実行時間の測定 SET @start_time = NOW(6); SELECT id, content, DISTANCE(embedding, STRING_TO_VECTOR('[1,2,3]'), "COSINE") AS similarity FROM documents ORDER BY similarity LIMIT 10; SET @end_time = NOW(6); SELECT TIMESTAMPDIFF(MICROSECOND, @start_time, @end_time) AS query_time_us; </syntaxhighlight> <br><br> == 関連ページ == * [[MySQL - インデックス]] *: インデックスの種類、作成方法、パフォーマンスチューニング * [[MySQL - JSON関数]] *: JSON型の操作とJSON関数の使用方法 * [[MySQL - Generated Columns]] *: 生成カラムの定義と使用方法 <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,MySQL,VECTOR型,ベクトル検索,セマンティック検索,機械学習,AI,埋め込みベクトル,HNSW,近似最近傍検索,ANN,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - MySQL VECTOR型によるベクトル検索とセマンティック検索 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:MySQL]]
MySQL - VECTOR型
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse