マガジン

日本語PDFをRAGに入れる前の下ごしらえ:文字化け・段組み・スキャン画像の確認

AIを使いこなす

Claudeで執筆し、GPTで自動校閲・修正しています。

机に並べた二枚の紙の行の位置を指で照合する手元
記事の内容をもとに制作したAI生成イメージです。実際の製品画面や検証結果の写真ではありません。

RAGの回答がおかしいとき、原因は検索やプロンプトではなく、PDFから取り出した文字列そのものが壊れていることがあります。壊れた文字列は、そのままチャンク(分割した断片)になり、検索され、回答の根拠になります。 結論から言うと、取り込み前にやることは次の3つです。 1. PDFが「テキスト型」「スキャン型」「段組み・表が多い型」のどれかを見分ける 2. 各型の代表ページを10ページ前後選び、抽出した文字列を元ページと並べて見る 3. 下の10項目で、重大なNGがあれば取り込まずに抽出方法を変える ここで示す表や基準は、編集部が考えた確認の手順です。実際のPDFで抽出して測った結果ではありません。

この記事の目次
  1. 最初にPDFの種類を見分ける
  2. 種類別の抽出確認表
  3. 目視チェック10項目
  4. 進め方:サンプルを選び、AIに差分を拾わせる
  5. 判定表:どうなったら取り込まないか

最初にPDFの種類を見分ける

PDFビューアで次の2つを試すだけで、おおよその種類は分かります。

  • 本文をドラッグして文字が選択できるか
  • 検索(Ctrl+F/Command+F)で、画面に見えている単語がヒットするか

選択も検索もできなければ、ページが画像でできているスキャン型です。選択できても、コピーして貼り付けると読めない文字になる場合は、フォントの文字対応が崩れたPDFを疑います。なお、パスワードや暗号化が掛かったPDFは、AIサービス側で扱えないことがあります。たとえばClaudeのPDF対応の要件には「パスワード・暗号化なしの標準PDF」とあります。取り込み前に解除できるか、権限のある人に確認してください。

注意したいのは、チャット画面でPDFを渡すと正しく答えるのに、自作のRAGでは外れる場合です。たとえばOpenAIのPDF入力の説明では、PDFからテキストとページ画像の両方を取り出してモデルに渡すとされています。画像も一緒に読めるため、テキスト抽出が多少崩れていても答えられることがあります。一方、RAGに入れるのは抽出後の文字列だけのことが多いです。チャットで答えられたことは、抽出が正しい証拠にはなりません。

種類別の抽出確認表

  • テキスト型、見分け方:文字を選択・検索できる、壊れやすい点:文字化け、字間の空白、ヘッダー・フッターの混入、抽出時に確認すること:項目1・2・7を全ページ検索で確認
  • スキャン型、見分け方:選択も検索もできない、壊れやすい点:誤認識(似た字・数字)、傾き、かすれ、抜け、抽出時に確認すること:OCRが必要。項目6・9を重点的に確認
  • OCR済みスキャン、見分け方:検索できるが、見た目と違う語がヒットする、壊れやすい点:見えない文字層の誤認識、抽出時に確認すること:元画像と文字層を見比べる(項目1・6)
  • 段組み・表が多い、見分け方:2段組み、罫線の表、縦書きが混在、壊れやすい点:読み順の混線、表の行ずれ、抽出時に確認すること:項目3・4・5を代表ページで確認

スキャン型の抽出は、OCRか、OCR付きの文書解析サービスに任せることになります。たとえばGoogleのEnterprise Document OCRの説明では、デジタルPDFはネイティブのPDF解析で埋め込み文字を取り出し、スキャン部分はOCRで読み取って結果をまとめるとされています。言語ヒント(BCP-47形式)を指定でき、ぼやけやまぶしさなどのページ画質分析のオプションもあります。日本語の文書なら、言語ヒントに日本語を指定できるかを確認の入り口にできます。

段組みや表、見出し、ヘッダー・フッターの扱いが気になる場合は、レイアウト解析をうたうサービスも選択肢です。Microsoft Document Intelligenceのレイアウト解析は、本文のほか表、選択マーク、タイトル、セクション見出し、ページヘッダー・フッターなどを抽出するモデルとして説明されています。ただし、どのサービスが手元の日本語PDFをきれいに読めるかは文書次第です。必ず自社のサンプルで試してください。

目視チェック10項目

