AI Engineering Academy · レッスン

素朴なチャンク分割が検索に悪影響を与える理由

チャンク境界で回答が分断されたり、見出しやセクションタイトルから得られる文脈が失われたりするなど、不適切なチャンク分割によって生じる実際の検索失敗を分析します。

レッスン 1/413 ステップ

「素朴なチャンク分割が検索に悪影響を与える理由」はCoddyKit上の無料AI Engineering Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Engineering Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Engineering Academyコースには全4レッスンが含まれています。

不適切なチャンク分割のコスト

チャンク分割とは、文書をベクトルストアに埋め込む前に、小さな単位へ分割する処理です。どのように分割するかによって、検索時に利用できるコンテキストが決まります。不適切なチャンク分割は、RAGシステムが失敗する最も一般的で影響の大きい原因の1つです。

境界で分断される回答

次のような文書を考えてみます。「返金ポリシーは購入日から30日以内です。お客様は購入時の領収書原本を提出する必要があります。」 固定サイズの分割処理が「購入日から30日以内です。」の後で切れると、この2文は別々のチャンクに入ります。返金ポリシーについてのクエリでは前半だけが検索され、モデルは領収書が必要だと説明できない可能性があります。

見出しによって失われるコンテキスト

文書では、意味を伝えるためにセクション見出しが使われることがよくあります。「エンタープライズプランの料金」というタイトルの表と、その後に数値の行が続く場合を考えてみましょう。見出しと表が別々のチャンクに入ると、検索された表のチャンクにはラベルのない数値だけが含まれます。そのため、モデルは「エンタープライズの料金はいくらですか?」という質問に正しく答えられません。

固定サイズチャンク分割の落とし穴

固定サイズチャンク分割では、文の境界に関係なく、N文字またはNトークンごとにテキストを分割します。高速で単純な一方、文の途中で頻繁に分割されます。'The model was trained on'で終わるチャンクと、'a dataset of 500 billion tokens'で始まる次のチャンクは、互いがなければどちらも意味を成しません。

from langchain.text_splitter import CharacterTextSplitter

# Naive fixed-size: may break mid-sentence
splitter = CharacterTextSplitter(chunk_size=200, chunk_overlap=0)
chunks = splitter.split_text(document_text)
print(f'Created {len(chunks)} chunks')
print('First chunk:', chunks[0])

オーバーラップが常に役立つとは限らない

一般的な対策として、チャンクのオーバーラップを追加します。これは、あるチャンクの最後のNトークンを次のチャンクの先頭で繰り返す方法です。分断された文には有効ですが、冗長性が生じ、よく似た2つのチャンクがどちらも検索されたときにリトリーバーを混乱させる可能性があります。オーバーラップは応急処置であり、構造的なチャンク分割の問題を解決するものではありません。

# Overlap helps partially but adds redundancy
splitter = CharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50  # last 50 chars repeated in next chunk
)
chunks = splitter.split_text(document_text)

検索失敗率の測定

チャンク分割が検索に悪影響を与える頻度は、小規模なゴールデン評価セットを作成することで測定できます。既知の正しい参照箇所がある質問のリストを用意し、正しい参照箇所が上位k件の検索チャンクに含まれる頻度を確認します。ヒット率が低ければ、生成品質を調べる前にチャンク分割の問題が見つかることがよくあります。

def hit_rate(queries_and_answers, retriever, k=5):
    hits = 0
    for query, expected_text in queries_and_answers:
        results = retriever.retrieve(query, k=k)
        retrieved_texts = [r.page_content for r in results]
        if any(expected_text in text for text in retrieved_texts):
            hits += 1
    return hits / len(queries_and_answers)

コードと構造化データの問題

コードファイル、JSON、表には、関数、オブジェクト、表の行などの論理単位があり、分割すべきではありません。Pythonの関数定義を2つのチャンクに分けると、どちらのチャンクも単独では理解できなくなります。2つ目のチャンクを見つけたリトリーバーには、引数のないコードがコンテキストなしで表示されます。

