VectorDBを用いたエージェントSQL生成における高基数性カテゴリーデータの管理

エージェント型ワークフローと大規模言語モデル(LLMs は、テキストからSQLシステムへのアプローチを根本的に変え、ユーザがかつてないほど自然言語を使ってデータベースに問い合わせることを可能にした。このようなシステムの進化に伴い、人間の意図を正確なSQLクエリに変換する上で様々な新しい課題に遭遇しています。
重要な問題の1つは、カーディナリティの高いカテゴリーデータの扱いである。この記事では、ベクトルデータベースとエージェント型テキストからSQLへのシステムを統合することで、この課題にどのように対処できるかを探る。具体的には、WaiiとZilliz Cloud(フルマネージドMilvusベクトルデータベース)の組み合わせが、この問題をどのように自動的に処理するかを示す。
##高カーディナリティカテゴリデータへの挑戦
製品カテゴリー、顧客セグメント、トランザクションタイプなど、カテゴリーデータはデータベースではどこにでもある。多くの場合、これらのカテゴリの一意な値の数(カーディナリティ)は管理可能です。例えば、米国の州を表す列の一意な値は、最大でも50個(領土も含む)です。自然言語クエリとデータベース値の間のギャップが小さいため、このようなカーディナリティの低い列は、text-to-SQLシステムにとって比較的扱いやすいものです。
問題は、カーディナリティの高いカテゴリーデータに遭遇したときに生じます。私たちが扱ってきたデータベースの60%以上がこのような状況にあります:何百万ものユニークな製品IDを持つ製品カタログや、何十万もの企業識別子を持つ財務データベースを想像してみてほしい。
データベースは、これらのカテゴリに対して正確で厳密なルックアップを必要としますが、自然言語のクエリはしばしば流動的で不正確です。ユーザーは「人気のスマートフォン」や「最近好調だったハイテク企業」を尋ねるかもしれませんが、このような漠然とした用語を特定のデータベース値に変換することは、従来のテキストからSQLへのアプローチでは不十分であり、豊富なデータに手が届かないままになってしまいます。
既存の手法がうまくいかない理由
多くの場合、text-to-SQLシステムは、高基数性カテゴリデータを含む自然言語クエリを翻訳する際に、以下の2つの方法のいずれかを採用しています:
1.1. 前処理データベース技術: このアプローチは、テキスト検索や正規表現のような伝統的なデータベース機能と入力の前処理を組み合わせたものに依存しています。単純なマッチを扱うことはできますが、特に複雑で微妙なクエリでは、ユーザーの意図を正確に表現するには柔軟性に欠けることがよくあります。これらのテクニックの硬直的な性質は、自然言語の可変性と正確なデータベース値のギャップを埋めるのに苦労する。
2.LLMベースの翻訳:この方法では、システムはLLMを使用し、学習データまたは数ショットの例に基づいて正しいカテゴリ値を予測する。LLMは文脈や自然言語を理解することに優れているが、高いカーディナリティのデータを扱うと、しばしば誤った結果を出す。これは、LLMが完全な(そしてしばしば非公開の)データセットに関する知識を欠いており、学習データに含まれていない何百万ものユニークな識別子を正確に想起するのに苦労するからである。
カーディナリティの高いデータでは、どちらの手法も不十分である。前処理されたデータベース技術は、自然言語クエリのニュアンスを効果的に扱うには、あまりに柔軟性に欠け、リテラルである。一方LLMは、クエリの意図は理解できても、訓練を受けていない大規模で特定のデータセットでは、それを正しい値に確実にマッピングすることができない。このため、自然言語によるクエリを、カーディナリティの高いカテゴリーデータに対する正確なSQLに変換する上で、大きなギャップが残る。
ベクターデータベース
ここでベクトルデータベースが登場する。現代の情報検索は、キーワードマッチではなく、意味検索を行うためにベクトル埋め込みを使用する。ベクトルデータベースは、データの高次元ベクトル表現を格納し、効率的にクエリを実行するために設計されている。我々の文脈では、自然言語クエリと高基数性カテゴリーデータの橋渡しに活用することができる。
その仕組みはこうだ:
1.1.ベクトル埋め込みを作成する: カードの高い列の一意な値ごとにベクトル埋め込みを作成する。この埋め込みは、高次元空間のベクトルにマッピングすることで、値の意味的な意味を捉えます。
2.**高次元空間での高速な類似検索のために最適化されたMilvusのようなベクトルデータベースにこれらの埋め込みを格納する。
3.**ユーザが自然言語によるクエリを送信した場合、LLMを使ってその意図を理解し、予備的なSQLクエリを生成する。カーディナリティの高い列については、特定の値を生成しようとする代わりに、LLMは希望する値の説明や特徴を生成する。
4.ベクトル検索:この記述の埋め込みを使用して、ベクトルデータベース内の膨大な量の一意の値の埋め込みに対して類似検索を実行し、最も関連性の高いカテゴリカル値を検索する。
5.**LLMは、ユーザーのクエリの完全なコンテキストに基づいて、無関係な一致をフィルタリングして、これらの結果を絞り込むことができます。
6.SQL 生成:* 洗練されたカテゴリー値のリストを使って、適切なフィルターと集計を構築し、最終的な SQL クエリーを生成する。
テキストからSQLへの変換でベクトル検索を使う利点
このvectorDBを強化したアプローチにはいくつかの利点がある:
1.スケーラビリティ: 何百万ものユニークな値を持つカテゴリを、大幅なパフォーマンス低下なしに扱うことができる。
2.**LLMの意味理解とベクトルデータベースの正確な想起を組み合わせることで、ユーザーの意図をより正確にデータベースの特定の値に変換することができる。
3.柔軟性:この方法は、システム全体の再トレーニングを必要とすることなく、データベースの変更に適応することができる。
実装上の考慮点
説明したアプローチを実装するために必要なフローをゼロから構築することは当然可能であるが、Waii と Zilliz Cloudを組み合わせることで、大きな利点が得られると考えている。
Waiiは、エージェント型ワークフロー上に構築された世界初のtext-to-SQL APIです。コンパイラ技術と自動生成されたナレッジグラフを組み合わせ、最も正確なクエリ生成を実現します。
Waiiの機能を補完するZilliz Cloudは、AIワークフローを支えるベクトル・データベースです。その拡張性と低レイテンシーで正確な結果を提供する能力により、AIスタックにおける自然な選択肢となっている。
この組み合わせにより、すぐにスケーラブルなソリューションが実現します:
インテリジェントなテキストからSQLへのWaii
自動検出:** Waiiは自動的にこれらの重要度の高いカラムを識別し、手動での設定を不要にします。
スマートな埋め込み生成:** Waii は、さまざまなタイプの列の埋め込みを構築および更新するために、精度とリソース効率の両方を最適化する、カスタマイズされたワークフローを採用しています。
適応的な手法:** Waiiは、様々なタイプのカラムに対して適切な手法を自動的に選択するため、ユーザーによる深い専門知識を必要とすることなく、最適なパフォーマンスを保証します。
Zilliz Cloud for ベクトル意味検索
スケーラビリティ:** Zilliz Cloudは数十億のベクトルを簡単に扱うことができ、高いカーディナリティのデータシナリオに最適です。
最適化されたインデックス作成により、迅速な類似性検索を実現し、本番環境での低レイテンシーを維持するのに重要です。
セキュリティ**](https://zilliz.com/security) およびアクセス制御:Zilliz Cloudは、セキュアなネットワークオプションと暗号化プロトコルにより、エンタープライズグレードのデータセキュリティとプライバシーコンプライアンスを提供します。これにより、転送時および静止時のデータの安全性が確保されます。さらに、Zilliz Cloudは、ロールベースアクセスコントロール(RBAC)やOAuth 2.0を含む洗練されたアイデンティティコントロールとアクセス管理を提供し、安全で集中化されたシングルサインオン(SSO)機能を実現します。
WaiiとZilliz Cloudの統合
シームレスなワークフロー:** Waiiの自動前処理とZillizの強力なベクトルストレージの組み合わせは、text-to-SQLシステムでカーディナリティの高いデータを扱うためのスムーズでエンドツーエンドのソリューションを生み出します。
プロダクション・レディ:** このペアは、実世界の大規模な課題に対応するように設計されており、様々な業界のプロダクション・デプロイメントに適しています。
Waiiの自動検出と埋め込み生成とZillizを活用することで、メタデータ管理や埋め込み生成のためのカスタムコードなしで、テキストからSQLへのシステムで高カードナリティのカテゴリデータを処理するための堅牢なソリューションを実装することができます。
実例
数百万件のイベントを扱うグローバルなイベント管理プラットフォームを考えてみよう。データベーススキーマは以下の通りである:
CREATE TABLE events (
event_id INT PRIMARY KEY、
event_name VARCHAR(255)、
event_date DATE、
category VARCHAR(100)、
total_spent DECIMAL(10, 2)
);
event_name`は、"Global AI Ethics Summit 2024"、"Sustainable Living Expo:例えば、"Global AI Ethics Summit 2024"、"Sustainable Living Expo: Greening Our Future"、"5th Annual Quantum Computing Breakthrough Conference "などがある。
アナリストは次のように尋ねるかもしれない:"先月のAIイベントに費やされた金額は?"
ここでは、さまざまなアプローチがこれをどのように扱うかを説明する:
従来のキーワードマッチング
このアプローチでは、ユーザーから提供された用語を検索用語としてクエリに差し込みます。ここでは大文字と小文字を区別しない全文検索を使用しますが、等号フィルタを生成することもこのシナリオでは一般的です。
SELECT SUM(total_spent)
FROM events
WHERE event_name ILIKE '%AI%'
AND event_date >=
DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month')
AND event_date <
DATE_TRUNC('month', CURRENT_DATE);
問題: この方法では、"Machine Learning Symposium "や "Neural Network Workshop "のような、AIに関連するものの、名前に "AI "が含まれていないイベントを見逃してしまいます。また、"HAIR styling convention "のようなイベントも間違って含まれてしまうかもしれません。
ナイーブLLMアプローチ
このアプローチでは、LLMは検索に関連しそうな複数の用語を生成し、そこからフィルタを構築します。これはオプションで、カラムのサンプル値やデータベースに関する追加コンテキストを使って行うことができる。通常、次のようなものが生成される:
SELECT SUM(total_spent)
FROM events
WHERE (event_name ILIKE '%AI%')
OR event_name ILIKE '%人工知能%'
OR event_name ILIKE '%機械学習%'.
OR event_name ILIKE '%ニューラルネットワーク%')
AND event_date >=
DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month')
AND event_date <
DATE_TRUNC('month', CURRENT_DATE);
問題点:* これはより多くのAI関連イベントを捕捉する一方で、まだ定義済みの用語リストに制限されており、より具体的または斬新なAI関連名を持つイベントを見逃す可能性がある。また、無関係なイベントが見つかるという問題もまだ残っています。
ベクトルDB+LLMアプローチ
以下の図は全体の流れを表している。左側はイベントテーブルに対して行われる前処理、右側はクエリーを生成するフローを示している。
図- Zilliz CloudとWaiiの連携の仕組み](https://assets.zilliz.com/Figure_How_the_integration_of_Zilliz_Cloud_and_Waii_works_a138b765f3.png)
クエリ生成の流れは
Waiiがクエリを解釈し、説明文を書き換える:"人工知能、機械学習、ニューラルネットワーク、その他のAI技術に関するイベント"
この記述はZilliz Cloudへのクエリに使用され、意味的類似性に基づいて関連するイベントIDのリストを返す。
Waiiはこのリストを絞り込み、不注意に含まれた可能性のある非AIイベントをフィルタリングします。
Waiiは、エージェント的なワークフローを使用して、これらのイベントIDを最終的なSQLクエリに組み込みます:
SELECT SUM(total_spent)
FROM events
WHERE event_id IN (1234, 5678, 9101, 1121, 3141, 5161, 7181, 9202, 1222, 3242)
AND event_date >= イベント日付
DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month')
AND event_date <
DATE_TRUNC('month', CURRENT_DATE);
このアプローチでは、専門用語が使われていたり、明らかなキーワードが含まれていなくても、AI関連のイベントを正確に特定することができる。3rd Symposium on Generative Adversarial Networks」や「Workshop on Ethical Considerations in Reinforcement Learning」のような、他のアプローチでは見逃してしまうようなイベントも捉えることができる。
ベクトル類似性検索を活用することで、ユーザーの意図をより正確に解釈し、データベース内のカーディナリティの高いイベント名とマッチさせることができ、より包括的で正確な結果を提供することができる。
結論
データ量が増加し続け、直感的なデータインタラクションに対するユーザーの期待が高まるにつれ、テキストからSQLへの変換システムにおいて、カーディナリティの高いカテゴリーデータを扱うことは、より一般的になっていくでしょう。Zilliz CloudとWaiiのパワーを活用することで、より堅牢で、スケーラブルで、正確なシステムを構築することができます。
私たちはこのアプローチで有望な結果を得ていますし、同じような課題に直面している他の方々にとっても有益だと信じています。このアプローチや同様のアプローチを試したことがある方は、ぜひお気軽にご連絡ください。
読み続けて

Producing Structured Outputs from LLMs with Constrained Sampling
Discuss the role of semantic search in processing unstructured data, how finite state machines enable reliable generation, and practical implementations using modern tools for structured outputs from LLMs.

Leveraging Milvus and Friendli Serverless Endpoints for Advanced RAG and Multi-Modal Queries
This tutorial has demonstrated how to leverage Milvus and Friendli Serverless Endpoints to implement advanced RAG and multi-modal queries.

Stop Waiting, Start Building: Voice Assistant With Milvus and Llama 3.2
We'll learn to build a Voice Assistant, a specialized Agentic RAG system designed for voice interactions, with Milvus, Llama 3.2, and other GenAI tools.