ストーリー
田
田中VPoE
Step 1でRAGの全体像を掴んだ。Step 2では「ドキュメント処理」に集中する。RAGの品質は入力データの品質で決まる
あなた
ドキュメント処理って、ファイルを読み込んでテキストにするだけではないんですか?
あ
田
田中VPoE
それは入口に過ぎない。NetShop社にはMarkdown、PDF、Confluence、Google Docs、Notion…多様な形式のドキュメントが散在している。それぞれの形式からテキスト、テーブル、画像、メタデータを正しく抽出する必要がある
田
田中VPoE
そうだ。しかも単にテキストを抽出するだけでは不十分だ。ヘッダー構造、テーブルの意味、コードブロックの扱い…ドキュメントの「構造」を保持することがRAGの検索品質に直結する
ドキュメント形式別の処理
主要な形式と処理方法
| 形式 | 特徴 | 処理ツール | 考慮事項 |
|---|
| Markdown | 構造が明確、パースしやすい | markdown-it, remark | ヘッダー階層を保持、コードブロック分離 |
| PDF | レイアウト情報が豊富だが抽出が難しい | PyMuPDF, pdfplumber, Unstructured | テーブル、画像、段組みの処理 |
| HTML | タグベースで構造が明確 | BeautifulSoup, Unstructured | ナビゲーション等の不要要素の除去 |
| Word(docx) | リッチテキスト形式 | python-docx, Unstructured | スタイル情報の活用、埋め込みオブジェクト |
| Confluence | REST APIでアクセス | Atlassian API + HTMLパーサー | ページ階層、マクロの展開 |
| Notion | APIでアクセス | Notion API | ブロック構造の再帰的取得 |
| Google Docs | Google Drive APIでアクセス | Google Docs API | コメント、提案の扱い |
テキスト抽出のアーキテクチャ
ドキュメントローダーのアーキテクチャ:
[ドキュメントソース]
├── ファイルシステム(Markdown, PDF, docx)
├── クラウドストレージ(S3, GCS)
├── SaaSプラットフォーム(Confluence, Notion, Google Docs)
└── データベース(Wiki, CMS)
↓
[Document Loader]
├── FormatDetector(形式判定)
├── TextExtractor(テキスト抽出)
├── StructureParser(構造解析)
├── MetadataExtractor(メタデータ抽出)
└── Cleaner(クリーニング)
↓
[統一ドキュメント形式]
{
"content": "抽出されたテキスト",
"metadata": { ... },
"structure": { "headings": [...], "tables": [...] }
}
PDF処理の実践
PDFはRAGで最も頻繁に扱う形式の一つですが、処理が最も困難でもあります。
PDFの種類と対応
| PDF種類 | 特徴 | 処理方法 |
|---|
| テキストベースPDF | テキストが直接埋め込まれている | テキスト抽出ライブラリで直接抽出 |
| スキャンPDF | 画像として保存されている | OCR(Tesseract, AWS Textract)が必要 |
| 複合PDF | テキストと画像が混在 | テキスト抽出 + OCRのハイブリッド |
テーブルの処理
| アプローチ | ツール | 精度 | 処理速度 |
|---|
| ルールベース | pdfplumber | 中〜高 | 高速 |
| ML ベース | Table Transformer | 高 | 中程度 |
| LLMベース | GPT-4 Vision | 非常に高 | 低速・高コスト |
| 専用サービス | AWS Textract, Azure Document Intelligence | 高 | 中程度 |
「テーブルの処理はRAGのアキレス腱だ。テーブルの内容をそのままテキスト化すると意味が崩れる。行と列の関係を保持した形でテキスト化するか、テーブル専用の検索パスを用意するかを検討する必要がある」 — 田中VPoE
構造の保持
ヘッダー階層の重要性
ドキュメントのヘッダー構造は、コンテキストの理解に不可欠です。
ヘッダー階層の保持例:
# RAGシステム設計ガイド
## 3. ベクトルDB
### 3.1 インデックス設計
インデックスのパラメータは以下の通り...
→ チャンク化する際に「3.1 インデックス設計」のテキストだけでなく、
上位ヘッダー「RAGシステム設計ガイド > ベクトルDB > インデックス設計」
というパンくず情報を付加する
コードブロックの扱い
| 戦略 | 説明 | 適するケース |
|---|
| 本文と一体で処理 | コードブロックを本文テキストの一部として扱う | 短いコード例 |
| 分離して処理 | コードブロックを独立したチャンクとして扱う | 長いコード、スニペット集 |
| メタデータ付加 | 言語、ファイル名等のメタデータを付加 | コード検索の精度向上 |
データクリーニング
よくあるノイズと対処
| ノイズ | 例 | 対処 |
|---|
| HTMLタグ残り | <div>, <span> | タグ除去、テキストのみ抽出 |
| 不要なヘッダー/フッター | ページ番号、著作権表示 | パターンマッチで除去 |
| 重複コンテンツ | テンプレートの定型文 | ハッシュベースの重複検出 |
| 特殊文字 | ゼロ幅スペース、制御文字 | Unicode正規化(NFKC) |
| 過度な空白 | 連続スペース、空行の連続 | 正規化処理 |
| 古い情報 | 廃止された手順、旧バージョンの仕様 | 日付ベースのフィルタリング |
クリーニングパイプラインの例:
Raw Text
→ Unicode正規化(NFKC)
→ HTMLタグ除去
→ 特殊文字の除去/置換
→ 空白の正規化
→ ヘッダー/フッター除去
→ 重複コンテンツの検出・除去
→ Clean Text
まとめ
| ポイント | 内容 |
|---|
| 形式別処理 | Markdown/PDF/HTML/Office等、形式ごとに適切なツールと処理方法を選択 |
| PDF処理 | テキストベース/スキャン/複合の種類を判別し、テーブル処理に注意 |
| 構造保持 | ヘッダー階層やコードブロックの構造を保持して検索精度向上 |
| クリーニング | ノイズの除去とテキストの正規化でデータ品質を確保 |
チェックリスト
次のステップへ
次は「チャンキング戦略」を学びます。抽出したテキストをどのように分割するかは、RAGの検索品質に最も大きな影響を与えます。
推定読了時間: 30分