メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
ベクトル埋め込みは、テキストを意味を捉えた数値の配列として表現します。同じトピックについての 2 つのテキストは、共通の単語がなくても似たベクトルを持ちます。MySQL には埋め込みを生成する組み込みの方法がありません。VillageSQL の vsql_ai 拡張機能は ai_embedding() を追加します。これは埋め込みモデルを呼び出し、保存とクエリができる JSON 配列としてベクトルを返します。

埋め込みの用途

埋め込みモデルは、テキストを固定長の浮動小数点数のベクトルに変換します。2 つのベクトル間の距離は意味的な類似度を反映します。
  • "dog" と "puppy" → 似たベクトル
  • "dog" と "database index" → 離れたベクトル
これにより、セマンティック検索(クエリと同じことを意味する行を見つける)、クラスタリング、レコメンデーションが可能になります。どれもキーワード検索がうまく扱えないものです。

VillageSQL の場合: ai_embedding()

ai_embedding(provider, model, api_key, text) は埋め込みモデルを呼び出し、JSON 配列の文字列を返します。

文字セットの変換

VillageSQL 0.0.6 以前では、ai_embedding() は binary 文字セットを返し、MySQL の JSON パーサーは binary 文字列を拒否します。結果が JSON 列や JSON 関数に届く前に、CONVERT(... USING utf8mb4) を通す必要があります。
VillageSQL 0.0.7 以降は正しい文字セットを直接返すので、そこでは CONVERT はもう必要ありません。ただし残しても害はないので、0.0.6 以前との互換性のために、以下のすべての例は引き続きそれを使います。

埋め込みの保存

JSON 配列を JSON 列に保存します。

既存の行への埋め込みのバックフィル

モデルの選択

1 つのテーブル内のすべての埋め込みには同じモデルを使ってください。異なるモデルの埋め込みは比較できません。混在させると無意味な類似度スコアになります。 Anthropic は現在、埋め込み API を提供していません。 MySQL も VillageSQL も、ネイティブのベクトル距離関数を提供しません。完全な類似度検索 — 大きなテーブルで最も近いベクトルを見つけること — はアプリケーションコードで実行します。典型的なアーキテクチャは、埋め込みを MySQL に保存し、それらを取得し、アプリケーションでコサイン類似度を計算し、上位の一致を返すというものです。
結果をベクトル類似度ライブラリ(NumPy、scikit-learn、Faiss)に渡して最近傍を見つけます。本番規模の検索には、MySQL と並べて専用のベクトルデータベースを検討してください。

何を埋め込むか

埋め込みの品質は、何を埋め込むかに依存します。いくつかのパターンを示します。
埋め込むテキストは数千トークン未満に保ってください。それより長いテキストは埋め込みモデルによって切り詰められます。

よくある質問

異なるモデルの埋め込みを比較できますか?

いいえ。text-embedding-3-small と gemini-embedding-001 の埋め込みは異なるベクトル空間にあります。互いに比較した類似度スコアは無意味です。列ごとに 1 つのモデルに統一してください。

埋め込みはどのくらいのストレージを使いますか?

1536 個の浮動小数点数の JSON 配列は、テキスト文字列として 1 行あたりおよそ 10〜15 KB です。大きなテーブルでは、これが積み上がります。すべての埋め込みを保存する必要があるのか、それともクエリの対象にするものだけでよいのかを検討してください。

ai_embedding() はバッチ入力をサポートしますか?

いいえ。各呼び出しは 1 つのテキスト入力を処理します。一括での埋め込みには、アプリケーションで行をループし、UPDATE をバッチで呼び出してください。

テキストが長すぎるとどうなりますか?

埋め込みモデルは、そのトークン制限(OpenAI のモデルでは通常 8191 トークン)で入力を切り詰めます。埋め込みは切り詰められたテキストに対して計算されます。長い文書では、全文ではなく、要約または最初の数段落を埋め込んでください。

トラブルシューティング

関連項目