
通常、これには複数のデータベースが必要ですが、リアルタイムのデータと分析を扱うようには設計されていません。これらはすべて、現在ではすべての AI アプリケーションに必須となっています。
言い換えれば、AIアプリケーションには、複数のデータタイプを横断する複雑なクエリと、エンタープライズグレードの大規模なパフォーマンスが求められます。このガイドでは、SingleStoreの統合データベースプラットフォームを活用して、SQLまたはJSONによる「シングルショット取得」による基本的なベクトル演算を超えた高度なAIアプリケーションを構築する方法を説明します。
SingleStore の違いについて詳しく知りたい方は、Retrieval Augmented Generation (RAG) のあらゆるユースケースに当てはまるシングルショット検索の例をご覧ください。以下のクエリでは、ベクトル検索と豊富な分析機能を用いて、特定のユーザーに推奨されるすべての映画を1回のラウンドトリップで取得しています。
1WITH2 table_match AS (3 SELECT4 m.title,5 m.movieId,6 m.vector7 FROM8 user_choice t9 INNER JOIN movie_with_tags_with_vectors m ON m.title = t.title10 WHERE11 userid = 'user1'12 ),13 movie_pairs AS (14 SELECT15 m1.movieId AS movieId1,16 m1.title AS title1,17 m2.movieId AS movieId2,18 m2.title AS title2,19 DOT_PRODUCT(m1.vector, m2.vector) AS similarity20 FROM21 table_match m122 CROSS JOIN movie_with_tags_with_vectors m223 WHERE24 m1.movieId != m2.movieId25 AND NOT EXISTS (26 SELECT27 128 FROM29 user_choice uc30 WHERE31 uc.userid = 'user1'32 AND uc.title = m2.title33 )34 ),35 movie_match AS (36 SELECT37 movieId1,38 title1,39 movieId2,40 title2,41 similarity42 FROM43 movie_pairs44 ORDER BY45 similarity DESC46 ),47 distinct_count AS (48 SELECT DISTINCT49 movieId2,50 title2 AS Title,51 ROUND(AVG(similarity), 4) AS Rating_Match52 FROM53 movie_match54 GROUP BY55 movieId2,56 title257 ORDER BY58 Rating_Match DESC59 ),60 average_ratings AS (61 SELECT62 movieId,63 AVG(rating) AS Avg_Rating64 FROM65 ratings66 GROUP BY67 movieId68 )69SELECT70 dc.Title,71 dc.Rating_Match as 'Match Score',72 ROUND(ar.Avg_Rating, 1) AS 'Average User Rating'73FROM74 distinct_count dc75 JOIN average_ratings ar ON dc.movieId2 = ar.movieId76ORDER BY77 dc.Rating_Match DESC78LIMIT79 5;
詳細を掘り下げる前に、まずはいくつかの基本的な概念を見てみましょう。これらの概念をすでにご存知の方は、実際の応用セクションに進んでください。
ベクトルデータベースの概念を理解する
ベクトルデータベースとは何ですか?
ベクトルデータベースは、高次元ベクトルの保存と検索を目的として設計された特殊なデータベースシステムで、主にAIや機械学習アプリケーションで使用されます。これらのベクトルは、機械学習モデルによって作成された、テキスト、画像、音声などのデータの数値表現(埋め込み)です。
埋め込み
埋め込みとは、生データからセマンティックな意味を捉える密な数値ベクトルです。埋め込みはベクトルと互換的に使用される場合もあります。例えば、テキスト埋め込みは1536次元ベクトル(OpenAIのモデルでよく使用されます)であり、類似したテキストは類似したベクトル表現を持ちます。埋め込みの主な特徴は以下のとおりです。
- ベクトル空間内で意味関係が保存される
- 類似アイテムのベクトル間の距離は小さい(dot_productなどのよく知られた方法を使用して測定されることが多い)
- セマンティック検索と類似性の比較が可能
- 次元数は通常128から1536以上である
- 埋め込みは埋め込みモデルにデータを渡すことによって生成される。
ベクトル類似度メトリクス
ベクトル データベースは、ベクトルを比較するためにいくつかの類似性メトリックを使用します。
ドット積
- 対応するベクトル要素の単純な乗算と和
- 値が高いほど類似性が高いことを示します
- 同様の大きさのベクトルを比較するのに最適です
コサイン類似度
- ベクトル間の角度の余弦を測定します
- 範囲: -1 ~ 1 (1 が最も類似)
- 異なる大きさのベクトルを比較するのに適しています
ユークリッド距離
- ベクトルの端点間の直線距離を測定します
- 値が低いほど類似性が高いことを示します
- ベクトルを絶対値で比較するのに適しています
ベクトルインデックス法
インデックスとは、データ検索のための最適化されたパスを提供する追加のデータ構造(インデックス)を作成することで、データ検索操作の速度を向上させるデータ構造技術です。SingleStoreは、効率的な類似性検索のために、特殊なベクトルインデックスをサポートしています。
階層型ナビゲイブル・スモール・ワールド(HNSW)
- 階層的なグラフ構造を作成する
- 高い再現率による優れた検索性能
- メモリ使用量の増加
- 高精度の要件に最適
積量子化と高速スキャンを備えた逆行列ファイル (IVF_PQFS)
- クラスタリングとベクトル圧縮を組み合わせる
- 速度、メモリ、精度の優れたバランス
- インデックス構築の大幅な高速化
- 大規模なデータセットの本番環境への導入に最適
HNSW と IVF_PQFS の選択は、要件によって異なります。
- 精度が重要でメモリが利用可能な場合はHNSWを使用する
- 大規模なデータセットやメモリ制約を扱う場合はIVF_PQFSを使用する
他のデータベースとは異なり、SingleStoreでは、異なるクエリユースケースに合わせて、同じ列にこれらのインデックスを両方作成できます。さらに、ベクトルにインデックスを作成すると、データはすぐにクエリに使用できるようになります。これは、インデックス作成を非同期かつ増分的に実行する一部のベクトル専用データベースでは通常不可能です。
現実世界のアプリケーション
実装の詳細に入る前に、SingleStore の統合アプローチが効果を発揮する実用的なシナリオをいくつか見てみましょう。
リアルタイムの商品レコメンデーション
従来、商品のレコメンデーションはイベント発生後に行われ、データウェアハウスでバッチモードで分析が実行されます。これは「次セッションのパーソナライゼーションおよびレコメンデーション」と呼ばれます。SingleStoreを使用すると、ユーザーはKafkaストリームからストリーミングデータを取り込み、ライブ分析を実行し、それらをベクトルと組み合わせることで、リアルタイムの「セッション内」レコメンデーションおよびパーソナライゼーションシステムを構築できます。
1-- Combine real-time inventory, user behavior, and vector similarity2SELECT3 p.product_id,4 p.name,5 p.price,6 i.stock_level,7 DOT_PRODUCT(vec, JSON_ARRAY_PACK('[0.23,0.54,0.43,0.87]') as8similarity_score9FROM products p10JOIN inventory i ON p.product_id = i.product_id11WHERE i.stock_level > 012AND p.category = :user_category13ORDER BY similarity_score DESC14LIMIT 10;
このクエリは、ベクトル類似性とリアルタイム在庫データを組み合わせる方法を示しています。これは、従来のアーキテクチャでは複数のシステムや複雑な ETL が必要になります。
分析機能を備えたセマンティック検索
最新のAIアプリケーションでは、企業データからのデータ拡張だけでなく、リアルタイムの意思決定を行うための最新の分析データも必要となることがよくあります。これは、エージェント型またはエージェントベースのシステムの構築において非常に重要です。例えば、サポートエージェントが既知の問題を抱える顧客をサポートしている場合、正確なデータを提供するために、リアルタイムのログや他のサポートチケットにアクセスし、分析を実行する必要があるかもしれません。SingleStoreは、複数のデータタイプにわたるセマンティック検索と語彙検索の両方を実行でき、分析も一度に実行できるため、エージェント型アプリケーションやこのようなユースケースに最適です。
1-- Search documents and aggregate insights in one query2SELECT3 category,4 COUNT(*) as document_count,5 AVG(6 DOT_PRODUCT(embedding, JSON_ARRAY_PACK('[0.23,0.54,0.43,0.87]'))7 ) as avg_relevance,8 JSON_AGG(title) as matching_titles9FROM documents10WHERE MATCH(TABLE content) AGAINST('body:SingleStore')11GROUP BY category12HAVING avg_relevance > 0.7;
これは、ベクトル検索、全文検索、分析集計を単一のクエリで組み合わせる方法を示しており、複数のラウンドトリップや複雑なアプリケーション ロジック (シングルショット検索) の必要性を排除します。
SingleStoreのベクトル演算に対する独自のアプローチ
マルチモーダルデータストレージ
ほとんどの AI アプリケーションはマルチモーダル データを必要としますが、SingleStore は次の機能を提供することで優れています。
- 従来の SQL 型と並んでネイティブ ベクトル データ型もサポート
- ベクトル、JSON、テキスト、構造化データを同じテーブルに保存する機能
- 新しく挿入されたベクトルはすぐに利用可能(インデックス作成の遅延なし)
- 同じ列上の複数のベクトルインデックスのサポート
- ペタバイト単位のデータに対してミリ秒単位の応答時間を実現するメモリファーストの 3 層アーキテクチャ
統合クエリ機能
SingleStore により以下が可能になります:
- ベクトル類似性検索とSQL分析の単一クエリの組み合わせ
- ベクトル類似性とキーワードマッチングを組み合わせたハイブリッド検索
- ベクトルデータと非ベクトルデータの複雑な結合
- ベクトル検索結果のリアルタイム分析
ベクトル機能
- 次元指定を持つネイティブ VECTOR データ型
- 同じ列に複数のインデックスオプション(HNSW、IVF、PQ)
- 包括的なベクトル演算(ドット積、正規化など)
- BM25ベースのキーワード検索統合
実例:文書検索システムの構築
単一のデータベースを使ってAIまたはエージェントアプリケーション全体を構築するシンプルさを実証するために、ベクトル検索と従来のSQL機能を組み合わせたシンプルなドキュメント検索システムを構築してみましょう。試してみるには、SingleStoreの無料トライアルにご登録ください。
1.テーブルを作成する
1CREATE TABLE documents (2 id BIGINT AUTO_INCREMENT PRIMARY KEY,3 title VARCHAR(255),4 content TEXT,5 embedding VECTOR(1536), -- Embeddings from a model for ex OpenAI6 category VARCHAR(50),7 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,8 metadata JSON,9 FULLTEXT INDEX ft_idx (content), -- For keyword search10 SHARD KEY (id)11);12 13-- Create vector index for similarity search14ALTER TABLE documents15ADD VECTOR INDEX idx_embedding (embedding)16INDEX_OPTIONS '{"metric_type": "DOT_PRODUCT"}';
1INSERT INTO documents (title, content, embedding, category, metadata)2VALUES 3 ('SingleStore Overview', 4 'SingleStore is a distributed SQL database...', 5 '[0.1, 0.2, ..., 0.5]', -- Replace with actual embedding6 'Technical',7 '{"author": "John Doe", "tags": ["database", "technical"]}'),8 ('Vector Search Guide', 9 'Understanding vector similarity search...', 10 '[0.15, 0.25, ..., 0.45]', -- Replace with actual embedding11 'Tutorial',12 '{"author": "Jane Smith", "tags": ["AI", "search"]}');
3. 本番環境対応の検索実装
単一のクエリを作成し、それをストアド プロシージャにラップして、ベクトル類似性検索、キーワード マッチング、SQL 分析を組み合わせることで、エラー処理や接続管理など、エンタープライズ レベルの機能を追加してみましょう。
1-- Create a procedure for robust vector search2DELIMITER //3 4CREATE PROCEDURE search_documents (5 IN search_vector VARCHAR(8000),6 IN search_text VARCHAR(255),7 IN min_score FLOAT,8 IN category_filter VARCHAR(50),9 IN batch_size INT10)11BEGIN12 DECLARE EXIT HANDLER FOR SQLEXCEPTION13 BEGIN14 ROLLBACK;15 RESIGNAL;16 END;17 18 START TRANSACTION;19 20 -- Validate inputs21 IF JSON_VALID(search_vector) = 0 THEN22 SIGNAL SQLSTATE '45000'23 SET MESSAGE_TEXT = 'Invalid vector format';24 END IF;25 26 -- Execute search with timeouts and limits27 SELECT28 title,29 category,30 DOT_PRODUCT(embedding, '[0.1, 0.2, ..., 0.5]') as vector_score,31 MATCH(TABLE content) AGAINST('body:database') as text_score,32 JSON_EXTRACT_STRING(metadata, '$.author') as author,33 (34 DOT_PRODUCT(embedding, '[0.1, 0.2, ..., 0.5]') * 0.7 +35 MATCH(TABLE content) AGAINST('body:database') * 0.336 ) as combined_score -- Calculate combined score (70% vector, 30% text)37FROM documents38WHERE39 category = 'Technical' -- Filter by category40 AND MATCH(TABLE documents) AGAINST(body:'database') > 0 -- Ensure some text relevance41GROUP BY42 category43HAVING44 combined_score > 0.545ORDER BY46 combined_score DESC47LIMIT 10;
クエリは次の列を持つテーブルを返します。
title- 文字列category— 文字列(WHERE句により「Technical」のみが表示されます)vector_score— 浮動小数点数(ドット積の結果、通常は -1 から 1 の間)text_score— フロート(MATCH AGAINSTスコア、通常は0~1)author— 文字列(JSONメタデータから抽出)combined_score— 浮動小数点数(vector_scoreとtext_scoreの加重平均)
結果の例は次のようになります。
.png?width=1024&disable=upscale&auto=webp)
この出力に関する重要な注意事項がいくつかあります。
- WHERE句により、「Technical」カテゴリの結果のみが表示されます。
- WHERE句の条件により、すべての結果はtext_score > 0になります。
- HAVING句により、すべての結果はcombined_score > 0.5になります。
- 結果はcombined_scoreの降順で並び替えられます
- GROUP BYカテゴリは、カテゴリごとに1つの結果を取得することを意味します(この場合、「Technical」でフィルタリングしたため、1つのグループのみ)。
このクエリは、いくつかの主要な SingleStore 機能を示しています。
- DOT_PRODUCTを用いたベクトル類似度検索
- MATCH AGAINSTを使用した全文検索
- JSONフィールド抽出
- 複数の類似性指標を組み合わせた複雑なスコアリング
- 従来の SQL 操作 (GROUP BY、HAVING、ORDER BY)
- すべてを1つの効率的なクエリで
アーキテクチャ上の考慮事項
簡単な例を見てきましたが、アーキテクチャの観点から全体像も考えてみましょう。SingleStoreがスケーラブルなAIスタックにどのように適合するかを以下に示します。
アプリケーション層
- APIレイヤー。ベクトル演算用のREST/GraphQLエンドポイント。SingleStoreクラウドサービス内では、Jupyter Notebookを作成し、Lambda関数と同様にSQLクエリをAPIエンドポイントとして公開できます。また、定期的な非同期ジョブをスケジュールされたノートブックとして実行することもでき、データのローカル処理を実行できるという利点があります。
- サービス層。ビジネスロジックとAIモデルの統合。ここでは、埋め込みモデルを呼び出して生データをベクトルに変換できます。SingleStore内では、オープンソースの埋め込みモデルをJupyterノートブック(現在プライベートプレビュー)で直接実行することもできます。
- データ層。SingleStore は 、次のものを統合したストアとして機能します。
- ベクトル埋め込み
- 運用データ(行ベース、JSON)
- 分析(列データ)
- 全文検索
- リアルタイム更新(Kafkaなど)
- キャッシュ層。頻繁にアクセスされるベクトルやセマンティックLRUキャッシュとしてもオプションで使用可能
統合パターン
- シンプルなアプリケーション向けの直接SQL
- 複雑なアプリケーション向けのORM (例: SQLAlchemy またはDrizzle )
- 既存のシステムとのリアルタイム同期のためのCDC(変更データキャプチャ)入出力
- リアルタイムのベクトル更新のためのストリーミング取り込み
監視と可観測性
- ベクトル演算の遅延を追跡する
- インデックスのパフォーマンスを監視する
- メモリ使用量のアラートを設定する
- ベクトル検索品質メトリクスのロギング
SingleStoreで構築を開始する
セマンティック検索とキーワード検索、そして詳細な分析を用いて様々なデータタイプを取得するという本質的なニーズを考えると、SingleStoreは、大小様々なAIアプリケーション企業が利用する最新のAIアプリケーションに最適です。こちらのチートシートをご覧いただくか、 SingleStore Spacesギャラリーにアクセスして、ぜひお試しください。
本番環境対応のベクトルデータベースを迅速に構築しましょう。今すぐSingleStoreを無料で始めましょう。
よくある質問
