はじめに
RAGのより理解して活用したい人向けに、Llamaindex v0.11.9(2024年9月16日現在での最新)でのQuery Engineの機能を整理しました。
Query Engineは、各種ドキュメントデータをベクトル化し、ナレッジデータとして格納したインデックスに対して、高度な検索や質問応答を可能にするエンジンです。生成AI(LLM)を活用して、自然言語のユーザクエリを理解し、関連する情報を効率的に抽出します。
また、LlamaIndexではFLARE技術(※)などにより、反復的な検索を使用して応答内容のギャップを埋め、より詳細で適切な情報をLLMに提供することで、知識拡張長文生成を強化しています。
FLARE技術
知識拡張型の「長文生成」を実現するために開発された技術。文ごとに検索を行いながらテキストを反復的に生成する。各文が生成されるたびに、関連する情報が必要かどうかを判断し、必要に応じて情報を検索して内容を充実させて行きます。
機能一覧
query_engine/__init_.py
から一覧を抽出し、以下の6種類のカテゴリに分類して整理します。
- ベース:基本となるQueryEngine
- クエリ変換: クエリを事前に編集してからQuery Engineに渡す
- ルーター: クエリの内容に応じて使用するQuery Engineを使い分ける
- 複数回の検索・生成: 生成AIの応答内容を評価し改善を繰り返す
- データベース
- その他
ベース
基本となるQuery Engine
-
BaseQueryEngine
QueryEngineのベースクラスです。
-
CustomQueryEngine
独自のQueryEngineを作成(するためのクラス)します。
-
RetrieverQueryEngine
最も基本的なRAGの実装で使われます。
指定したretriever(VectorIndexRetrieverやSummaryIndexRetriever等)
でインデックスの検索を行い、その結果をLLMに問い合わせる際のプロンプトに入れます。
クエリ変換
クエリを事前に編集してからQuery Engineに渡します。
-
TransformQueryEngine
Query Engineに渡す前にクエリ変換を実施します。クエリとindex(ナレッジベース)とが対応していない場合(例えばクエリは質問文でもindexは平叙文である場合等)や、クエリが長文で要約が必要な場合等に使用します。
-
SubQuestionQueryEngine
クエリをLLMを使って複数のサブクエリに分割し、それぞれのサブクエリでLLMに質問を行い、得られた回答をマージして最終回答します。
ルーター
クエリの内容に応じて使用するQuery Engineを使い分けます。
-
RouterQueryEngine
複数のクエリエンジンを定義し、クエリからどのクエリエンジンを使うのかをselector
を使って選択します。複数のクエリエンジンが選択された場合は、それぞれの回答を組み合わせます。
selector には下記の種類があります。
- LLMSingleSelector
- LLMMultiSelector
- EmbeddingSingleSelector
- PydanticSingleSelector
- PydanticMultiSelector
-
ToolRetrieverRouterQueryEngine
基本的な仕組みはRouterQueryEngin
と同じです。selectorではなくretrieverを用いてルーティング(クエリエンジンを選択)します。
-
RetrieverRouterQueryEngine
非推奨。ToolRetrieverRouterQueryEngine
を使用します。
複数回の検索・生成
生成AIの応答内容を評価し改善を繰り返します、
-
MultiStepQueryEngine
検索と生成を複数回行います。質問が複雑で一度では解けない問題や、回答に至るまで複数回の推論・検索が必要な問題等で効果があります。
-
RetryQueryEngine
LLMの回答を評価(evaluator)し、評価結果を元にクエリを修正し再度LLMに問い合わせすることを繰り返します。evaluator
の性能が良い場合に、有効なアプローチになります。
LlamaIndexのは様々なevaluatorが用意されています。
詳細説明は割愛しますが、概要はLlamaIndexのドキュメントを参照してください。
Response Evaluator
生成されたレスポンスが提供されたコンテキスト(データやドキュメント)と一致しているか、また事実に基づかない情報(幻覚)が含まれていないかを評価します。これにより、ユーザーに対して正確で信頼性の高い回答を提供することができます。
- BaseEvaluator
- AnswerRelevancyEvaluator
- ContextRelevancyEvaluator
- EvaluationResult
- FaithfulnessEvaluator
- RelevancyEvaluator
- RelevanceEvaluator
- DatasetGenerator
- QueryResponseDataset
- GuidelineEvaluator
- CorrectnessEvaluator
- SemanticSimilarityEvaluator
- PairwiseComparisonEvaluator
- BatchEvalRunner
retrieval Evaluator
インデックスから取得されたノード(データやドキュメント)がユーザーのクエリに対して適切かどうかを評価します。これにより、検索結果の関連性を確認し、検索アルゴリズムやインデックスの改善に役立てることができます。
- generate_qa_embedding_pairs
- generate_question_context_pairs
- EmbeddingQAFinetuneDataset
- BaseRetrievalEvaluator
- RetrievalEvalResult
- RetrieverEvaluator
- MultiModalRetrieverEvaluator
- RetrievalMetricResult
- resolve_metrics
- HitRate
- MRR
- get_retrieval_results_df
- LabelledQADataset
-
RetryGuidelineQueryEngine
RetryQueryEnginを拡張したものです。評価軸を明記したガイドラインを指定することで、評価モデルをコントロールします。独自の評価基準を導入したい場合等で利用します。
-
RetrySourceQueryEngine
RetryQueryEnginを拡張したものです。evaluatorによる出力結果の評価結果が悪い場合、評価結果を元にクエリを修正しノードをフィルタリングして、再度LLMに問い合わせます。検索結果が広い等の検索に課題がある場合に有効です。
-
FLAREInstructQueryEngine
FLARE Instruct(Jiang+)を実装し、質問に対する回答を生成している途中で検索による情報収集が必要となった場合にLLM自身に検索クエリを生成させて検索します。長文で複数の事実に基づいた回答を生成させたい場合に有効です。
データベース
主にLLMから回答データを生成するのではなく、データベースから情報検索に特化してものです。プロセスにおいてLLMを活用し、ユーザーが入力した自然言語の質問を解析し、それを適切なSQLクエリに変換するためにLLMを使用します。
-
NLSQLTableQueryEngine
SQL TableをretrieverとしたQuery Engineです。LLMを用いて自然言語のテキストからSQLのクエリを生成し(Text-To-SQL)、データベースを検索します。データベースをダイレクトに検索するためセキュリティリスクには注意が必要です。
-
SQLTableRetrieverQueryEngine
NLSQLTableQueryEngineと同様、SQL TableをretrieverとしたQuery Engineです。NLSQLTableQueryEngineとの違いは、table_retriever(テーブルの絞り込み)を使用するか否かになります。
-
PGVectorSQLQueryEngine
PGVector SQL(PostgreSQLデータベース内でベクトルデータの保存と検索を行う)をretriever
としたQuery Engineです。
-
SQLJoinQueryEngine
SQLデータベースの検索結果をLLM検索時のクエリとして利用することができるQuery Engine(LLMの応答結果にもSQLの結果をマージ可能)です。
-
SQLAutoVectorQueryEngine
SQLJoinQueryEngineと基本的には同じです。SQLを使わない場合(other_query_tool)、VectorIndexAutoRetrieverが使われます。
-
CogniswitchQueryEngine
cogniswitch(ナレッジグラフサービス、ナレッジグラフと大規模言語モデル(LLM)を統合するプラットフォーム)を使用して検索するQuery Engineです。
-
ComposableGraphQueryEngine
composablegraph(2つのVector Store Indexを使用する等、複数のindexを使用する時に使用する)で検索するQuery Engineです。
-
JSONalyzeQueryEngine
JSONのリストに対して検索するQuery Engine。JSONを返却する外部API等を呼び出した後に使用することを想定したものです。
-
KnowledgeGraphQueryEngine
知識グラフに対する検索を行うQuery Engineです。
-
PandasQueryEngine
Pandasに対して検索を行うQuery Engineです。 Pandasのコードに変換して検索を行うため、セキュリティリスクに対して注意が必要です。
-
SimpleMultiModalQueryEngine
画像とテキストに対応したQuery Engineです。検索が、画像とテキストに対応しています。
その他
-
CitationQueryEngine
検索結果をcitiationとして表示するQuery Engineです。