本文へスキップ
BecomeCoder

RAGコース · 第2章 文書を準備する ― チャンク分割 · レッスン6

固定長チャンク ― 文字数で刻む

ブラウザで完結

導入

いちばん単純な分割方法は、「N文字ごとに機械的に切る」やり方です。実装が簡単なぶん、どんな文書にもすぐ使えます。

説明

def chunk_fixed(text, size):
    return [text[i:i+size] for i in range(0, len(text), size)]

text = "Retrieval augmented generation splits documents into chunks for search."
chunks = chunk_fixed(text, 20)
print("Number of chunks:", len(chunks))
for i, c in enumerate(chunks):
    print(f"[{i}] {c!r}")

chunk_fixed は、range(0, len(text), size) で先頭位置を size ずつずらしながら、text[i:i+size] でその位置から size 文字を切り出しています。仕組みはこれだけです。

ただし出力をよく見てください。単語の途中でぶつ切りになっている箇所があります(たとえば "for sea""rch." のように、"search" という単語が2つのチャンクにまたがって分断されてしまいます)。文字数だけを基準にしているので、単語や文の切れ目は一切考慮されません。これが固定長チャンクの弱点です。

やってみよう

chunk_fixed(text, 10)chunk_fixed(text, 30) のように size を変えて、チャンク数と1つあたりの内容がどう変わるか比べてみましょう。

演習

chunk_fixed を使って、textsize=15 で分割し、できたチャンクの個数print で表示してください。

ヒント1を見る

chunks = chunk_fixed(text, 15) としてから len(chunks) を表示します。

ヒント2を見る

print(len(chunk_fixed(text, 15))) のように1行で書いても構いません。

実際に動かしてみよう

下のエディタにPythonを書いて「実行」を押すと、scikit-learn(TF-IDF)とnumpyで本物の「検索」をその場で動かせます。RAGの検索フェーズ――文書のチャンク分割・ベクトル化・類似度計算・並べ替え――が実際に動きます。scikit-learn を使う回は初回の読み込みに数十秒かかることがあります。検索デモのサンプル文書は英語です(TF-IDFの既定トークナイザが日本語を分割できないため。日本語検索の対処は読み物で解説します)。LLMの生成や本物の埋め込みAPIは、APIキーが要るため読み物の回でコードを示します。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。