0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【RAG性能向上】ドキュメントのチャンキング(Chunking)最適化手法をコード付きで解説

0
Posted at

【RAG性能向上】ドキュメントのチャンキング(Chunking)最適化手法をコード付きで解説

Feature (13).png

はじめに

2026年、生成AIのビジネス活用においてRAG(Retrieval-Augmented Generation)は標準的な技術となりました。しかし、多くのエンジニアが直面するのが「検索精度の壁」です。LLM自体の性能向上も重要ですが、実は検索精度を左右する最大の要因は、ドキュメントをどのように分割するか、つまり**「チャンキング(Chunking)」**にあります。

「Garbage In, Garbage Out(ゴミを入れればゴミが出る)」の通り、不適切な分割は文脈の欠落を招き、LLMが正しい回答を生成するのを妨げます。本記事では、ハノイを拠点に高度なAI開発を行う NKKTech Software の知見をもとに、主要なチャンキング手法とそれぞれの最適化コードを解説します。


1. なぜチャンキングの最適化が必要なのか?

単一のドキュメント(例:100ページのPDF)をそのままベクトル化して検索することは不可能です。モデルの入力トークン制限や検索の関連性を考慮し、適切なサイズに分割する必要があります。

  • チャンクが大きすぎる場合: ノイズが多くなり、LLMが回答に必要な情報を特定しにくくなる。
  • チャンクが小さすぎる場合: 重要な文脈が途切れてしまい、意味が通じなくなる。

2. 実践的なチャンキング手法

2026年現在、主流となっている3つの手法をコードとともに紹介します。

① 再帰的文字分割 (Recursive Character Splitting)

LangChainなどのライブラリで標準的に使われる手法です。段落、文、単語の順に、指定したチャンクサイズに収まるよう再帰的に分割を試みます。

recursive_split.py
from langchain_text_splitters import RecursiveCharacterTextSplitter

text = "ここに長大な社内ドキュメントのテキストが入ります..."

# チャンクサイズとオーバーラップ(重なり)を設定
# オーバーラップを設けることで、文脈の断絶を防ぎます
splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    separators=["\n\n", "\n", "", "", " ", ""]
)

chunks = splitter.split_text(text)
print(f"分割後の数: {len(chunks)}")

② セマンティック・チャンキング (Semantic Chunking)

2026年現在のRAG実装において、最も「インテリジェント」な分割手法として注目されているのがセマンティック・チャンキングです。

従来の「文字数」ベースの分割とは異なり、Embeddingモデルを用いて文章間の「意味的な距離」を計算します。話題が急激に変化する箇所(意味的な類似度が閾値を下回るポイント)をAIが自動で検知して分割するため、コンテキストが破壊されにくいという大きなメリットがあります。

semantic_split.py
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings

# 意味的な類似度を計算するためにEmbeddingモデルを使用
# 2026年現在の高性能なモデル(text-embedding-3-small等)を推奨します
embeddings = OpenAIEmbeddings()

# セマンティック・チャンカーの初期化
# breakpoint_threshold_type="percentile" を指定することで、
# 全体の類似度分布から統計的に適切な分割ポイントを特定します
semantic_chunker = SemanticChunker(
    embeddings, 
    breakpoint_threshold_type="percentile"
)

# チャンク分割の実行
# 意味の連続性が保たれた、精度の高いチャンクが生成されます
chunks = semantic_chunker.create_documents([text])

# 結果の確認
for i, chunk in enumerate(chunks):
    print(f"--- Chunk {i+1} ---")
    print(chunk.page_content)

③ 構造化ドキュメント分割 (Markdown / HTML Splitter)

Wiki、技術仕様書、マニュアルなど、マークダウン形式やHTMLといった明確な構造を持つドキュメントに極めて有効な手法です。

最大の特徴は、見出し(###)を基準に分割する点です。これにより、特定のトピックに関する記述が途中で断絶されるのを防ぎ、情報の「階層構造」を維持したままベクトルデータベースへ格納できます。

markdown_split.py
from langchain_text_splitters import MarkdownHeaderTextSplitter

# 分割の基準とするヘッダーレベルを指定
headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]

# スプリッターの初期化
markdown_splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=headers_to_split_on,
    strip_headers=False # ヘッダーテキストをチャンク内に保持するかどうか
)

# 分割の実行
md_header_splits = markdown_splitter.split_text(text)

# 各チャンクのメタデータには、どの見出しに属しているかの情報が自動付与されます
for chunk in md_header_splits:
    print(f"Metadata: {chunk.metadata}")
    print(f"Content Sample: {chunk.page_content[:50]}...")

3. 最適な手法を選ぶための比較表

ドキュメントの性質に合わせて、以下の表を参考に最適な手法を選択してください。

手法 適したドキュメント メリット デメリット
再帰的分割 一般的なテキスト、ニュース、雑記 実装が容易で高速。計算コストが低い。 意味の区切れを無視し、文脈が断絶しやすい。
セマンティック 論文、契約書、技術解説 文章の意味の連続性を高度に維持できる。 Embedding計算が必要なため、コストと時間がかかる。
構造化分割 Wiki、マニュアル、README 情報の階層構造(見出し関係)を完璧に維持。 MarkdownやHTML形式でない文書には適用不可。

4. 精度向上のための3大チェックポイント

チャンキング手法を決めた後、さらに精度を引き上げるための運用上の工夫です。

  1. Overlap(重複)の設定
    前後のチャンクと 5〜10%程度の内容を重複(Overlap) させてください。これにより、分割地点付近にあるキーワードの文脈が途切れるのを防ぎ、検索ヒット率が劇的に向上します。
  2. メタデータの付与
    分割された各チャンクには、必ず以下の情報をメタデータとして付与しましょう。
    • source: 元ファイル名やURL
    • page_number: 参照元のページ番号
    • summary: そのセクションの短い要約(ハイブリッド検索に有効)
      これらは検索時のフィルタリングや、LLMが回答の根拠を示す際に不可欠です。
  3. 定量評価(RAGAS)の導入
    「なんとなく良くなった」を卒業しましょう。 RAGASTruLens といった評価フレームワークを用い、現在のチャンク設定が「忠実性(Faithfulness)」や「文脈の妥当性」において何点なのかを定量的に計測し、改善サイクルを回します。

まとめ:チャンキングは「AIの視力」を決める

RAGにおいて、チャンキングはAIが膨大な情報の中から必要なデータを見つけ出すための「レンズ」の役割を果たします。

ドキュメントの性質に合わせて最適な手法を選択し、パラメータを微調整することで、回答精度は劇的に向上します。「RAGの回答がズレる」「ハルシネーション(嘘)が多い」と悩んでいる方は、モデルを変更する前に、まず チャンキングの戦略 を見直してみてください。


🚀 NKKTech Software:高精度AI開発のパートナー

私たちは、ベトナム・ハノイを拠点に、日本品質のきめ細やかなマネジメントと最先端のAI技術力を融合させた開発チームです。

  • 検索精度を極限まで高めたRAGシステム(社内FAQ・マニュアル検索)の構築
  • 大規模ドキュメントのAI自動解析パイプラインの開発
  • セキュアかつスケーラブルな社内ナレッジベースの構築

AI導入や現在のRAGシステムの精度改善でお困りでしたら、ぜひ一度ご相談ください。

確かなエンジニアリング力で、貴社のデータから真の価値を引き出します。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?