代表ページを元のPDFと左右に並べ、抽出結果(テキストまたはMarkdown)を見ながら確認します。

  • 1、項目:文字化け・置換文字、見るポイント:□、?、�、意味のない記号列がないか。全文検索でも探す
  • 2、項目:字間の空白・文字の分断、見るポイント:「契 約 書」のような空白、1文字ごとの改行、ルビが本文に混ざっていないか
  • 3、項目:読み順、見るポイント:2段組みで左右の行が交互に混ざっていないか。縦書きが逆順になっていないか
  • 4、項目:見出しと段落、見るポイント:見出しが本文と離れていないか。文の途中で段落が切れていないか
  • 5、項目:表、見るポイント:行と列の対応、セル結合、数値が隣の項目にずれていないか
  • 6、項目:数字・日付・単位、見るポイント:0とO、1とl、全角半角、%・円・元号、桁の脱落
  • 7、項目:ヘッダー・フッター、見るポイント:毎ページ同じ社名・ページ番号が本文に混入していないか
  • 8、項目:図・脚注・画像内の文字、見るポイント:図中の文字、注記、スクリーンショットの文字が抜けていないか
  • 9、項目:抜け・重複、見るポイント:抽出ページ数が元の数と合うか。空ページ、同じ文の二重出力がないか
  • 10、項目:ページ番号の対応、見るポイント:抽出文字列から元の何ページかを追えるか。出典表示に使えるか

説明用の例(実測ではありません)

元の文章が「返品は商品到着後8日以内に申し出てください。」だったとします。抽出が崩れると、たとえば次のような形になり得ます。

  • 項目2の例:「返 品 は商 品到 着後 8日以 内に申 し出て」
  • 項目3の例:2段組みで、左段の1行目と右段の1行目が続けて出力される
  • 項目6の例:「8日」が「B日」になる

項目3や6は、意味が通ったように見えて内容が変わる点で特に危険です。

進め方:サンプルを選び、AIに差分を拾わせる

  1. サンプルを選ぶ:種類ごとに数ページずつ、合計10ページ前後を選びます。表、数値、段組み、図が入ったページを必ず含めます。
  2. 抽出する:本番で使う予定の方法で抽出し、ページ単位で保存します。
  3. AIに差分を拾わせる:元ページの画像と抽出文字列を渡し、違いの候補を挙げさせます。
  4. 人が確認する:AIが挙げた箇所と、10項目のうち目で見る項目を、人が元ページで確かめます。
  5. 判定する:次の表で、取り込む・やり直す・除外するを決めます。

AIには「違いの候補を挙げる」ことまでを任せ、「問題なし」の判断は任せないでください。見落としがあり得るためです。数字と表は人が確認します。社外秘の資料を外部サービスに渡す場合は、社内の取り扱いルールに従い、確認用には内容を差し替えたダミーのページを使うのが安全です。

依頼文の例(実行前の例文です):

添付は、PDFの1ページ分の画像と、そのページから自動抽出した文字列です。
抽出文字列が元ページと違う箇所を、次の観点で一覧にしてください。
観点:文字化け/字間の空白/読み順/表の行列ずれ/数字・日付・単位/ヘッダー・フッター混入/抜け
出力:表(観点、抽出文字列の該当部分、元ページで見える内容、確信度:高・中・低)
元ページで読み取れない箇所は推測せず「判読不能」と書いてください。
問題がない観点には「差分なし」と書かず、確認した範囲を明記してください。

【抽出文字列】
(ここに貼り付け)

判定表:どうなったら取り込まないか

  • 項目1・2がNG(文字化け、分断)、次の一手:抽出方法を変える。画像化してOCRにかける方法も試す
  • 項目3・5がNG(読み順、表)、次の一手:レイアウト解析に対応した抽出に切り替える。難しければ該当ページを手で整形する
  • 項目6がNG(数字の誤り)、次の一手:該当文書は原文参照を前提にする。数値が重要な文書は人の再確認が済むまで取り込まない
  • 項目7だけNG、次の一手:繰り返し出る文字列を取り込み前に除去する
  • 項目9・10がNG、次の一手:取り込み処理を直す。出典のページ番号が追えないと、回答の検証ができない

目安として、重要なページで重大な項目(1、3、5、6)に1つでもNGがあれば、そのPDFは取り込まない扱いにすると運用しやすくなります。軽い項目(7など)は、後から除去処理を足せば済みます。

最後に、取り込み後の確認として、表や数字の中にしか答えがない質問を2〜3問作り、検索で返った断片が元ページと一致するかを見てください。ここでずれるなら、チャンク分割より前、つまり抽出の段階に戻って調べます。

出典・参考資料