【生成AI】 RAGをより理解しよう！ LlamaIndexでのQuery Engineの機能

# <font color=green>はじめに </font>
RAGのより理解して活用したい人向けに、Llamaindex v0.11.9(2024年9月16日現在での最新）でのQuery Engineの機能を整理しました。

Query Engineは、各種ドキュメントデータをベクトル化し、ナレッジデータとして格納したインデックスに対して、高度な検索や質問応答を可能にするエンジンです。生成AI（LLM）を活用して、自然言語のユーザクエリを理解し、関連する情報を効率的に抽出します。

また、LlamaIndexではFLARE技術（※）などにより、反復的な検索を使用して応答内容のギャップを埋め、より詳細で適切な情報をLLMに提供することで、知識拡張長文生成を強化しています。

::: note info 
FLARE技術
知識拡張型の「長文生成」を実現するために開発された技術。文ごとに検索を行いながらテキストを反復的に生成する。各文が生成されるたびに、関連する情報が必要かどうかを判断し、必要に応じて情報を検索して内容を充実させて行きます。
:::

# <font color=green>機能一覧</font>

[`query_engine/__init_.py`](https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/query_engine/__init__.py) から一覧を抽出し、以下の６種類のカテゴリに分類して整理します。

+ [ベース：基本となるQueryEngine](#ベース)
+ [クエリ変換: クエリを事前に編集してからQuery Engineに渡す](#クエリ変換)
+ [ルーター: クエリの内容に応じて使用するQuery Engineを使い分ける](#ルーター:-クエリの内容に応じて使用するQuery-Engineを使い分ける)
+ [複数回の検索・生成: 生成AIの応答内容を評価し改善を繰り返す](#複数回の検索・生成:-生成AIの応答内容を評価し改善を繰り返す)
+ [データベース](#データベース)
+ [その他](#その他)

# <font color=green>ベース</font>
基本となるQuery Engine

+ <font color=blue>BaseQueryEngine</font>
QueryEngineのベースクラスです。
&nbsp;
+ <font color=blue>CustomQueryEngine</font>
独自のQueryEngineを作成（するためのクラス）します。
&nbsp;
+ <font color=blue>RetrieverQueryEngine</font>
<font color=green>最も基本的なRAGの実装で使われます。</font>
指定した`retriever(VectorIndexRetrieverやSummaryIndexRetriever等）`でインデックスの検索を行い、その結果をLLMに問い合わせる際のプロンプトに入れます。

# <font color=green>クエリ変換</font>
クエリを事前に編集してからQuery Engineに渡します。
+ <font color=blue>TransformQueryEngine</font>
Query Engineに渡す前にクエリ変換を実施します。クエリとindex（ナレッジベース）とが対応していない場合（例えばクエリは質問文でもindexは平叙文である場合等）や、クエリが長文で要約が必要な場合等に使用します。
&nbsp;
+ <font color=blue>SubQuestionQueryEngine</font>
クエリをLLMを使って複数のサブクエリに分割し、それぞれのサブクエリでLLMに質問を行い、得られた回答をマージして最終回答します。

# <font color=green>ルーター</font>
クエリの内容に応じて使用するQuery Engineを使い分けます。
+ <font color=blue>RouterQueryEngine</font>
複数のクエリエンジンを定義し、クエリからどのクエリエンジンを使うのかを `selector` を使って選択します。複数のクエリエンジンが選択された場合は、それぞれの回答を組み合わせます。

::: note info
[selector](https://github.com/run-llama/llama_index/blob/v0.10.14/llama-index-core/llama_index/core/selectors/__init__.py)　には下記の種類があります。 
+ LLMSingleSelector
+ LLMMultiSelector
+ EmbeddingSingleSelector
+ PydanticSingleSelector
+ PydanticMultiSelector
:::
&nbsp;

+ <font color=blue>ToolRetrieverRouterQueryEngine</font>
基本的な仕組みは`RouterQueryEngin`と同じです。selectorではなくretrieverを用いてルーティング（クエリエンジンを選択）します。
&nbsp;
+ <font color=blue>RetrieverRouterQueryEngine</font>
非推奨。`ToolRetrieverRouterQueryEngine`を使用します。

# <font color=green>複数回の検索・生成</font>
生成AIの応答内容を評価し改善を繰り返します、
+ <font color=blue>MultiStepQueryEngine</font>
検索と生成を複数回行います。質問が複雑で一度では解けない問題や、回答に至るまで複数回の推論・検索が必要な問題等で効果があります。
&nbsp;
+ <font color=blue>RetryQueryEngine</font>
LLMの回答を評価(evaluator)し、評価結果を元にクエリを修正し再度LLMに問い合わせすることを繰り返します。`evaluator`の性能が良い場合に、有効なアプローチになります。

::: note info
LlamaIndexのは様々な[evaluator](https://github.com/run-llama/llama_index/blob/v0.10.14/llama-index-core/llama_index/core/evaluation/__init__.py)が用意されています。
詳細説明は割愛しますが、概要はLlamaIndexの[ドキュメント](https://github.com/run-llama/llama_index/blob/main/docs/docs/understanding/evaluating/evaluating.md)を参照してください。

# 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
:::
&nbsp;
+ <font color=blue>RetryGuidelineQueryEngine</font>
RetryQueryEnginを拡張したものです。評価軸を明記したガイドラインを指定することで、評価モデルをコントロールします。独自の評価基準を導入したい場合等で利用します。
&nbsp;
+ <font color=blue>RetrySourceQueryEngine</font>
RetryQueryEnginを拡張したものです。evaluatorによる出力結果の評価結果が悪い場合、評価結果を元にクエリを修正しノードをフィルタリングして、再度LLMに問い合わせます。検索結果が広い等の検索に課題がある場合に有効です。
&nbsp;
+ <font color=blue>FLAREInstructQueryEngine</font>
FLARE Instruct(Jiang+)を実装し、質問に対する回答を生成している途中で検索による情報収集が必要となった場合にLLM自身に検索クエリを生成させて検索します。長文で複数の事実に基づいた回答を生成させたい場合に有効です。

# <font color=green>データベース</font>
主にLLMから回答データを生成するのではなく、データベースから情報検索に特化してものです。プロセスにおいてLLMを活用し、ユーザーが入力した自然言語の質問を解析し、それを適切なSQLクエリに変換するためにLLMを使用します。

+ <font color=blue>NLSQLTableQueryEngine</font>
SQL TableをretrieverとしたQuery Engineです。LLMを用いて自然言語のテキストからSQLのクエリを生成し(Text-To-SQL)、データベースを検索します。データベースをダイレクトに検索するためセキュリティリスクには注意が必要です。
&nbsp;
+ <font color=blue>SQLTableRetrieverQueryEngine</font>
NLSQLTableQueryEngineと同様、SQL TableをretrieverとしたQuery Engineです。NLSQLTableQueryEngineとの違いは、table_retriever（テーブルの絞り込み）を使用するか否かになります。
&nbsp;
+ <font color=blue>PGVectorSQLQueryEngine</font>
PGVector SQL（PostgreSQLデータベース内でベクトルデータの保存と検索を行う）を`retriever`としたQuery Engineです。
&nbsp;
+ <font color=blue>SQLJoinQueryEngine</font>
SQLデータベースの検索結果をLLM検索時のクエリとして利用することができるQuery Engine（LLMの応答結果にもSQLの結果をマージ可能）です。
&nbsp;
+ <font color=blue>SQLAutoVectorQueryEngine</font>
SQLJoinQueryEngineと基本的には同じです。SQLを使わない場合（other_query_tool）、VectorIndexAutoRetrieverが使われます。
&nbsp;
+ <font color=blue>CogniswitchQueryEngine</font>
cogniswitch（ナレッジグラフサービス、ナレッジグラフと大規模言語モデル（LLM）を統合するプラットフォーム）を使用して検索するQuery Engineです。
&nbsp;
+ <font color=blue>ComposableGraphQueryEngine</font>
composablegraph（２つのVector Store Indexを使用する等、複数のindexを使用する時に使用する）で検索するQuery Engineです。
&nbsp;
+ <font color=blue>JSONalyzeQueryEngine</font>
JSONのリストに対して検索するQuery Engine。JSONを返却する外部API等を呼び出した後に使用することを想定したものです。
&nbsp;
+ <font color=blue>KnowledgeGraphQueryEngine</font>
知識グラフに対する検索を行うQuery Engineです。
&nbsp;
+ <font color=blue>PandasQueryEngine</font>
Pandasに対して検索を行うQuery Engineです。 Pandasのコードに変換して検索を行うため、セキュリティリスクに対して注意が必要です。
&nbsp;
+ <font color=blue>SimpleMultiModalQueryEngine</font>
画像とテキストに対応したQuery Engineです。検索が、画像とテキストに対応しています。
&nbsp;

# <font color=green>その他</font>

+ <font color=blue>CitationQueryEngine</font>
検索結果をcitiationとして表示するQuery Engineです。
&nbsp;