MySQL 9.0とVECTOR:外部DB不要でAIアプリのEmbeddingを保存するソリューション

MySQL tutorial - IT technology blog
MySQL tutorial - IT technology blog

なぜMySQL 9.0はAI開発者にとって大きな転換点なのか?

RAG(Retrieval-Augmented Generation)システムやレコメンデーション機能を構築したことがあるなら、データの同期に関する悩みに聞き覚えがあるはずです。これまでは、業務データを保存するためのMySQLと、Embedding(埋め込みベクトル)を保存するためのPineconeやMilvusのようなベクトルデータベースを並行して運用するのが一般的でした。しかし、これら2つのシステムを維持するのはコストがかさむだけでなく、データに不整合が生じやすいという欠点がありました。

MySQL 9.0 (Innovation Release) の登場はこの状況を一変させました。正式に VECTOR データ型がサポートされたことで、複雑な外部ツールを追加することなく、使い慣れたデータベース上で直接セマンティック検索を実行できるようになりました。

5分で試せるVECTORクイックスタート

まずは、Dockerを使ってMySQL 9.0を1行のコマンドで起動してみましょう。

docker run --name mysql9 -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 -d mysql:9.0.0

1. Embedding保存用のテーブルを作成する

スマートな書籍検索システムを構築すると仮定しましょう。各書籍には内容を表すベクトルデータを持たせます。この例では、理解しやすいように3次元ベクトルを使用します。

CREATE TABLE books (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255),
    content_embedding VECTOR(3) 
);

2. ベクトルデータの挿入

ベクトルデータは実数(浮動小数点数)の配列です。MySQLにこの形式を認識させるには、STRING_TO_VECTOR 関数を使用します。

INSERT INTO books (title, content_embedding)
VALUES 
('Pythonプログラミング基礎', STRING_TO_VECTOR('[0.1, 0.8, -0.2]Line')),
('美味しい料理のハンドブック', STRING_TO_VECTOR('[0.9, 0.1, 0.5]Line')),
('MySQL学習ガイド', STRING_TO_VECTOR('[0.15, 0.75, -0.1]'));

3. セマンティック検索の実行

キーワードによる完全一致検索ではなく、ユーザーの質問と最も「距離」が近いレコードを検索します。AIモデルを介した質問のベクトルが [0.2, 0.7, -0.15] であると仮定します。

SELECT title, VECTOR_DISTANCE(content_embedding, STRING_TO_VECTOR('[0.2, 0.7, -0.15]'), 'COSINE') AS distance
FROM books
ORDER BY distance
LIMIT 2;

覚えておくべき重要な関数

MySQL 9.0でベクトルを扱う際、以下の4つの主要な関数を覚えておけば十分です。

  • STRING_TO_VECTOR(): テキスト文字列を保存用のバイナリ形式に変換します。
  • VECTOR_TO_STRING(): バイナリを配列形式にデコードして、アプリケーションで表示できるようにします。
  • VECTOR_DIMENSION(): 次元の数を確認します。OpenAIの text-embedding-3-small モデルは常に1536次元を返すため、この確認は非常に重要です。
  • VECTOR_DISTANCE(): セマンティック検索の核心であり、類似度を測定するために使用します。

どの距離計算アルゴリズムを選ぶべきか?

MySQL 9.0では、distance_metric パラメータに3つの主要な選択肢が用意されています。

  1. ‘COSINE’: テキストに最適な選択肢です。2つのベクトル間の角度を測定し、テキストの長さに関係なく意味の類似性を見つけ出します。
  2. ‘EUCLIDEAN’: 直線距離(ユークリッド距離)を測定します。画像認識や音声認識のタスクで効果を発揮することが多いです。
  3. ‘DOT_PRODUCT’: 内積。ベクトルがすでに正規化(normalized)されている場合、これを計算に使用することで最高の処理速度が得られます。

パフォーマンスの課題:現実的な数値

ベクトルデータは多くのリソースを消費します。1536次元のベクトル(float32を使用)は、1行あたり約6KBを消費します。100万件のレコードがある場合、Embeddingを保存するだけで約5.7GBの容量が必要になります。

現在のバージョン9.0では、MySQLは距離計算のために全テーブルスキャン(Full Table Scan)を実行します。データ量が増えると、クエリの速度は大幅に低下します。私のアドバイスとしては、ベクトル検索を行う前に、category_idcreated_at などの従来の WHERE 句によるフィルタリングを組み合わせて、計算範囲を絞り込むことです。

実装における実践的なアドバイス

実際のプロジェクトに適用する過程で、私が学んだ3つの重要な注意点を紹介します。

1つ目は、ハイブリッド検索(Hybrid Search)を活用することです。 全文検索(Full-text search)を捨てないでください。キーワードの完全一致とセマンティック検索の結果を組み合わせることで、最良の結果が得られることが多いです。

2つ目は、次元数(Dimensions)に注意することです。 カラムを VECTOR(1536) と定義していても、AIモデルがアップデートされて1024次元を返すようになった場合、MySQLは即座にエラーを吐きます。アプリケーション層で常にベクトルのサイズをチェックするステップを設けてください。

3つ目は、LTS(長期サポート)ロードマップを考慮することです。 MySQL 9.0はInnovationリリースであり、機能が急速に変更される可能性があります。銀行のプロジェクトや5〜10年の安定性が求められるシステムの場合は、9.x LTS版を待つべきです。逆に、今すぐAI機能を活用して差別化を図りたいのであれば、MySQL 9.0は避けて通れないツールです。

MySQLにベクトル機能を直接統合することで、システムアーキテクチャを大幅に簡素化できます。2つの異なるデータベース間の同期に悩まされることもありません。ぜひアップグレードして、既存のデータ基盤の上でAIのパワーを体感してみてください。

Share: