AI Prompt Engineering · レッスン

長文のチャンク分割戦略

固定サイズ、文の境界、意味に基づくチャンク分割の手法を学びます。

レッスン 1/413 ステップ

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

長いドキュメントが難しい理由

LLMにはコンテキストウィンドウがあり、一度に処理できるトークン数に上限があります。GPT-4は128kトークン、Claudeは200kトークンに対応していますが、多くのドキュメントはこれらの上限さえ超えます。さらに重要なのは、非常に長いコンテキストではモデルの精度が低下することが研究で示されている点です。チャンク分割とは、処理前にドキュメントを小さな部分に分割する手法です。

固定サイズチャンク分割

固定サイズチャンク分割では、内容の境界に関係なく、N個のトークン(または文字)ごとにテキストを分割します。最も単純な戦略であり、意味を理解する処理は必要ありません。

一般的なチャンクサイズは500~1000トークンです。チャンクはインデックス化や取得が簡単ですが、文の途中で分割される可能性があり、境界で意味が失われることがあります。

import tiktoken

def fixed_chunk(text, max_tokens=1000):
    enc = tiktoken.get_encoding('cl100k_base')
    tokens = enc.encode(text)
    chunks = []
    for i in range(0, len(tokens), max_tokens):
        chunk_tokens = tokens[i:i + max_tokens]
        chunks.append(enc.decode(chunk_tokens))
    return chunks

chunks = fixed_chunk(long_document)
print(f'Total chunks: {len(chunks)}')

固定サイズチャンク分割のトレードオフ

メリット:

  • 実装が簡単で、NLPが不要です
  • チャンクサイズが予測可能で、APIコストを管理しやすくなります
  • 処理が高速です

デメリット:

  • 文や段落の境界をまたいで分割されます
  • 文が複数のチャンクに分割されると、検索時にコンテキストが失われます
  • チャンクが議論の途中で終わる可能性があり、要約には不向きです

文境界チャンク分割

文境界チャンク分割では、自然な文や段落の区切りでテキストを分割します。各チャンクが句点で終わるため、文が途中で分割されることはありません。これにより、読みやすく一貫性のあるチャンクが生成されます。

spaCyやNLTKなどの文分割器を使用して境界を検出し、チャンクが目標サイズに達するまで文をまとめます。

import spacy

nlp = spacy.load('en_core_web_sm')

def sentence_chunk(text, max_tokens=1000):
    doc = nlp(text)
    sentences = [sent.text.strip() for sent in doc.sents]
    chunks, current, count = [], [], 0
    for sent in sentences:
        word_count = len(sent.split())
        if count + word_count > max_tokens and current:
            chunks.append(' '.join(current))
            current, count = [], 0
        current.append(sent)
        count += word_count
    if current:
        chunks.append(' '.join(current))
    return chunks

セマンティックチャンク分割

セマンティックチャンク分割はさらに進んだ手法で、トピックが変化した箇所でテキストを分割します。隣接する文を埋め込みに変換してコサイン類似度を測定することで、議論が新しいテーマに移ったタイミングを検出できます。

類似度が閾値を下回ったらチャンク境界を挿入します。これにより、テーマのまとまりが保たれたチャンクが生成され、検索拡張生成(RAG)に適したものになります。

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

model = SentenceTransformer('all-MiniLM-L6-v2')

def semantic_chunk(sentences, threshold=0.75):
    embeddings = model.encode(sentences)
    chunks, current = [], [sentences[0]]
    for i in range(1, len(sentences)):
        sim = cosine_similarity(
            [embeddings[i-1]], [embeddings[i]]
        )[0][0]
        if sim < threshold:
            chunks.append(' '.join(current))
            current = []
        current.append(sentences[i])
    if current:
        chunks.append(' '.join(current))
    return chunks

3つの戦略の比較

選択に役立つよう、横並びで比較します。

  • 固定サイズ:最も高速ですが、境界の精度は最も低く、単純なパイプラインに適しています
  • 文境界:文の完全性を保つため、一貫性が重要な場合に適しています
  • セマンティック:テーマのまとまりが最も優れており、正確な検索が重要なRAGに適しています

実際には、セマンティックチャンク分割では埋め込みの計算により遅延が発生します。検索精度の要件に基づいて選択します。

検索タスクのためのチャンク分割

検索拡張生成(RAG)では、チャンクが検索の単位になります。ユーザーのクエリを埋め込みに変換し、最も類似したチャンクを取得してプロンプトに挿入します。

