はじめに
RAGの品質はモデルだけでなく、データがどのようにインジェスト・チャンキング・インデキシングされるかに大きく依存します。このレッスンでは、パイプライン全体を基礎から構築します。
1. ソースドキュメントの種類
内部ナレッジベースの一般的なソース:
- Markdown技術ドキュメント
- PDF運用手順書
- Wiki/Confluenceエクスポート
- Slackスレッドのエクスポート
各ソースには独自のパーサーとクリーンアップステップが必要です。
2. テキスト正規化
チャンキング前にクリーンアップ:
- ヘッダー/フッター/ページ番号の除去
- Unicodeの正規化(NFC)
- テーブルのフラット化またはスキップ
- コードブロックの保持
ベトナム語テキストの場合、声調記号の正しい処理を確認してください。
3. チャンキング戦略
推奨パラメータ:
- チャンクサイズ:600〜1000トークン
- オーバーラップ:50〜100トークン
- セクション見出しで優先的に分割
- コードブロックは分割しない
見出しベースの分割は、ランダムな文字数分割よりも検索品質が良くなります。
4. メタデータの保存
各チャンクに付加:
doc_idsection_titlechunk_indexsource_pathlast_updatedlanguage
メタデータが豊富であれば、あとでフィルタリングやデバッグが容易になります。
5. エンベディングパイプライン
ローカル推奨モデル:
nomic-embed-text(Ollama経由)bge-m3(多言語対応)
バッチ処理でエンベディングを生成し、ベクトルDBにupsertします。
import chromadb
client = chromadb.PersistentClient(path="./vectordb")
collection = client.get_or_create_collection("internal-docs")
collection.upsert(
ids=[chunk["id"] for chunk in chunks],
documents=[chunk["text"] for chunk in chunks],
metadatas=[chunk["metadata"] for chunk in chunks],
)
6. インデックスのライフサイクル管理
- ステージングインデックスで検証してからプロダクションにプロモーション
- 古いドキュメントの定期的な再インデキシング
- バージョニングでロールバック可能に
デモコード
インジェストパイプラインの実行結果 — 127チャンク処理:

ChromaDBコレクションの状態確認:

ソースコード:04-rag-ingestion