文本分塊(Text Splitting),RAG不可缺失的重要環節
本文介紹了在增強檢索生成(RAG)流程中,文本分塊的重要性和實現方式。詳細解釋了為什么要對文本進行切分及代碼示例,展示了分塊后的效果。通過合理分塊,可以有效應對模型的輸入限制,提升檢索與生成的質量,是構建高效 LLM 應用的關鍵步驟之一。
1. 文檔分塊的原因
2. 文檔分塊的基本思路
2.1 基于長度的分塊類型
2.2 代碼實現
2.2 拆分結果
3. 圖形化顯示分塊
總結
在快速發展的自然語言處理(NLP)領域,增強檢索生成(RAG)已成為提高 AI 生成響應的準確性和相關性的強大技術。
在 RAG 的核心步驟中,有一個至關重要的步驟:“文本分塊(Text Splitting)”。
它的主要作用就是把一大段文本切分成更小、更合理的片段,這樣模型才能更好地理解、處理或者存儲這些內容。
比如說,如果你有一篇幾千字的文章,直接丟給模型處理,很可能會超過它的最大上下文長度(就是它一次能“看”的最多字數)。這個時候就得用 文本分塊(Text Splitting)來把文章拆成幾段,讓每一段都不超出模型的處理能力,而且盡量保證語義完整、段落自然,不要斷在奇怪的地方。
除了應對長度限制,還有個原因是為了更精準地做 embedding、搜索或者問答。
舉個例子,如果你用 RAG 來做知識庫問答,先要把整個文檔轉成 embedding(向量表示),然后做向量檢索找出相關內容。
如果一整篇文章不拆開,那 embedding 的顆粒度太粗,問答的時候很容易不準。所以切得好不好,直接影響最后答案的相關性和準確性。
1. 文檔分塊的原因
拆分文檔有幾個原因:
- 處理不均勻的文檔長度:現實世界的文檔集合通常包含不同大小的文本。拆分確保對所有文檔進行一致的處理。
- 克服模型限制:許多嵌入模型和語言模型都有最大輸入大小限制。拆分允許我們處理那些否則會超出這些限制的文檔。
- 提高表示質量:對于較長的文檔,嵌入或其他表示形式的質量可能會隨著過多信息而降低。拆分可以導致每個部分更加集中和準確的表示。
- 增強檢索精度:在信息檢索系統中,拆分可以提高搜索結果的粒度,從而允許查詢與相關文檔部分的更精確匹配。
- 優化計算資源:處理較小的文本塊可以更加節省內存,并允許更好的并行處理任務。
2. 文檔分塊的基本思路
最基本的分塊方法是根據文檔的長度進行拆分。這種簡單而有效的方法確保每個塊不會超過指定的大小限制。
基于長度拆分的主要好處:簡單明了的實現、一致的塊大小、易于適應不同模型的要求。缺點就是: 過于死板,忽視文本結構。
2.1 基于長度的分塊類型:
- 基于token的:根據token數量分割文本,這在使用語言模型時非常有用。
- 基于字符的:根據字符數量分割文本,這在不同類型的文本中可能更為一致。
2.2 代碼實現
以基于字符的拆分為例來了解分塊的基本思路:
需要了解的概念
- 塊大小(Chunk Size)- 每個數據塊包含的字符數,比如 50、100、100,000 等。
- 塊重疊(Chunk Overlap)- 相鄰數據塊之間重疊的字符數量。這樣做是為了避免將一個完整語境拆成幾部分,但會導致各塊之間出現重復數據。
使用LangChain創建 CharacterTextSplitter 實例,設置三個關鍵參數:
- chunk_size=15 :每個分割塊的最大字符數為15
- chunk_overlap=5 :相鄰塊之間重疊的字符數為5,這有助于保持上下文連貫性
- separator='' :使用空字符串作為分隔符,意味著將按照純字符數量進行分割,而不是按照特定分隔符(如句號、空格等)
from langchain.text_splitter import CharacterTextSplitter
text = "青云山連綿百里,峰巒起伏,最高有七峰,高聳入云,平日里只見白云環繞山腰,不識山頂真容。青云山山林密布,飛瀑奇巖,珍禽異獸,在所多有,景色幽險奇峻,天下聞名。"
text_splitter = CharacterTextSplitter(chunk_size=15, chunk_overlap=5, separator='')
docs = text_splitter.create_documents([text])
for doc in docs:
print('-' * 50)
print(doc)
2.2 拆分結果
根據設置的參數(chunk_size=15和chunk_overlap=5),文本被分成了8個片段,每個片段大約包含15個字符(包括標點符號),相鄰片段之間有5個字符的重疊,這確保了文本的連貫性。
例如:"起伏,最高"這部分內容在第一段末尾和第二段開頭都出現,這就是重疊的效果
分割后的每個片段都保持了基本的可讀性,雖然有些句子被切分開了。
最后一個片段"奇峻,天下聞名。"因為是文本末尾,所以長度較短,不足15個字符
--------------------------------------------------
page_cnotallow='青云山連綿百里,峰巒起伏,最高'
--------------------------------------------------
page_cnotallow='起伏,最高有七峰,高聳入云,平'
--------------------------------------------------
page_cnotallow='聳入云,平日里只見白云環繞山腰'
--------------------------------------------------
page_cnotallow='云環繞山腰,不識山頂真容。青云'
--------------------------------------------------
page_cnotallow='真容。青云山山林密布,飛瀑奇巖'
--------------------------------------------------
page_cnotallow=',飛瀑奇巖,珍禽異獸,在所多有'
--------------------------------------------------
page_cnotallow=',在所多有,景色幽險奇峻,天下'
--------------------------------------------------
page_cnotallow='奇峻,天下聞名。'
3. 圖形化顯示分塊
通過www.chunkviz.com可以以圖形化的方式看到分塊結果。
總結
文本分塊雖然看起來只是把文本切成小段,但它在大語言模型的應用中扮演著非常重要的角色。
它不僅解決了模型上下文長度的限制問題,還直接影響了后續任務的效果,比如 embedding 的精度、搜索的相關性、問答的準確性等等。
切分策略得當,不僅能提升模型的理解力,還能讓整個系統運行得更高效、更智能。所以在設計 LLM 應用時,文本分塊絕對不是一個可以忽略的細節,而是值得精心打磨的核心組件之一。
本文轉載自??AI取經路??,作者:AI取經路
