あるチュートリアルでは、複雑な文書から抽出されたテキストと画像の両方を対象に検索・推論可能な、マルチモーダル検索拡張生成(RAG)パイプラインをPythonで構築する方法を詳説しています。このアプローチは、散文、表、グラフが混在するPDFを対象としており、従来のテキストのみのRAGでは対応が難しいフォーマットです。
RAGは、言語モデルが回答を生成する前に、文書から関連する部分を検索して渡す仕組みです。テキストのみを対象とした場合、この手法は良好な結果をもたらします。しかし、テキストのみに基づく分割では表の構造が崩れ、画像は無視されてしまうため、システムは文書の不完全な情報に基づいて回答することになります。一方、今回紹介するパイプラインでは、画像をテキストと同様に検索可能なオブジェクトとして扱います。
実装には、LangChain、ライブラリunstructured、およびOpenAIのAPIを利用します。チュートリアルでは、文書の解析、画像の要約、データの保存、システムへの質問という4つのステップを説明しています。unstructuredがPDFから画像を抽出するためには、システム依存のパッケージpoppler-utilsが必要です。
テキストと画像の分離
unstructuredの関数partition_pdf()は文書を読み込み、各要素を段落、表、埋め込み画像などのタイプに分類します。画像は専用フォルダに保存され、テキストブロックは見出しに基づいて最大4,000文字のチャンクにまとめられます。その後、ループ処理でテキストチャンクと画像ファイルのパスが分離されます。
一般的なベクトルデータベースは画像を直接インデックス化できません。そのため、各画像はGPT-4oに「検索システムで使用するためにこの画像を詳細に説明してください」という指示とともに送信され、検索可能な代替情報として機能する詳細な説明が生成されます。チュートリアルでは、このステップにコストがかかる点を指摘しています。各画像がAPI呼び出しをトリガーするためです。多くのロゴやアイコンを含む文書の場合、この処理の前に小さな画像をフィルタリングすることを提案しています。
2段階のストレージ
このアーキテクチャは、2つのストレージスペースを管理するMultiVectorRetrieverを基盤としています。1つ目はベクトルデータベースのChromaで、テキスト埋め込みモデルtext-embedding-3-smallを用いてベクトル化されたテキストチャンクと画像の説明を格納します。2つ目はインメモリのドキュメントストアで、生のコンテンツを保持します。各エントリは一意の識別子によって対応するコンテンツと関連付けられます。これにより、説明文に基づく検索が行われた後、システムは元のテキストチャンクや画像ファイルを取得できます。
クエリが送信されると、質問自体もベクトル化され、インデックス化された要素と比較されます。テキストチャンクはそのまま渡され、検索された画像は開かれてbase64形式(テキスト形式で画像をクエリに添付可能)にエンコードされます。これらすべてがGPT-4oに送信され、両方のタイプのコンテンツに基づいた回答が生成されます。チュートリアルでは、「第3四半期の収益グラフは何を示していますか?」という質問を例として挙げ、このプロセスを説明しています。
今後の展望
著者は、検索精度を向上させるための再ランキング(re-ranking)ステップの追加、本番環境での使用のためにChromaデータベースをディスクに保存する方法、文書ページを画像として直接処理することで解析ステップが不要なColPaliなどの視覚言語モデルの活用など、いくつかの発展的な可能性に言及しています。





