Llama index RAGのメタデータ保存
[RAGカスタマイズ] LlamaIndexで情報元のPDFのメタデータを含めた回答を生成する
を参考に行う
社内資料の検索をスムーズにするRAGシステムをLlamaIndexを使用して開発している際にある問題に当たった.
「情報の出所がどのPDFの何ページ目かを知りたい」
営業やカスタマーセンターの方が顧客から質問され,RAGを使用して回答を得て,顧客に回答するという使用方法を想定する場合,間違った情報を伝えてはならない.従って,情報源となるPDFのページを示すことで,簡単にファクトチェックを行えるようになる.
今回の記事では,このRAGシステムを構築する際によく遭遇する問題をLlamaIndexで解決していく
というコンセプトらしい
この中で
from llama_index.core import (
StorageContext,
load_index_from_storage,
get_response_synthesizer
)
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.postprocessor import SimilarityPostprocessor
# 保存済みのindexを読み込み
index_path = "path/to/storage"
storage_context = StorageContext.from_defaults(persist_dir=index_path)
index = load_index_from_storage(storage_context=storage_context)
# Retrieverを準備
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=5
)
# NodePostProcessorの準備
# スコアが0.75以下のNodeを削除
score_filtter_processor = SimilarityPostprocessor(similarity_cutoff=0.75)
node_postprocessors=[score_filtter_processor]
# Synthesizerの作成
response_synthesizer = get_response_synthesizer(
output_cls=ResponseModel
)
# QueryEngineの作成
query_engine = RetrieverQueryEngine(
retriever=retriever,
response_synthesizer=response_synthesizer,
node_postprocessors=[AddMetadataNodePostprocessor()]
)
output = query_engine.query("質問を入力")
は
「保存されたインデックス(index)を読み込んでクエリを実行する流れ」を記述したものであり、インデックスを保存する処理(=永続化のための保存処理)は含まれていません
RAGの回答にメタデータを含める
それでは,これらの方法を応用して,RAGで生成する回答に出所となるPDFファイルとそのページを含める方法についてまとめる.大きく3つの手順が必要になる.
1. PDFからDocumentオブジェクトを生成する際に所望のメタデータを含める
2. Retrieverで検索をする際にPostNodeProcessorによりNodeのテキストにメタデータを追加する
3. Synthesizerの出力形式をpydanticで指定し,メタデータが含まれるようにする
Nodeオブジェクトに所望のメタデータを含める
LlamaIndexでは,PDF → Documentオブジェクト → Nodeオブジェクト の順でデータが変換されていく.
DocumentオブジェクトのメタデータはNodeオブジェクトにも継承される.
つまり,PDFのファイルパスやページ数をメタデータとして含める場合は,
PDF → Documentの部分でそれぞれのDocumentオブジェクトにメタデータを持たせる.
LlamaIndexが提供しているSimpleDirectoryReaderでは,PDFをDocumentに変換する際,デフォルトでメタデータを付与してくれる.従って,メタデータを付与するための処理は以下の処理だけで良い.