# Bad: splits code arbitrarily
bad_chunk_1 = 'def calculate_price(item, qty'  # incomplete!
bad_chunk_2 = ', discount):\n    return item.price * qty * (1 - discount)'

# Good: keep the full function together
good_chunk = 'def calculate_price(item, qty, discount):\n    return item.price * qty * (1 - discount)'

長い文書と中央部分の喪失

LLMに関する研究では、「中央部分の見失い」という現象が示されています。多数のチャンクを検索してプロンプトに詰め込むと、モデルは冒頭と末尾に近い内容には注意を向けますが、中央部分は無視しがちです。低品質で小さなチャンクを大量に生成する不適切なチャンク分割は、関連する情報を薄めることでこの問題を悪化させます。

不適切なチャンクを手動で診断する

手早い診断方法は、チャンクをランダムにいくつか出力して読んでみることです。このチャンクは単独で意味を成しているか。ユーザーが質問した場合、このチャンクだけでモデルは回答できるか。と自問してください。指示対象が不明な代名詞(「彼はそう言いました……」)、不完全なコード、コンテキストのない数値を含むチャンクは危険信号です。

import random

def audit_chunks(chunks, sample_size=10):
    sample = random.sample(chunks, min(sample_size, len(chunks)))
    for i, chunk in enumerate(sample):
        print(f'--- Chunk {i+1} ({len(chunk)} chars) ---')
        print(chunk[:300])
        print()

チャンクサイズが大きすぎる場合

非常に大きなチャンクは、検索の精度を低下させます。広いトピックを扱う2000トークンのチャンクは多くのクエリに一致する可能性がありますが、LLMにとってはノイズが多すぎます。そのチャンクの中から、干し草の山の中の針を探さなければなりません。小さく焦点を絞ったチャンクは、周辺コンテキストを取りこぼす可能性がある代わりに、精度を高めます。

これらの問題を解決する戦略

単純な固定サイズチャンク分割より優れた方法には、文の途中で切らない文境界分割、トピックの境界で分割する意味チャンク分割、より広いコンテキストを保持する親子チャンク分割、コードの関数、HTMLタグ、Markdownの見出しを考慮する文書対応分割があります。この先の各レッスンで、これらの方法を1つずつ扱います。

クイックチェック

このレッスンで扱ったチャンク分割の失敗パターンについて、理解度を確認します。

レッスンのまとめ

このレッスンでは、単純な固定サイズチャンク分割は文やセクションの境界を壊すこと、オーバーラップは部分的な対策になるものの冗長性を増やすこと、そしてチャンクの品質が検索ヒット率を直接左右することを学びました。次は、埋め込みの類似度を使って自然なトピック境界でテキストを分割する、意味チャンク分割について学びます。

無料で開始

AI チューターと学ぶ Python — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「素朴なチャンク分割が検索に悪影響を与える理由」レッスンは無料ですか?

はい。「素朴なチャンク分割が検索に悪影響を与える理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Engineering Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Engineering Academyコースには全4レッスンが含まれています。

「素朴なチャンク分割が検索に悪影響を与える理由」で何を学びますか?

チャンク境界で回答が分断されたり、見出しやセクションタイトルから得られる文脈が失われたりするなど、不適切なチャンク分割によって生じる実際の検索失敗を分析します。 ブラウザで直接実行するハンズオンコードでAI Engineering Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AI Engineering Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAI Engineering Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「素朴なチャンク分割が検索に悪影響を与える理由」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAI Engineering Academyレッスンでコードを書いて実行できますか?

はい。すべてのAI Engineering Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 素朴なチャンク分割が検索に悪影響を与える理由
  2. 埋め込み類似度による意味的チャンク分割
  3. 親子チャンクと小から大への検索
  4. コードとHTMLに特化したドキュメント戦略
← AI Engineering Academyに戻る