構造化OCRから、目次に沿ったナレッジベース、RAG・合成データ・モデル学習へ
この記事の対象読者
- RAG・モデル学習をこれから学ぶ方:基本用語と、それぞれの役割・違いを理解できます。
- PDFや医療ガイドラインをAIで活用したい方:本文・表・注記を読み取り、目次に沿って知識を整理する工夫を学べます。
- 検索や学習に使うデータ作りを始めたい方:構造化OCRからナレッジベース、合成データへつなぐ流れをつかめます。
はじめに
PDFをAIに渡せば、その内容を正しく理解して答えてくれる。そう期待したくなりますが、表や注記が多い文書では、文字を読めても意味を取り違えることがあります。
表は、全体を正しく読み取れるなら、一度に扱うほうが見出しと各行の関係を保ちやすくなります。しかし、今回の処理では、細かい文字や多数の行を含む表を一度に読み取ろうとすると、項目が抜けたり、読み取り結果の出力が途中で切れたりすることがありました。そのため、読み取る範囲を小さく分けて処理する工夫が必要になりました。
ただし、分割には別の難しさがあります。たとえば、表の下半分だけを切り出すと、上部にある列の見出しが含まれず、それぞれの値が何を表すか判断しにくくなります。そこで、切り出した画像にも見出しを付け直し、読み取り後には分けた情報をつなぎ直しました。また、ページをまたぐ本文と注記も対応付け、説明の条件が抜けないように整理しました。
医療特化LLMの開発では、こうした問題に向き合いながら、医学書籍や医療ガイドラインを検索・学習に使うためのデータへ整えてきました。LLMは「大規模言語モデル」の略で、文章をもとに説明や回答を生成するAIのモデルです。
本稿では、対話で文書構造を調べ、分割して読み取り、目次に沿ってつなぎ直すという工夫を紹介します。RAGやモデル学習を初めて学ぶ方でも追えるよう、用語と役割から順に説明します。コードを実行できなくても読み進められます。
1. 最初に整理したい、OCR・RAG・モデル学習の違い
OCRは「紙面の文字をデータにする」工程
OCRは、画像に写っている文字を、コンピューターで扱えるテキストへ変換する技術です。スキャンした書籍や、画像として保存したPDFのページを読み取るときに使います。
ただし、表の中の文字を並べるだけでは、どの値がどの項目に属するか分からなくなることがあります。そこで、見出し、表の行と列、注記の関係も一緒に取り出します。この記事では、それを構造化OCRと呼びます。
本をノートに写すとき、文字だけでなく見出しや表の形も残すことをイメージすると分かりやすいでしょう。
RAGは「資料を調べながら答える」仕組み
RAG(ラグ)は、質問に関係する資料を検索し、その内容をLLMへ渡して回答を作る仕組みです。英語のRetrieval-Augmented Generationを略した言葉です。
たとえば「このガイドラインでは、検査の前に何を確認しますか」と質問すると、関連する節を探し、その本文や表を参考に回答します。資料を手元で開きながら答える方法に近いものです。
RAG用に資料を登録することと、モデルそのものを追加学習させることは別です。 通常、RAGでは検索した文章を回答時の参考資料として渡します。資料を更新すれば新しい情報を参照できるようになりますが、登録と検索の仕組みも適切に更新する必要があります。
モデル学習は「回答例を使って答え方を調整する」工程
モデル学習では、データを使ってモデル内部の数値、つまりパラメーターを調整します。この記事で扱うのは、既存のモデルへ質問と望ましい回答などを示す追加学習です。
「説明するときは条件と根拠も示す」「表を指定した形式へ整理する」といった例を用意し、望む出力に近づけます。このような入出力例による学習を、SFT(教師ありファインチューニング)と呼びます。
ただし、学習させた資料を一字一句覚えることや、必ず正解することを保証するものではありません。どこまで改善したかは、学習とは別の問題で確認します。
| 工程 | 何をするか | 今回の役割 |
|---|---|---|
| 構造化OCR | 文字と、その配置・関係を取り出す | 文書を正しく扱うための材料を作る |
| RAG | 質問に関係する資料を検索して回答に使う | 必要な根拠を回答時に参照する |
| モデル学習 | 入出力例などを使ってモデルを調整する | 説明や回答のしかたを改善する |
これらは、一つだけを選ぶ関係ではありません。まず構造化OCRで材料を整え、そこから検索用の知識と学習用の例を作る、という組み合わせができます。
2. なぜ、文字を読み取るだけでは足りなかったのか
表では「文字の正しさ」と「関係の正しさ」が違う
医療文書では、対象、条件、注意事項などを横に並べた表がよく登場します。文字を正しく認識しても、隣の列と取り違えると、別の意味として扱ってしまいます。
以下は、構造の違いを説明するための架空の例です。実際の診療内容を示すものではありません。
| 項目 | 対象 | 注意事項 |
|---|---|---|
| 手順A | 条件Xに当てはまる場合 | 注記1を確認する |
| 手順B | 条件Yに当てはまる場合 | 注記2を確認する |
「手順A」「条件X」「注記1」という文字が全部取れていても、手順Aに注記2を結び付ければ誤りです。検索でこの行を見つけても、誤った関係を回答へ持ち込んでしまいます。
そのため、何が書いてあるかに加えて、どの情報と結び付くかを残す必要がありました。
ページの区切りは、話の区切りとは限らない
ある節の説明が次ページへ続き、対応する表や注記がさらに後ろに載る場合もあります。ページごとに読むことは便利ですが、その単位だけで保存すると、一つの説明が分断されます。
医療特化LLM開発におけるデータ整備のうち、本稿では、数千冊規模の医学書籍・医療事務書籍を対象としたOCR処理と、図表・表を含む書籍への構造化OCRの適用に焦点を当てます。その出力をRAGや合成データに活用するうえで、読み取りの精度と、文脈のつながりの両方を意識しました。
ここから紹介するのは、そのために組み立てた「調べる→分けて読む→つなぎ直す」という流れです。
3. 成功の鍵:対話で調べ、分けて読み、意味をつなぎ直す
まず、LLMとの対話で文書の見取り図を作る
最初に、文書全体の構造を予備調査しました。目次にはどんな章・節があるか、表はどこにあるか、列の見出しや注記は何を指すかを、LLMとの対話を通じて確認します。
対話の進め方は、たとえば次のように整理できます。以下は説明用の指示例であり、実行ログの引用ではありません。
- 「目次と見出しから、この文書の章・節の関係を整理してください」
- 「このページの表と、その見出し・注記の位置を確認してください」
- 「表を分割して読む場合、残す必要がある見出しや継続関係を整理してください」
前の工程で確認した情報を、次の指示と一緒に渡していきます。ここでいう「対話」は、得た回答を確認し、追加の指示を出しながら段階的に処理することです。モデル自体への追加学習を指しているわけではありません。
着想のきっかけは、In-context Learningに関する論文でした。本稿ではその名前を手法全体の名称としては使わず、実際の工程に沿って「対話を通じた段階的な文書解析と知識の再構成」と説明します。
表全体で読めない場合に、座標を使って分けて読む
「分割せず、表全体を読み込めばよいのでは」と思うかもしれません。全体を正しく読み取り、最後まで出力できるなら、分割する必要はありません。ここで紹介する分割は、一度に処理すると項目の抜けや出力の途中切れが起きる場合への対処です。
今回の処理では、細かい文字や多数の行を含む表で、こうした問題が起きました。特に、画像を入力できることと、そこに含まれる内容をすべて出力できることは別です。出力上限に達すると、読み取り結果が最後まで返りません。そこで、ページ画像から読み取る範囲を小さく切り出し、1回に扱う情報量を減らしました。文字を読み取りやすくする工夫と、出力を途中で切らさない工夫を分けて考えます。
「座標に基づく分割」とは、画像のどこからどこまでを切り出すか決めることです。たとえば上下に分けるなら、表の行を途中で切らない位置を探します。予備調査で把握した構造と、画像の行間などの情報を組み合わせて判断します。
画像と文章を扱えるモデルをVLM(視覚言語モデル)と呼びます。切り出した画像の読解には、このVLMを使いました。
一方、単に画像を分けるだけでは、列の見出しや境目の行など、解釈に必要な情報が欠けるおそれがあります。そのため、分割するときには、次の工夫も加えました。
- 列の見出しを付け直す。 下半分だけの画像にも見出し行を付け、各列が何を表すか分かるようにする。
- 境界を少し重ねる。 切り出し範囲を一部重複させ、境目の行が欠けるのを防ぐ。後で重複を整理する。
- 細かい部分を拡大する。 小さい記号や注記を読み取りやすくする。
- 出力が途中で切れたら、さらに分ける。 2分割で収まらないページは3分割にして再処理する。
分割すれば必ず正確になるわけではありません。1回に扱う情報量を減らす代わりに、分割によって失う文脈を補う必要があります。分割を目的にするのではなく、読み取りの問題に応じて範囲を調整し、見出しや行の関係を保つことがポイントです。読み取った断片を文書全体の意味へ戻す工程は、第4節で説明します。
読み取り結果の項目をそろえ、原文と照合する
抽出後は、保存する項目をそろえます。たとえば「見出し」「本文」「表」「注記」「出典ページ」という枠を決めます。このようなデータの項目や形式の取り決めを、スキーマと呼びます。
空欄の列も飛ばさずに残し、表の行・列がずれていないかを確認します。形式のチェックに加え、元画像との照合も必要です。必要な項目が埋まっていても、値や対応関係が正しいとは限らないためです。
確認済みの読み取り結果を、次のページの出力例として渡す工夫も併用しました。少数の例を見せる方法をfew-shot(フューショット)と呼びます。今回の流れでは、文書内で解釈や形式をそろえるための補助です。
4. 分けたチャンクを、目次ごとにつなぎ直す
チャンクとは「ひとまとまりのデータ」
チャンクは、文書を処理や検索のために区切ったひとまとまりのデータです。一段落、表の一部、ある節の説明など、目的によって大きさは変わります。
今回、画像を分けて読み取った後には、本文、表、注記などのチャンクができました。それらを、医療ガイドラインの目次・見出しに対応付けて再結合しました。
たとえば、架空の「第2章・2.1 事前確認」という項目が次のように分かれていたとします。
| 読み取り時のまとまり | 含まれる内容 | 再結合先 |
|---|---|---|
| チャンクA | 前ページにある説明本文 | 第2章・2.1 事前確認 |
| チャンクB | 次ページへ続く確認項目の表 | 第2章・2.1 事前確認 |
| チャンクC | 表の条件や例外を説明する注記 | 第2章・2.1 事前確認 |
この3つを対応付け、文書上の順序と参照関係を保ってつなぎ直します。本文だけでは足りなかった説明を、表と注記まで含めて読めるようになります。
ここで行うのは、原文の関係を復元することです。別の節を混ぜたり、原文にない説明を補ったりすることではありません。要約や質問・回答への変換は、その後の工程で行います。
目次を、意味のまとまりを作る基準にする
目次は、ページを探すためだけのものではありません。「どの話題の下に、どの説明が属するか」を示す手がかりでもあります。
予備調査で確認した目次・見出しの関係を、抽出したチャンクの再結合にも使いました。目次だけでは所属が分からない箇所は、本文中の見出し、表題、注記の参照先なども合わせて確認します。
読み取りやすい大きさに分割し、利用しやすい意味のまとまりへ戻す。 この二つの単位を分けて考えたことが、今回の中心的な工夫です。
こうして、項目ごとに本文・表・注記を整理した知識の集まりを、ナレッジベースと呼びます。ここでは「AIが参照できるように整理した資料集」と考えると分かりやすいでしょう。
図の左側は「分けて読む工程」、右側は「意味をつなぎ直す工程」です。上にある予備調査の結果を、両方の工程へ引き継ぎます。このように、対話による構造の把握と、ナレッジベース化を一続きの処理として設計しました。
5. ナレッジベースを、RAGで検索できるようにする
資料を整理することと、検索の準備は別の工程
ナレッジベースが資料集だとすれば、RAGインデックスは、その中の必要な情報へたどり着くための索引です。項目ごとの知識を整えた後、検索に向いたチャンクと索引を作ります。
「せっかく結合したのに、また分けるのか」と感じるかもしれません。再結合は、意味のつながりを復元するために行います。一方、検索用の分割は、質問に関係する部分を見つけやすくするために行います。
目次の一項目が長い場合は、その全体を知識として保持しつつ、検索では段落や表の行などを扱います。小さなチャンクが見つかったときに、所属する項目の本文や注記へ戻れるよう、対応関係を残します。
各チャンクに「どこから来たか」を付ける
検索用チャンクには、文書名、目次項目、ページ番号なども付けます。こうした本文に付随する情報を、メタデータと呼びます。本のしおりに「どの本の、何章の、何ページか」を書くような役割です。
| 情報 | 例 | 残す理由 |
|---|---|---|
| 文書を識別する番号 | guideline-001 | 別の文書と混同しないため |
| 所属する目次項目 | 第2章・2.1 事前確認 | 前後の文脈をたどるため |
| 出典ページ | 12〜13ページ | 元の記載を確かめるため |
| 内容の種類 | 本文・表・注記 | 情報の役割を区別するため |
検索には、単語の一致を使う方法に加え、文章の特徴を数値に変換して近い内容を探す方法もあります。この数値への変換をEmbedding(埋め込み)と呼びます。似た表現を探す助けになりますが、検索結果が正しい根拠かどうかは別途確認します。
質問から回答までの流れ
先ほどの架空の項目について、「事前確認の注意点は何ですか」と質問した場合を考えます。
ここでは、表の一行だけを見つけて終わるのではなく、その表の条件や注記も確認できることが重要です。回答の材料として何を渡すかは、検索後の組み立て方にも左右されます。再結合したナレッジベースと出典情報が、その組み立てを支えます。
6. シードデータをもとに、目的に合う学習用データを作る
目次ごとに整理した知識は、学習用データを作るための材料にもなります。本稿では、この材料をシードデータと呼びます。本文や表・注記の内容を出典とともに保持し、そこから質問・回答の組や、知識を説明する自然文などへ展開します。
合成データとは「元の資料をもとに作る新しい練習問題」
合成データは、プログラムやAIなどを使って生成するデータです。今回の文脈では、整えた原文から質問・回答、要約、表の整理例などを作ることを指します。
教科書の内容を使って練習問題と解答を作るように、同じ目次項目から複数の例を用意します。根拠のない内容を自由に創作するのではなく、原文の範囲に沿って作ることが大切です。
以下は、学習用の例の作り方を示すものです。実際の正解文は、対象の本文・表・注記を確認して用意します。
| 例の種類 | 質問・指示の例 | 確認したいこと |
|---|---|---|
| 質問と回答 | この項目の注意点を説明してください | 条件や注記を含めて答えられるか |
| 要約 | この節の要点を3つに整理してください | 重要な条件を落としていないか |
| 表の整理 | 確認項目と注意事項を表にしてください | 列や項目の対応が正しいか |
| 根拠付きの説明 | 回答の根拠となる箇所を示してください | 原文と説明が一致しているか |
本文、表、注記を目次項目ごとに再結合しておくと、説明に必要な条件を参照しながら例を作れます。逆に、読み取り時点で情報が欠けていれば、その欠けた内容をもとに誤った解答を作るおそれがあります。
OCRの品質が、検索の材料だけでなく、学習で使う「正解例」の品質にも影響します。 そのため、生成したデータも原文と照合してから使います。
学習のもとになるデータ(シードデータ)は、どんな形で保存するのか
ここで保存するのは、質問と正解の組に加工する前の、根拠となる知識です。目次項目ごとに再結合した内容と出典を保持し、学習目的に合わせて変換できる形にしておきます。
本文を確認するときは、見出しや表を書けるMarkdownが便利です。プログラムへ渡すときは、項目名と値を組にして書くJSONという形式を使えます。JSONを1行に1件ずつ並べた形式がJSONLです。
次は、日本糖尿病学会が公開する『糖尿病診療ガイドライン2024』第4章「運動療法」のCQ4-1を参照し、記事用に作成したシードデータの例です。本文に相当する部分には、公開資料の内容を短く要約して入れています。実際の開発で使った非公開データや、OCR出力そのものの抜粋ではありません。個別の患者への運動処方を示すものでもありません。出典:第4章「運動療法」p.67(公開PDFの1ページ目)
本番での管理をイメージしやすいよう、目次の階層、知識の本文、文書名・出典ページを一緒に保存します。読みやすさのために改行したJSONで示しています。実際のシードデータでは原文の条件・表・注記を保持し、この記事の短い要約例と区別します。
{
"seed_id": "article-seed-jds2024-cq4-1-001",
"section_path": [
"第4章 運動療法",
"CQ4-1 糖尿病の管理に運動療法は有効か?"
],
"text": "2型糖尿病では、血糖管理の改善を目的とした有酸素運動とレジスタンス運動を推奨しています。一方、1型糖尿病では、血糖管理への有効性について結論が一致していません。ただし、血糖以外の効果もあり、どちらの病型でも心血管疾患のリスク因子や体力の改善という観点から運動を推奨しています。",
"source": {
"title": "糖尿病診療ガイドライン2024",
"publisher": "日本糖尿病学会",
"section": "第4章 運動療法/CQ4-1",
"book_pages": [67],
"pdf_pages": [1],
"url": "https://www.jds.or.jp/uploads/files/publications/gl2024/04_1.pdf"
}
}
この例の読み方は、次のとおりです。
- section_path:所属する章・節の階層です。知識がどの目次項目に対応するかを示します。
- text:学習用データを作る材料となる知識の本文です。この掲載例では、公開資料の要約を入れています。
- source:根拠を確認するための情報です。冊子のページ番号と、章別PDF内のページ番号を分けて記録しています。
- seed_id:元になる知識を識別する番号です。そこから作る学習用データにも対応関係を残し、出典の改訂時に見直す対象を追跡します。
この本文では、「1型では血糖管理への効果が明確でない」という説明を、「1型では運動に意味がない」と取り違えないようにしています。同じ項目の記述をまとめて保持することが、そこから作る学習用データの条件や意味を保つことにつながります。
シードデータから、Q&Aや自然文の学習用データへ展開する
シードデータを整えた後、学習の目的に合わせて加工します。たとえばSFTでは「1型と2型で運動療法の位置づけはどう違うか」という質問と、根拠に沿った回答の組を作れます。
一方、継続事前学習は、既存のモデルへ文章などを使って事前学習を続ける方法です。テキストを用いる場合は、質問・回答に分けず、知識を説明する自然文のまとまりを使えます。シードデータから、条件や文脈のつながりを保った文章を整えます。
| データの段階 | 内容 | 役割 |
|---|---|---|
| シードデータ | 目次項目ごとの本文・表・注記と出典 | 学習用データを作る共通の材料 |
| SFT向けの学習用データ | Q&Aや指示と回答の組 | 望ましい応答を例で示す |
| 継続事前学習向けの学習用データ | 知識を説明する自然文のまとまり | 文章を使って事前学習を続ける |
シードデータをどう加工するかと、どの方法でモデルを学習するかを分けて考えると、データの役割が明確になります。本稿のサンプルは、この表の最初の段階を示しています。継続事前学習については、ここでは展開先の一例として紹介しています。
実際に学習へ渡す際は、加工後のデータを使用するツールの指定形式へ合わせ、出典やシードデータとの対応は管理用に保持します。公開閲覧できることと、自由な再配布・学習利用の許諾があることは区別し、用途に応じて資料の利用条件を確認します。
ここで大切なのは、ファイル形式の名前を覚えることよりも、原文・シードデータ・加工後の学習用データを対応付けて管理することです。原文を修正したときに、どの学習用データを見直すべきかも分かりやすくなります。
SFT・LoRA・QLoRAは、それぞれ何を指すのか
SFTは、質問と望ましい回答などの例を使う学習の方法です。LoRA(ローラ)は、大きなモデルの全パラメーターを更新する代わりに、小さな追加パラメーターを学習する方法です。
QLoRA(キューローラ)は、基になるモデルをより少ないビット数で保持する「量子化」を組み合わせ、メモリー使用量を抑えてLoRAによる学習を行う方法です。
つまり、SFTとLoRA・QLoRAは同じ分類の言葉ではありません。SFTを行う際に、LoRAやQLoRAを使う、という組み合わせができます。まずは「作った例を使って、モデルの出力を調整する方法がある」と捉えれば十分です。
今回の流れでは、合成データを学習用データ構成の中核に据えました。ただし、データを多く作るほど必ず良くなるわけではありません。誤り、重複、内容の偏りを確認し、必要な例を選ぶことが欠かせません。
7. 最後は、読み取り・検索・回答を分けて確かめる
どの工程で間違えたかを確認する
最終的な回答が間違っていても、原因は一つとは限りません。OCRで読み違えたのか、再結合で注記を落としたのか、検索で別の節を選んだのか、根拠を渡したのに回答で取り違えたのかを分けて確認します。
| 確認する工程 | 見るポイント |
|---|---|
| 構造化OCR | 文字・行・列・注記が原文と一致するか |
| チャンクの再結合 | 同じ目次項目の本文・表・注記がつながっているか |
| RAGの検索 | 質問に必要な根拠へたどり着けるか |
| 合成データの生成 | 質問と正解が原文の内容や条件に沿っているか |
| 学習後の回答 | 学習に使っていない問題でも、根拠に沿って答えられるか |
学習に使う例とは別に、評価用の問題も用意します。同じ原文から作ったよく似た質問が両方に混ざると、改善を過大に見積もることがあるため、文書や節の単位でも分け方を考えます。
処理が完了したことと、正しく読めたことは別
今回の処理では、出力上限に当たったページを3分割で再処理し、処理を完了できました。これは出力の途中切れに対応できたという結果です。すべての文字や意味が正しいと保証するものではないため、原文との照合や検索・回答の評価を組み合わせます。
今後は、構造化した資料、目次項目ごとの知識、検索用チャンク、学習用の例、評価結果を、共通の文書番号で追える形に整えていきます。CorpusLabでも、PDFから検索・学習・評価までをつなぐ流れとして発展させていく予定です。
8. おわりに:正しく分けて読み、意味がつながる形へ戻す
今回の工夫は、LLMとの対話で把握した文書構造を、画像の分割からチャンクの再結合まで引き継いだことです。医療ガイドラインの目次を手がかりに、本文・表・注記を意味のまとまりへ戻し、ナレッジベース化しました。
RAGには、必要な根拠を探すための材料が必要です。モデル学習には、望ましい答え方を示す正確な例が必要です。同じナレッジベースを、それぞれの目的に合う形へ展開します。
読み取るために分け、理解して使うためにつなぎ直す。 この視点を持つことで、OCRからRAGやモデル学習へ進む道筋が見えてきます。
謝辞
この成果は、NEDO(国立研究開発法人新エネルギー・産業技術総合開発機構)の委託業務(JPNP25006)の結果得られたものです。


