今天來講 text splitter(文字分割)跟Chunk(切塊)
在平常開發時,我們經常需要處理各種文本數據,例如文章、訊息或說明。有時,我們需要將文本分成更小的部分,以便更有效地處理或分析。
前面有提到,輸入+輸出的prompt 會有token上限
而我們如果要使用RAG技巧來做QA就需要把自己的資訊告訴語言模型
讓他用這些資訊來回答,比如說一個產品使用手冊
但如果每次都把整本破百頁的PDF當input
token數量可能高達幾十萬,別說放進去了
就算真的放了費用也很可觀
因此我們用把文字切塊的方式
文字分割有很多種方式
在處理文本數據時,文字分割是一個重要的任務,可以將長文本拆分成更小的部分,以便進行進一步的處理和分析。以下是一些常見的文字分割方式:
句子分割是將一段文本分成獨立句子的過程。通常使用標點符號(如句點、問號、感嘆號等)來識別句子的結尾。例如:
原始文本:「今天的天氣真好。明天我們要去野餐,太期待了!」
分割後的句子:
「今天的天氣真好。」
「明天我們要去野餐,太期待了!」
段落分割將文本分成不同的段落或部分,每個段落通常包含一個主題或一組相關的信息。段落通常由空行或縮排來識別。例如:
位於亞洲的這個國家有著豐富的自然景觀和文化遺產。它的首都坐落在一個美麗的山谷中,被綠色的山脈環繞。這個城市充滿了古老的寺廟和宮殿,每年吸引著成千上萬的遊客。
此外,這個國家還擁有壯觀的海岸線,數百公里的沙灘和碧藍的海洋。沿著海岸,您可以找到許多度假勝地,提供各種水上活動和美味的海鮮料理。
不僅如此,這個國家還以其多樣的飲食文化而聞名。您可以品嚐到各種美味的當地美食,從辛辣的咖哩到新鮮的水果。
總之,這個國家有著令人驚嘆的風景、豐富的文化和美味的食物,是一個令人難以忘懷的旅遊目的地。
在這個範例中,我們可以使用段落分割來將這段長文本分成不同的段落,每個段落專注於不同的主題或內容:
第一個段落描述國家的地理特點和首都。
第二個段落提到國家的海岸線和度假勝地。
第三個段落談論了國家的飲食文化和美食。
單詞分割將句子或文本分成單個單詞。這種分割通常以空格或其他空白字符來識別單詞的邊界。例如:
原始文本:"我喜歡學習人工智慧。"
分割後的單詞:["我", "喜歡", "學習", "人工智慧。"]
單詞分割是自然語言處理中的基本操作,用於詞法分析、詞頻統計、詞向量表示等任務。
字數分割是將一段文本按照一定的字數限制,將其拆分成較小的部分。
也是最簡單的方式,但可能較不精確,而且會有你想要的資訊只有一半的情況
假設10000字的文章,我們可以每100個字做一次分割
這樣就會有100個Chunk
Overlap"(重疊)是一個在文本處理中常見的概念,它指的是在將文本或序列分割成不同部分時,這些部分之間有一部分共享相同的內容。
比如說把1萬字文章切10等分
每一等分有1千字,但這1千字可能沒有我們需要的全部資訊
第一個段落1500字,第二個段落1500字
這樣會造成我們分割的第二等分有第一段落跟第二段落
在這種情況下,我們可能會選擇使用"重疊"。具體而言,我們將前兩個等分的字數擴展到1500字,而不是僅包含1千字。這樣,第一個等分的最後500字和第二個等分的前500字將有所重疊。
這樣做的好處是確保了連續性和上下文的完整性。如果我們僅使用1千字的固定切分,那麼第一個等分可能會遺漏一些關鍵信息,而第二個等分則可能會缺乏必要的背景。
通過重疊,我們確保相鄰等分之間有一些共享的內容,從而確保了連貫性。
缺點 : token使用量變多
要找到最佳的切塊大小,可以遵循以下步驟:
1.選擇一系列切塊大小:一旦數據預處理完畢,下一步是選擇要測試的潛在切塊大小範圍。如前所述,選擇應考慮內容的性質(例如,短篇或長篇文檔)、您將使用的嵌入模型以及其性能(例如,token限制)。目標是找到在保留上下文和保持準確性之間取得平衡的切塊大小。從探索各種切塊大小開始,包括較小的切塊(例如128或256個tokens)以捕捉更細粒度的語義信息,以及較大的切塊(例如512或1024個tokens)以保留更多上下文。
2.評估每個切塊大小的性能:為了測試各種切塊大小,我們可以使用多個索引或具有多個命名空間的單個索引。使用代表性數據集,創建要測試的切塊大小的嵌入並將其保存在索引中(或索引中)。然後,運行一系列查詢,您可以評估質量,並比較各種切塊大小的性能。這可能是一個反覆過程,我們可以對不同查詢測試不同的切塊大小,直到能夠確定最適合您的內容和預期查詢的性能最佳切塊大小。
有了切塊後,我們可以將它們存儲在向量資料庫中,並使用相似搜尋來查找需要的切塊。在使用大型語言模型進行問答等任務時,我們可以使用這些切塊作為提示的上下文,以幫助模型生成更準確的回答。
總而言之,文字分割和切塊技術對於有效處理大型文本數據並與大型語言模型互動非常重要。這些技術可以確保我們在充分利用語言模型的同時,保持文本的完整性和連續性。節省token使用,讓它有更好的回覆。