チャンク範囲の設定
重要な情報が途中でぶった切られるのを防ぐため、
chunk_overlapを設定して
チャンクと次のチャンクの範囲をある程度重複させて分割
# Load documents from a text file loader = TextLoader(file_path="harrypotter.txt", encoding = 'UTF-8') docs = loader.load() # Split documents into chunks text_splitter = RecursiveCharacterTextSplitter(chunk_size=250, chunk_overlap=24) documents = text_splitter.split_documents(documents=docs)
とあるが 適切なチャンク範囲の設定はどのようにすれば良いのか?
これをGPTで調べてみた
適切な `chunk_size` と `chunk_overlap` の設定は、以下の要因によって決まります。
## 1. **チャンクサイズ (`chunk_size`) の決定**
– **短すぎると**:単語や文章が分断され、情報の流れが失われる。
– **長すぎると**:分割する意味が薄れ、メモリ消費が大きくなる。
– **一般的な目安**:
– **250~500文字**:短め(検索用、要約用)
– **500~1000文字**:バランス型(QAシステム、ベクトル検索)
– **1000~2000文字**:長め(LLMのコンテキスト処理)
例:
– 段落単位で検索するなら **500~1000文字**
– 文脈を広く持ちたいなら **1000~2000文字**
## 2. **チャンクの重複 (`chunk_overlap`) の決定**
`chunk_overlap` を設定することで、情報の途切れを防ぐことができます。適切な値は以下のように決めます。
– **目安**:
– `chunk_size` の **10~20%** くらいが一般的
– 例えば `chunk_size=500` なら `chunk_overlap=50~100`
– 重要な文脈を保持したいなら `chunk_overlap=20~30%`
### **例**
– `chunk_size=250`, `chunk_overlap=24` (10%程度) → 短めのコンテンツ
– `chunk_size=500`, `chunk_overlap=100` (20%程度) → 一般的な設定
– `chunk_size=1000`, `chunk_overlap=200` (20%程度) → 長めのコンテンツ
## 3. **チューニング方法**
適切な値を決めるには、以下の手順で調整すると良いです。
1. **テスト用の分割を試す**
“`python
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
chunks = text_splitter.split_documents(docs)
for i, chunk in enumerate(chunks[:5]):
print(f”Chunk {i+1}:\n{chunk}\n{‘=’*50}”)
“`
2. **実際の分割結果を確認**
– 文が不自然に切れていないか?
– 重要なキーワードが両方のチャンクに残っているか?
3. **調整する**
– 重要な部分が切れるなら `chunk_overlap` を増やす
– 無駄に長いなら `chunk_size` を小さくする
## 4. **応用**
### **改行や句読点で分割する**
より自然な分割をしたい場合、`separator` を設定できます。
“`python
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=100,
separators=[“\n\n”, “\n”, “。”, “、”, ” “]
)
“`
– 段落 (`\n\n`)、改行 (`\n`)、句読点 (`。` や `、`) で優先的に分割
– なるべく意味のある単位でチャンクを作成可能
—
### **結論**
– 一般的には **`chunk_size=500`, `chunk_overlap=100` (20%)** くらいが良い
– **内容が切れやすいなら `chunk_overlap` を増やす**
– **より自然な分割には `separators` を活用する**
– **実際に試して調整するのが最も確実**