小さいチャンク(200~400トークン)では、各チャンクに焦点の絞られた1つのアイデアが含まれるため、検索の精度が向上します。大きいチャンク(800~1000トークン)ではより多くのコンテキストを提供できますが、関連する箇所とともに無関係な内容が含まれる可能性があります。

import openai
import numpy as np

client = openai.OpenAI(api_key='sk-...')

def embed(text):
    resp = client.embeddings.create(
        model='text-embedding-3-small',
        input=text
    )
    return np.array(resp.data[0].embedding)

def retrieve(query, chunks, top_k=3):
    q_emb = embed(query)
    scores = [(i, np.dot(q_emb, embed(c))) for i, c in enumerate(chunks)]
    scores.sort(key=lambda x: x[1], reverse=True)
    return [chunks[i] for i, _ in scores[:top_k]]

要約タスクのためのチャンク分割

要約では、完全な主張やセクションを含められる大きさのチャンクにします。600~800トークンの文境界チャンクが適しています。

各チャンクを個別に要約するのがmapステップで、その後、要約をまとめて最終的な要約を作成するのがreduceステップです。これは古典的なmap-reduceパターンで、次のレッスンで扱います。

オーバーラップ:チャンク境界をつなぐ

境界でのエラーを減らす実用的な方法の1つは、チャンク間にオーバーラップを追加することです。チャンクNの末尾100~200トークンを、チャンクN+1の先頭で繰り返します。

オーバーラップにより、境界をまたぐ文が少なくとも1つのチャンクには完全な形で含まれるようになります。これは検索で特に重要です。境界にまたがるトピックに関するクエリが、オーバーラップしたチャンクに一致するためです。

def fixed_chunk_with_overlap(text, max_tokens=1000, overlap=200):
    enc = tiktoken.get_encoding('cl100k_base')
    tokens = enc.encode(text)
    chunks = []
    step = max_tokens - overlap
    for i in range(0, len(tokens), step):
        chunk_tokens = tokens[i:i + max_tokens]
        chunks.append(enc.decode(chunk_tokens))
        if i + max_tokens >= len(tokens):
            break
    return chunks

チャンクごとのメタデータ拡充

各チャンクには、元の場所を後続の処理で参照できるようメタデータを付与します。

  • source:ファイル名またはURL
  • page:ページ番号
  • chunk_index:ドキュメント内の位置
  • section:章または見出し

このメタデータはベクトルDB(Pinecone、Chroma、Weaviate)内で埋め込みとともに保存され、取得したチャンクと一緒に返されます。これにより、LLMは出典を引用できます。

def chunk_with_metadata(text, source='doc.pdf', page=1):
    chunks = fixed_chunk_with_overlap(text)
    return [
        {
            'text': chunk,
            'metadata': {
                'source': source,
                'page': page,
                'chunk_index': i
            }
        }
        for i, chunk in enumerate(chunks)
    ]

適切な戦略の選択

簡単な判断ガイド:

  • 速度を優先し、内容が文章である:文境界チャンク分割
  • 検索精度が重要である:小さいチャンク(300トークン)によるセマンティックチャンク分割
  • 本やレポートを要約する:文境界、大きめのチャンク(800トークン)、map-reduce
  • 法務/技術文書:条項をまとめて保持するセマンティックチャンク分割

戦略を決定する前に、代表的なクエリセットで検索再現率を必ず測定します。

理解度チェック

隣接する文の埋め込み間のコサイン類似度がしきい値を下回ったときにテキストを分割するチャンク分割戦略はどれですか?

振り返り:チャンク分割戦略

中核となる3つのチャンク分割戦略を学びました。

  • 固定サイズ:Nトークンごとに分割します — 高速で単純ですが、境界を考慮しません
  • 文境界:自然な文の区切りで分割します — 一貫性があり、複雑さは中程度です
  • 意味ベース:埋め込みの類似度によるトピックの変化で分割します — 最も正確ですが、コストも最大です

チャンク間にオーバーラップを追加して境界による誤りを減らし、引用と追跡可能性を実現するために、必ずメタデータ(ソース、ページ、インデックス)を付与してください。次のレッスンでは、map-reduce要約パターンを扱います。

無料で開始

AI チューターと学ぶ AI Prompt Engineering — 無料

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

コース
53
レッスン
199

よくある質問

「長文のチャンク分割戦略」レッスンは無料ですか?

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

「長文のチャンク分割戦略」で何を学びますか?

固定サイズ、文の境界、意味に基づくチャンク分割の手法を学びます。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「長文のチャンク分割戦略」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 長文のチャンク分割戦略
  2. Map-Reduce 要約パターン
  3. 階層的要約
  4. チャンク間でコンテキストを維持する
← AI Prompt Engineeringに戻る