チャンキング

長い文書を小さな単位(チャンク)に分割する処理。RAGの検索精度を大きく左右する重要な前処理。

なぜチャンキングが必要か

チャンクサイズの例

チャンキングの難しさ

問題例:文脈の断絶

チャンク1: 「当社のシステムは、JWTベースの認証を採用しています。」
---(分割)---
チャンク2: 「ユーザーがログインすると、サーバーはトークンを発行し...」

この場合:

解決策:重複(Overlap)

チャンク間で一部を重複させることで文脈を維持:

チャンク1: 「当社のシステムは、JWTベースの認証を採用しています。ユーザーがログインすると...」
チャンク2: 「JWTベースの認証を採用しています。ユーザーがログインすると、サーバーはトークンを発行し...」

重複率の目安: 10〜20%

チャンキング戦略

1. 固定長分割

2. 意味単位分割

3. 階層的分割

4. コード専用戦略

トレードオフ

チャンクサイズ 利点 欠点
小さい(100〜200トークン) 検索精度が高い 文脈が失われやすい
大きい(500〜1000トークン) 文脈が豊富 検索精度が下がる、コスト増

ベストプラクティス

  1. ドメインに応じて調整: 文章、コード、FAQで最適なサイズは異なる
  2. 重複を持たせる: 10〜20%の重複で文脈の断絶を防ぐ
  3. メタデータを保存: チャンクの元ファイル、位置情報を記録
  4. 実験と調整: 検索精度を測定しながらサイズを調整

コードのチャンキング例

# 悪い例:関数だけ
def authenticate(user):
    # 文脈(JWTを使うこと)が失われる
    return generate_token(user)

# 良い例:関数+コメント+依存関係
"""
JWT-based authentication system.
Uses HS256 algorithm for token signing.
"""
def authenticate(user):
    return generate_token(user)

def generate_token(user):
    return jwt.encode({"user_id": user.id}, secret_key)

運用上の注意点

関連

参照