文字分割器
先決條件
- 文件
- Tokenization(/docs/concepts/tokens)
概述
文件分割通常是許多應用程式的關鍵預處理步驟。它涉及將大型文本分解為更小、更易於管理的塊。此過程提供多項好處,例如確保一致處理不同長度的文件、克服模型的輸入大小限制,以及提高檢索系統中使用的文本表示的質量。有幾種分割文件的策略,每種策略都有其自身的優點。
關鍵概念
文字分割器將文件分割成更小的塊,以便在下游應用程式中使用。
為什麼要分割文件?
有幾個分割文件的原因
- 處理非均勻的文件長度:真實世界的文件集合通常包含大小不一的文本。分割確保所有文件的一致處理。
- 克服模型限制:許多嵌入模型和語言模型都有最大輸入大小限制。分割使我們能夠處理原本會超出這些限制的文件。
- 提高表示質量:對於較長的文件,當它們嘗試捕獲過多信息時,嵌入或其他表示的質量可能會下降。分割可以產生更集中和準確的每個部分的表示。
- 提高檢索精度:在信息檢索系統中,分割可以提高搜索結果的粒度,從而更精確地將查詢與相關文件部分匹配。
- 優化計算資源:使用較小的文本塊可以更節省記憶體,並允許更好地並行處理任務。
現在,下一個問題是如何將文件分割成塊!有幾種策略,每種策略都有其自身的優點。
延伸閱讀
- 請參閱 Greg Kamradt 的 chunkviz 以可視化下面討論的不同分割策略。
方法
基於長度
最直觀的策略是根據文件的長度進行分割。這種簡單而有效的方法確保每個塊都不會超過指定的尺寸限制。基於長度分割的關鍵優點
- 簡單明瞭的實現
- 一致的塊大小
- 易於適應不同的模型要求
基於長度分割的類型
- 基於 Token:根據 token 的數量分割文本,這在使用語言模型時很有用。
- 基於字符:根據字符的數量分割文本,這在不同類型的文本中可能更一致。
使用 LangChain 的 CharacterTextSplitter
和基於 token 的分割的範例實現
from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
encoding_name="cl100k_base", chunk_size=100, chunk_overlap=0
)
texts = text_splitter.split_text(document)
API 參考文件:CharacterTextSplitter
基於文本結構
文本自然地組織成層次結構單元,例如段落、句子和單詞。我們可以利用這種固有的結構來指導我們的分割策略,創建保持自然語言流暢、在分割內保持語義連貫性並適應不同文本粒度級別的分割。LangChain 的 RecursiveCharacterTextSplitter
實現了這個概念
RecursiveCharacterTextSplitter
嘗試保持較大的單元(例如,段落)完整。- 如果一個單元超過塊大小,它會移動到下一個級別(例如,句子)。
- 如果需要,此過程將繼續下降到單詞級別。
這是範例用法
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)
texts = text_splitter.split_text(document)
API 參考文件:RecursiveCharacterTextSplitter
延伸閱讀
- 請參閱 遞迴文本分割 的操作指南。
基於文件結構
有些文件具有固有的結構,例如 HTML、Markdown 或 JSON 文件。在這些情況下,根據文件的結構分割文件是有益的,因為它通常自然地將語義相關的文本分組。基於結構分割的關鍵優點
- 保留文件的邏輯組織
- 在每個塊內保持上下文
- 對於檢索或摘要等下游任務可能更有效
基於結構分割的範例
- Markdown:基於標題分割(例如,#、##、###)
- HTML:使用標籤分割
- JSON:按物件或陣列元素分割
- 程式碼:按函數、類別或邏輯塊分割
延伸閱讀
- 請參閱 Markdown 分割 的操作指南。
- 請參閱 遞迴 JSON 分割 的操作指南。
- 請參閱 程式碼分割 的操作指南。
- 請參閱 HTML 分割 的操作指南。
基於語義含義
與以前的方法不同,基於語義的分割實際上考慮了文本的內容。雖然其他方法使用文件或文本結構作為語義含義的代理,但此方法直接分析文本的語義。有幾種實現此目的的方法,但從概念上講,該方法是在文本含義發生重大變化時分割文本。例如,我們可以使用滑動窗口方法生成嵌入,並比較嵌入以找到顯著差異
- 從前幾個句子開始並生成嵌入。
- 移動到下一組句子並生成另一個嵌入(例如,使用滑動窗口方法)。
- 比較嵌入以找到顯著差異,這表明語義部分之間可能存在「斷點」。
這種技術有助於創建語義上更連貫的塊,從而可能提高檢索或摘要等下游任務的質量。