RAG 架構設計五種分塊技術剖析和選型 原創
RAG (檢索增強生成)是企業 AI 大模型應用落地的主要應用形態之一,特別是在智能問答、報告生成、內容審核、Text2SQL、流程自動化和 AI 編程等領域大規模應用和落地 RAG 架構。
從技術本質來分析,RAG 架構設計是由兩部分構成:數據工程和信息抽取。其中數據工程是最重要的部分,數據工程的最重要的工作之一是對文檔進行分塊(Chunking)。
因為要處理的文檔可能會相當大,所以第一步還包括“分塊”,就是把一個大文件分成更小的、更容易處理的部分。
這個步驟非常重要,因為它確保文本能夠適應嵌入模型的輸入大小。
而且,它還能提高信息抽取步驟的效率和準確性,這直接影響到生成回答的質量。
下文我們詳細剖析兩大問題:
第一、 RAG 架構落地中常用的5種分塊技術;
第二、企業 RAG 架構落地分塊技術如何選型。
RAG 架構設計的5種分塊技術剖析
企業 RAG 架構落地,常常使用5種分塊技術:固定大小分塊、語義分塊、遞歸分塊、基于文檔結構分塊、基于 LLM 分塊。
第一、固定大小分塊(Fixed-size chunking)
生成文本塊最直觀和簡單的方法就是根據預先設定的字符數、單詞數或 tokens,把文本切成大小一致的小段。
因為直接切分可能會打斷文本的語義流暢性,所以建議在兩個連續的文本塊之間保留一些重疊部分(就像上面圖中藍色區域那樣)。
這個方法很容易實現。而且,因為所有文本塊大小都一樣,所以批量處理起來也更簡單。
但是,這樣做有個大問題。它通常會把句子(或想法)從中間切斷。這樣一來,重要信息就可能會分散到不同的文本塊里。
第二、語義分塊(Semantic chunking)
語義分塊方法很簡單。
就是根據有意義的單元來切分文檔,比如:句子、段落或者主題部分。
然后,為每個部分創建嵌入向量(一種能表示文本意義的數字)。
假設我從第一個部分和它的嵌入向量開始。
- 如果第一個部分的嵌入向量和第二個部分的嵌入向量之間的余弦相似度很高,那么這兩個部分就組成一個文本塊。
- 這個過程會一直繼續,直到余弦相似度明顯下降。
- 一旦相似度下降了,我們就開始一個新的文本塊,并重復這個過程。
輸出的結果可能如下:
和固定大小的文本塊不同,這種方法保持了語言的自然流暢性,并保留了完整的思想。
因為每個文本塊包含的信息更豐富,它提高了檢索的準確性,這反過來又使得大語言模型(LLM)生成的回答更加連貫和相關。
一個小問題是,它依賴于一個閾值來確定余弦相似度是否顯著下降,這個閾值可能因文檔而異。
第三、遞歸分塊(Recursive chunking)
遞歸分塊方法也很容易理解。
首先,根據文檔中的自然分隔符來分塊,比如:段落或章節。
然后,如果某個塊的大小超過了我們預先設定的塊大小限制,就把它再分成更小的塊。如果塊的大小已經在限制范圍內,就不用再分了。
可能的輸出結果是這樣的:
如上所示:
- 我們首先定義了兩個塊(紫色的兩個段落)。
- 然后,第一段被進一步分成了更小的塊。
和固定大小的塊相比,這種方法同樣保留了語言的自然流暢性,并且保留了完整的語義。
不過,這種方法在實現和計算復雜度上會稍微復雜一些。
第四、基于文檔結構分塊(Document structure-based chunking)
基于文檔結構分塊是一種很直觀的方法。
它利用文檔本身的結構,比如:標題、章節或段落,來確定分塊的邊界。
這樣做的好處是,它能夠保持文檔結構的完整性,因為它和文檔的邏輯部分是對齊的。
輸出的結果可能看起來像這樣:
話雖如此,這種方法假設文檔有一個清晰的結構,但有時候可能并非如此。
而且,分出來的塊長度可能會不一樣,有可能超出大模型處理的字數限制。實際落地是會把它和遞歸分塊結合起來使用。
第五、基于 LLM 分塊(LLM-based chunking)
既然每種分塊方法都有優點和缺點,那為什么不讓大語言模型(LLM)來創建文本塊呢?
大語言模型可以被引導生成語義上獨立且有意義的文本塊。
很明顯,這種方法將確保高語義準確性,因為大語言模型具備世界知識,能理解上下文和含義,這超出了上面四種方法中使用的簡單啟發式方法。
唯一的問題是,這是這里討論的五種技術中計算量最大的文本塊劃分技術。
另外,由于大語言模型通常有一個有限的上下文窗口,這也是需要考慮的一點。
總之,每種技術都有它自己的優勢和權衡,5種分塊技術總結對比如下:
我們實際落地發現,語義分塊在很多情況下都效果很好,你在 RAG 應用落地的時候可以首選,但是最好針對你的業務場景進行測試下。
RAG 架構落地過程中最終選擇哪種分塊技術,將很大程度上取決于你的內容性質、嵌入模型的能力、計算資源等等。
本文轉載自??玄姐聊AGI?? 作者:玄姐
