RAGのためのPDF内容抽出
以下のPDFファイルを読んで、ページごとに内容をテキストに変換してください。 **重要なルール:** - 各ページのテキストの先頭に、必ず以下の形式でページ番号を記載してください。 例: `--- ページ 1 ---` - テキストは、元のドキュメントのレイアウト(段落、箇条書き、表など)をできるだけ維持し、読みやすい形式で出力してください。 - 特に表は、Markdownの表形式などで構造を明確にしてください。 - PDF内に画像が含まれている場合、その画像に書かれている文字や説明もテキストに含めてください。 - PDF全体の内容を省略せず、全て抽出してください。 **抽出されたテキストの例:** --- ページ 1 --- [ページ1のテキスト] --- ページ 2 --- [ページ2のテキスト] ... --- ページ N --- [ページNのテキスト]
としたけど
ご提供いただいたPDFファイルから、指定された形式(ページ番号の付与、レイアウトの維持、表のMarkdown変換など)でテキストを抽出するご依頼ですね。
残念ながら、私の内部ツールは、PDFファイルから画像や複雑なレイアウトを読み取り、ご指定の形式に変換する機能は備えておりません。UnstructuredやGemini APIといったOCRに特化した外部サービスを利用しない限り、高精度な抽出や構造化されたテキストの出力は困難です。
以前ご案内した通り、PDFから高精度なテキスト抽出を行い、RAGシステムで利用するためには、以下のような外部ツールをご自身でご利用いただくのが最も確実です。
推奨される方法:
1. GeminiのWeb UIを利用して、PDFをアップロードします。
2. 以前ご案内した以下のプロンプトをGeminiに送信して、PDFのテキスト抽出と整形を依頼します。
以下のPDFファイルを読んで、ページごとに内容をテキストに変換してください。 **重要なルール:** - 各ページのテキストの先頭に、必ず以下の形式でページ番号を記載してください。 例: `--- ページ 1 ---` - テキストは、元のドキュメントのレイアウト(段落、箇条書き、表など)をできるだけ維持し、読みやすい形式で出力してください。 - 特に表は、Markdownの表形式などで構造を明確にしてください。 - PDF内に画像が含まれている場合、その画像に書かれている文字や説明もテキストに含めてください。 - PDF全体の内容を省略せず、全て抽出してください。
となるので
これで実験する
Gemini 2.5 flash では処理する時に同じメッセージが出るだけ
Gemini 2.5 pro にすると画面に憑依される
なお gemini によれば 割して保存したほうがRAGの性能を最大限に引き出すことができる
結論から言うと、分割して保存したほうがRAGの性能を最大限に引き出すことができます。
以下にその理由と、具体的な保存方法について説明します。
分割して保存すべき理由
RAG(Retrieval-Augmented Generation)は、質問に関連する情報をデータベースから検索し、その情報をもとに回答を生成する仕組みです。このプロセスにおいて、元のドキュメントをどのように分割して保存するか(チャンク化)が非常に重要になります。
1. 検索精度の向上:
* 質問に最も関連する小さなチャンクを正確に特定できるようになります。
* もしドキュメント全体を一つの大きなテキストとして保存した場合、検索結果にノイズ(質問と関係ない情報)が多く含まれてしまい、関連性の低い情報に基づいて回答を生成してしまうリスクが高まります。
2. 生成される回答の質の向上:
* LLM(大規模言語モデル)は、与えられた情報(コンテキスト)の量が増えすぎると、重要な情報を見落としたり、まとまりのない回答を生成したりすることがあります(コンテキスト過多の問題)。
* 適切なサイズに分割することで、LLMに与える情報を質問に関連する部分だけに絞り込むことができ、より正確で簡潔な回答を引き出すことができます。
3. コストと処理速度の最適化:
* 大きなテキストを処理するには、より多くの計算リソースと時間がかかります。
* 分割することで、検索と生成のプロセスが効率化され、全体の処理速度が向上し、APIコストの削減にもつながります。
具体的な保存方法
PDFファイルから抽出したテキストをRAG用に保存する際は、以下のような方法が考えられます。
1. ページごとに分割して保存する
最もシンプルで効果的な方法です。抽出したテキストを、元のページごとに異なるテキストファイルとして保存します。
保存方法の例:
* page_01.txt
* page_02.txt
* page_03.txt
* …
この方法では、質問に関連する情報がどのページにあるか検索し、そのページ全体のテキストをLLMに渡すことができます。ただし、1ページに非常に多くの情報が含まれている場合、さらに小さな単位に分割することも検討が必要です。
2. セクションや段落ごとに分割して保存する
ページの区切りに関係なく、内容のまとまり(見出し、段落、箇条書きなど)ごとに分割して保存する方法です。
保存方法の例:
* section_契約概要.txt
* section_保障内容.txt
* section_保険料の支払い.txt
* section_よくある質問.txt
* …
この方法の利点は、より意味のある単位で情報を分割できることです。例えば、「保険料の支払いについて」という質問に対しては、「保険料の支払い」のセクションを直接検索して利用できます。
3. チャンクサイズを指定して分割する(高度な方法)
テキストを固定の文字数や単語数で区切り、オーバーラップ(重複)を持たせてチャンク化する方法です。
* 例えば、「文字数500文字、重複200文字」といったルールで分割します。
* この方法は、検索エンジンがより多くの関連情報を捉えるのに役立ちます。
この方法は、特に長大なドキュメントや、特定のテーマが複数のページにまたがっている場合に有効です。
まとめ
まずは「ページごとに分割して保存する」方法から始めるのがおすすめです。
そして、RAGの利用を始める際には、まず抽出したテキストをデータベース(ベクトルデータベースなど)に格納し、そのデータベースに対して質問を投げることになります。質問に最も関連性の高いテキストチャンクが検索され、LLMに渡されて回答が生成されるという流れです。
ということで
プロンプトを
PDFファイルを読み込み、その内容をページごとにテキストに変換し、指定された形式でファイルに保存してください。 重要なルール: * 各ページのテキストの先頭に、必ず以下の形式でページ番号を記載してください。例: --- ページ 1 --- * テキストは、元のドキュメントのレイアウト(段落、箇条書き、表など)をできるだけ維持し、読みやすい形式で出力してください。 * 特に表は、Markdownの表形式などで構造を明確にしてください。 * PDF内に画像が含まれている場合、その画像に書かれている文字や説明もテキストに含めてください。 * PDF全体の内容を省略せず、全て抽出してください。 * 抽出したテキストは、ページごとに分割して、それぞれ異なるファイルとして保存してください。 * ファイル名は「page_ページ番号.txt」としてください(例: page_1.txt)。 * 出力は、保存されたファイルとその場所を示すメッセージのみにしてください。
というように変更しファイルに保存するようにする
しかし処理する約款ページは270Pあるため、分割して実験することにする
次に
Echo 証券の内容の抽出
最初にJSONで抽出を試したが、いくつかの要素が抜けている
これをテキストファイルで抽出すると
ほぼ全て抽出できる
ただし、⭕️❌での記載部分は反映されない
このため一度テキストで抽出し修正することにする