ブログ
RAG最適化
"チャンク設計"で文脈理解が激変〜最適な分割方法とその効果〜
長文や複雑文書で文脈が途切れる課題を、オーバーラップ・ウィンドウサイズ・意味分割で解決。LangChain/LlamaIndexのセマンティック分割を実践解説。
髙
髙谷 謙介
COO
9 分
Table of Contents
"チャンク設計"で文脈理解が激変〜最適な分割方法とその効果〜
RAGシステムにおいて、文書の分割方法(チャンク設計)は検索精度と回答品質を大きく左右します。適切なチャンク設計により、長文や複雑な文書でも文脈を保持し、より正確な情報検索が可能になります。
チャンク設計の重要性
従来の課題
- •文脈の分断: 固定長分割により重要な情報が分散
- •検索精度の低下: 関連情報が異なるチャンクに分かれることで検索漏れが発生
- •回答品質の劣化: 文脈情報の不足により不正確な回答を生成
チャンク設計による改善効果
適切なチャンク設計により、以下の改善が期待できます:
- •文脈保持率の向上: 70%以上の文脈情報を維持
- •検索精度の改善: 関連文書の検索精度が30-50%向上
- •回答品質の向上: より正確で詳細な回答を生成
主要なチャンク設計手法
1. オーバーラップ分割
隣接するチャンク間で一部の内容を重複させることで、文脈の連続性を保つ手法です。
実装例(LangChain):
python
1from langchain.text_splitter import RecursiveCharacterTextSplitter
2
3splitter = RecursiveCharacterTextSplitter(
4 chunk_size=1000,
5 chunk_overlap=200, # 20%のオーバーラップ
6 separators=["\n\n", "\n", "。", ".", " ", ""]
7)
8
9chunks = splitter.split_text(document_text)
最適化のポイント:
- •オーバーラップ率: 15-25%が効果的
- •文書の種類に応じた調整が必要
2. セマンティック分割
文章の意味的な区切りを考慮した分割手法です。
LlamaIndexでの実装:
python
1from llama_index.text_splitter import SentenceSplitter
2
3splitter = SentenceSplitter(
4 chunk_size=512,
5 chunk_overlap=50,
6 paragraph_separator="\n\n"
7)
8
9nodes = splitter.get_nodes_from_documents(documents)
3. 階層的分割
文書の構造(見出し、段落等)を考慮した分割手法です。
実装例:
python
1from langchain.text_splitter import MarkdownHeaderTextSplitter
2
3headers_to_split_on = [
4 ("#", "Header 1"),
5 ("##", "Header 2"),
6 ("###", "Header 3"),
7]
8
9markdown_splitter = MarkdownHeaderTextSplitter(
10 headers_to_split_on=headers_to_split_on
11)
文書タイプ別最適化戦略
技術文書
- •推奨チャンクサイズ: 800-1200トークン
- •オーバーラップ: 20-25%
- •分割基準: コードブロック、セクション単位
法務文書
- •推奨チャンクサイズ: 600-900トークン
- •オーバーラップ: 15-20%
- •分割基準: 条項、段落単位
FAQ・Q&A
- •推奨チャンクサイズ: 300-600トークン
- •オーバーラップ: 10-15%
- •分割基準: 質問-回答ペア単位
パフォーマンス評価と改善
評価指標
1. 検索精度: Precision@K, Recall@K
2. 文脈保持: 意味的類似度スコア
3. 回答品質: BLEU, ROUGE, BERTScore
継続的改善プロセス
python
1# チャンク品質評価の例
2def evaluate_chunk_quality(chunks, queries, ground_truth):
3 precision_scores = []
4 recall_scores = []
5
6 for query, truth in zip(queries, ground_truth):
7 retrieved_chunks = retrieve_chunks(query, chunks)
8 precision = calculate_precision(retrieved_chunks, truth)
9 recall = calculate_recall(retrieved_chunks, truth)
10
11 precision_scores.append(precision)
12 recall_scores.append(recall)
13
14 return {
15 'avg_precision': sum(precision_scores) / len(precision_scores),
16 'avg_recall': sum(recall_scores) / len(recall_scores)
17 }
実装ベストプラクティス
1. 動的チャンクサイズ調整
文書の複雑さに応じてチャンクサイズを動的に調整:
python
1def adaptive_chunk_size(text_complexity):
2 if text_complexity > 0.8:
3 return 600 # 複雑な文書は小さなチャンク
4 elif text_complexity > 0.5:
5 return 800 # 中程度
6 else:
7 return 1200 # シンプルな文書は大きなチャンク
2. メタデータ付与
チャンクに文脈情報を付与:
python
1chunk_metadata = {
2 'document_title': document.title,
3 'section': section_name,
4 'chunk_index': index,
5 'semantic_type': 'explanation', # explanation, example, definition等
6 'complexity_score': complexity
7}
3. 品質監視システム
python
1def monitor_chunk_quality():
2 metrics = {
3 'avg_chunk_size': calculate_avg_size(),
4 'overlap_ratio': calculate_overlap_ratio(),
5 'semantic_coherence': calculate_coherence(),
6 'retrieval_accuracy': evaluate_retrieval()
7 }
8
9 if metrics['retrieval_accuracy'] < 0.7:
10 trigger_reoptimization()
11
12 return metrics
まとめ
効果的なチャンク設計は、RAGシステムの性能を大幅に改善します。文書の特性を理解し、適切な分割手法とパラメータを選択することで、検索精度と回答品質の両方を向上させることができます。
継続的な評価と改善を通じて、最適なチャンク設計を維持し、ユーザーにとってより価値の高い情報検索体験を提供しましょう。