大模型知識問答: 文本分塊要點總結

節前,我們組織了一場算法崗技術&面試討論會,邀請了一些互聯網大廠朋友、今年參加社招和校招面試的同學。

針對大模型技術趨勢、算法項目落地經驗分享、新手如何入門算法崗、該如何準備面試攻略、面試常考點等熱門話題進行了深入的討論。

總結鏈接如下:

《大模型面試寶典》(2024版) 發布!


本文介紹LLM知識問答中文本分塊的相關內容。

圖片

一、字符切分

Langchain的CharacterTextSplitter,直接按給定的chunk_size(塊內最大字符數量)去生硬切分文本塊,不考慮文本結構,為了保證文本塊之間的上下文聯系,基于chunk_overlap(塊重疊字符數量)去控制文本塊之間的重疊字數,注意,在英文里是按字母數考慮字符數量。當然,也能設置分隔符separator去分割。

圖片

圖:字符切分

二、句子切分

Llama_index的SentenceSplitter,針對句子層面切分文本塊,并且還提供父子節點關系。

三、遞歸字符切分

Langchain的RecursiveCharacterTextSplitter,默認分割符:[“\n\n”, “\n”, " ", “”](分別代表段落分隔符、換行符、空格、字符),拆分器首先查找兩個換行符(段落分隔符)。一旦段落被分割,它就會查看塊的大小,如果塊太大,那么它會被下一個分隔符分割。如果塊仍然太大,那么它將移動到下一個塊上,以此類推。因為某些書寫系統沒有單詞邊界,例如中文、日語和泰語等,所以可以增加以下分隔符:[‘\n\n’, ‘\n’, ’ ', ‘.’, ‘,’, ‘\u200b’, ‘,’, ‘、’, ‘.’, ‘。’, ‘’]。

圖片

圖:遞歸字符切分

四、按文件風格切分

除了簡單的平文本文檔,對于其他不同格式的文件(比如HTML, Markdown, PDF等),采用不同的方式切分。比如:

- Markdown: 可以按照#來判斷標題級別進行切分,也可以標題塊下疊加字符切塊;

- Python等代碼文件: 可以按照class、def等切分出不同塊;

- PDF: 用Unstructured庫解析PDF文件,除文本外,表格也能很好抽取出來,由于表格向量化不具備較好的語義信息,一般開發者會將抽取出的表格先做總結,將表格總結向量化加入檢索池中,若檢索到該表格,則將原始表格喂入LLM內。

- 圖片: 有好多做法,比如如果圖片具有文本信息,可以直接OCR識別后的文字作為該圖片的文本塊。如果該圖片不具備文本信息,可以用多模態大模型對圖片生成圖片描述或總結,當然也能用圖片embedding,如CLIP。這里不太屬于文本分塊的討論范疇,后面會再做分享;

- HTML: 按元素級別拆分文本,并給每個文本塊添加元素級別的元數據,能將具有相同元數據的元素組合再一起。

五、語義切分

1、基于Embedding

Langchain的SemanticChunker,由Greg Kamradt提出[1],有2種方式:

(1)具有位置獎勵的層次聚類: Greg想看句子嵌入的層次聚類會如何。但由于發現他選擇按句子進行拆分時,有時會在長句子之后出現短小句子。這些尾隨的短小句子可能可以改變一個塊的含義,所以他添加了一個位置獎勵,如果它們是彼此相鄰的句子,則更有可能形成聚類。最終結果還不錯,但調整參數很慢且不理想;

(2)在連續句子之間找到語義斷點: 這是一種遍歷方法。先從第一個句子開始,得到向量,然后將其與句子2進行比較,然后比較2和3等等。如果出現向量距離大的斷點,如果它高于閾值,那么認為它是一個新語義部分的開始。最初Greg嘗試對每個句子進行向量化,但結果發現噪音太大。所以最終選取了3個句子的組(一個窗口),然后得到一個嵌入,然后刪除第一個句子,并添加下一個句子。這樣效果會好一點。

作者推崇的第二種辦法,我總結其主要步驟如下:

1)按分隔符切分出句子sentence;

2)對每個句子,把其前后的句子一起合并成一個窗口的句子組合(即上下文關聯,單個句子擴充至3個句子combined_sentence);

3)將combined_sentence向量化,得到combined_sentence_embedding;

4)計算位置i和位置i+1之間的combined_sentence_embedding的余弦距離distance_to_next,

5)根據余弦距離的分布設置分割閾值,獲取斷點;

6)基于斷點合并句子進文本塊中。

圖片

圖:基于embedding的語義切分

但實際使用還是小心,因為閾值設置不當,容易發送塊內字數過多的問題,對后續LLM檢索和回答很不利,建議可以根據文檔字數,計算number_of_chunks,然后用此參數去調整語義斷點的閾值。

2、基于模型

可以用下一句預測(Next Sentence Prediction, NSP)二分類任務的BERT模型,輸入前后兩個句子,預測句子彼此之間相鄰的可能性,若分數低于閾值,說明語義不太相關,可以分割。我們也知道BERT的預訓練目標就是MLM(掩碼語言建模)和NSP(下一句預測),其中NSP是用[CLS]做二分類預測,所以我們可以直接調用Google的BERT模型 [4]完成基于模型的語義切分方案。

關于利用BERT做文本分割(Text Segmentation)還有很多其他研究,比如:

(1)2020年Google Research提出的《Text segmentation by cross segment attention》:用BERT獲取句子表征,然后再輸入BiLSTM或Transformer預測每個句子是否為分割邊界;

圖片

圖:《Text segmentation by cross segment attention》

(2)2021年阿里語音實驗室在提出的SeqModel模型《Sequence Model with Self-Adaptive Sliding Window for Efficient Spoken Document Segmentation》: 如下圖所示,先分句,然后對句子分詞,獲取token、segment、position embedding后做element-wise求和,再加上發音embedding后喂入BERT編碼器,對輸出做平均池化,接入softmax輸出分類判斷每個句子是否為段落邊界。為什么加入發音embedding?因為該模型提出的出發點是解決對長會議ASR生成的文本缺乏段落結構的問題。像ASR會出現寫轉寫錯誤,比如發音相似但含義不同的聲學混淆詞等。所以把字的發音信息(通過中文發音表查)來增強文本分割模型輸入的表征向量(即phone embedding)。

同時,提出了自適應滑窗提升推理速度,就是基于模型預測的段落分割點,去滑動窗口,如下圖所示。

圖片

圖:《Sequence Model with Self-Adaptive Sliding Window for Efficient Spoken Document Segmentation》

以上阿里的SeqModel開源了,我用過SeqModel,說實話一些細節上的體驗不是很好,比如帶小數點的數字會被誤切分。

六、Agent 式切分

我用可以嘗試使用LLM做語義切分,其中被討論最多是騰訊AI Lab在2023年提出的Propositionizer [2],它好處在于能解決文本中指代消解的問題,比如"it", “he”, “she”, “they”, “this”, "that”指代的實體全稱是什么,而且分解成比句子還更細粒度且信息稠密的命題(Proposition),加入文本分塊。效果如下圖所示:

圖片

圖:在Wikipedia文本上,三種不同細粒度的檢索單元(其中,a)段落塊不超過100個字,句子by句子的添加進段落塊,確保句子不被強行字符分割,最后一個塊少于50字,會和歷史句子合并,避免過于小的段落塊。b)句子塊用Python的SpacCy en_core_web_lg模型做分句,c)命題塊則使用Propositionizer模型)

作者實現Propositionizer的步驟如下:

1)從英文Wikipedia拉取2021-10-13至今的數據;

2)對GPT-4做指令微調(Proposition定義和1-shot展示),將段落塊作為輸入,要求LLM輸出一系列命題;

3)將獲取并過濾后的4.3萬對”段落-to-命題“,作為種子集微調Flan-T5-large模型。

可惜的是,開源的Propositionizer受限于訓練語料,僅支持英文。

七、其他文本塊優化點

在實踐中,我們常發現一些問題,比如:

(1)上下文的關聯信息跨度大或信息稀疏,導致文本塊內信息密度低。 舉例:聊天記錄,或某文章分點記錄各內容時,用戶向該文章提問有哪些分點內容或層次結構。

(2)標題信息過短,導致文本塊向量化后,標題語義信息被文本塊內其他內容給模糊了。 具體:某文本塊內包含標題5個字,標題下內容有300字。

(3)用戶提問內容涉及跨多個文件做檢索和整合回答時,大多數文本分塊方法不具備跨文件關聯。

為了解決以上問題,也有對應一些優化手段。

1、摘要增強

用較大chunk_size去字符切分文本,然后對大文本塊用LLM做總結,作為摘要塊加入向量數據庫中。能在一定程度解決前面提到的問題1。

2、標題增強

將標題下的相應文本塊,都加入標題前綴,并且重復多幾次標題。如:block = concat(’#’.join([title]*3), content_under_title)。能解決前面提到的問題2。

3、假設性問題生成

基于給定的文本塊,生成假設性問題,將生成的問題和對應文本塊加入檢索內容中。Langchain有個Hypothetical Queries方法[3]可調用。能解決前面提到問題1中的聊天記錄場景下的信息稀疏問題。其實說直白了,不就是QA對的生成嗎?往往好的QA對比文本塊更容易被檢索到。想要往這方面深入擴展,可以參考Ragas的TestsetGenerator(一套用LLM生成QA的Prompts工程)。

4、父文檔檢索器

其實父文檔檢索器簡單理解是利用不同chunk_size去分塊,先將原始文檔拆分成較大塊,再對較大塊拆分成較小塊,然后對較小塊進行索引向量檢索,最后返回的是相似度高的較小塊下的父文本較大塊。這樣的好處是:較小塊語義含義更精準,其父文本塊又能保留到足夠長的上下文信息。能解決前面提到的問題1。Langchain有ParentDocumentRetriever,llama_index有HierarchicalNodeParser。

5、知識圖譜

如果你的數據具有豐富的實體和實體間的關系,建議轉換成知識圖譜。如果不想手動整理圖譜,可以用Langchain的LLMGraphTransformer,利用LLM解析和分類文本中的實體和實體間的關系。能解決前面提到的問題3。

參考資料

[1] 5_Levels_Of_Text_Splitting - Greg Kamradt, 代碼:https://github.com/FullStackRetrieval-com/RetrievalTutorials/blob/main/tutorials/LevelsOfTextSplitting/5_Levels_Of_Text_Splitting.ipynb

[2] Dense X Retrieval: What Retrieval Granularity Should We Use? 論文: [2312.06648] Dense X Retrieval: What Retrieval Granularity Should We Use? (arxiv.org),代碼:https://github.com/chentong0/factoid-wiki

[3] Hypothetical Queries, 文檔:MultiVector Retriever | 🦜?🔗 LangChain

[4] Bert - Google, 代碼:google-bert/bert-base-uncased ·擁抱臉 (huggingface.co)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42004.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42004.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42004.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ 信號量和鎖的區別

網上關于信號量和鎖的區別&#xff0c;寫的比較官方晦澀難懂&#xff0c;對于這個知識點吸收難&#xff0c;通過示例&#xff0c;我們看到信號量&#xff0c;可以控制同一時刻的線程數量&#xff0c;就算同時開啟很多線程&#xff0c;依然可以的達到線程數可控 #include <i…

初識c++(命名空間,缺省參數,函數重載)

一、命名空間 1、namespace的意義 在C/C中&#xff0c;變量、函數和后面要學到的類都是大量存在的&#xff0c;這些變量、函數和類的名稱將都存在于全 局作用域中&#xff0c;可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化&#xff0c;以避免命名 沖突…

GEE代碼實例教程詳解:MODIS土地覆蓋分類與面積計算

簡介 在本篇博客中&#xff0c;我們將使用Google Earth Engine (GEE) 對MODIS土地覆蓋數據進行分析。通過MODIS/061/MCD12Q1數據集&#xff0c;我們可以識別不同的土地覆蓋類型&#xff0c;并計算每種類型的總面積。 背景知識 MODIS MCD12Q1數據集 MODIS/061/MCD12Q1是NASA…

每天一個數據分析題(四百十五)- 線性回歸模型

線性回歸模型中誤差項的數學期望為 A. 0 B. 1 C. 2 D. 3 數據分析認證考試介紹&#xff1a;點擊進入 題目來源于CDA模擬題庫 點擊此處獲取答案 數據分析專項練習題庫 內容涵蓋Python&#xff0c;SQL&#xff0c;統計學&#xff0c;數據分析理論&#xff0c;深度學習&am…

世界商用飛機機型大全-使用Java抓取FlightAware后的答案

目錄 前言 一、數據說明 1、實時航班飛機機型數據 2、網頁結構分析 二、使用Java進行信息抓取 1、定義頁面PageVO對象 2、爬取屬性定義 3、啟動信息抓取組件 三、成果分析 1、商業飛行的飛機機型的種類 2、飛機種類排名前十名 3、航班數排名后十名 4、看中國國產大飛…

【網絡安全】一文帶你了解什么是【網絡劫持】

網絡劫持&#xff08;Network Hijacking&#xff09;是一種網絡攻擊&#xff0c;攻擊者通過非法手段劫持網絡通信&#xff0c;導致合法用戶的數據流被攔截、篡改或重定向到攻擊者控制的系統。這種攻擊可以在各種網絡層面上進行&#xff0c;包括域名系統&#xff08;DNS&#xf…

你真的會信息收集嘛,4k字滲透測試信息收集10大技巧

前言 在滲透測試中&#xff0c;信息收集是非常關鍵的一步&#xff0c;它為后續的漏洞發現和利用提供了重要的基礎。以下是非常詳細的信息收集方式&#xff1a; 一、被動信息收集 被動信息收集是指在不與目標系統直接交互的情況下&#xff0c;通過公開渠道獲取目標系統的相關…

基于51單片機的四路搶答器Protues仿真設計

一、設計背景 近年來隨著科技的飛速發展&#xff0c;單片機的應用正在不斷的走向深入。本文闡述了基于51單片機的八路搶答器設計。本設計中&#xff0c;51單片機充當了核心控制器的角色&#xff0c;通過IO口與各個功能模塊相連接。按鍵模塊負責檢測參與者的搶答動作&#xff0c…

線程交互現象

線程交互現象 小明對自家的狗子有個規定,就是在狗狗還沒吃完的時候,可以繼續給他加飯 不好的解決方式 狗狗感覺一千年沒吃飯了,狼吞虎咽起來,最后飯只剩下最后一點點,吃飯線程中使用while循環判斷是否是1,如果是1那么就一直循環,知道加飯又重新回到了起點,這雖然是狗狗…

GEE代碼實例教程詳解:湖泊面積分析

GEE代碼實例教程詳解&#xff1a;湖泊面積分析 完整代碼 // 定義研究區域的坐標點 var coordinates [[42.000552219688586, 38.18969302118053],[43.868228000938586, 38.18969302118053],[43.868228000938586, 39.209978258633186],[42.000552219688586, 39.20997825863318…

C++ --> 類和對象(一)

歡迎來到我的Blog&#xff0c;點擊關注哦&#x1f495; 前言 前面講到了C的入門需要學習的知識&#xff0c;是為了后面更好的學習。學習是不斷深入的&#xff0c;內容是不斷復雜的。篤定信心。 一、面向對象編程(OOP)和面向過程編程(POP)的認識 面向過程編程&#xff08;Proc…

力扣-貪心算法4

406.根據身高重建隊列 406. 根據身高重建隊列 題目 假設有打亂順序的一群人站成一個隊列&#xff0c;數組 people 表示隊列中一些人的屬性&#xff08;不一定按順序&#xff09;。每個 people[i] [hi, ki] 表示第 i 個人的身高為 hi &#xff0c;前面 正好 有 ki 個身高大于或…

MyBatis的簡介與使用

Mybatis JDBC操作數據庫的缺點 存在大量的冗余代碼。手工創建 Connection、Statement 等&#xff0c;效率低下。手工將結果集封裝成實體對象。查詢效率低&#xff0c;沒有對數據訪問進行優化。 Mybatis框架 簡介 MyBatis 本是 apache 的一個開源項目 iBatis, 2010年這個項目由…

imx6ull/linux應用編程學習(14) MQTT基礎知識

什么是mqtt&#xff1f; 與HTTP 協議一樣&#xff0c; MQTT 協議也是應用層協議&#xff0c;工作在 TCP/IP 四層模型中的最上層&#xff08;應用層&#xff09;&#xff0c;構建于 TCP/IP協議上。 MQTT 最大優點在于&#xff0c;可以以極少的代碼和有限的帶寬&#xff0c;為連接…

網絡資源模板--Android Studio 外賣點餐App

目錄 一、項目演示 二、項目測試環境 三、項目詳情 四、完整的項目源碼 原創外賣點餐&#xff1a;基于Android studio 實現外賣(點)訂餐系統 非原創奶茶點餐&#xff1a;網絡資源模板--基于 Android Studio 實現的奶茶點餐App報告 一、項目演示 網絡資源模板--基于Android …

在AvaotaA1全志T527開發板上使用AvaotaOS 部署 Docker 服務

Docker 是一個開源的應用容器引擎&#xff0c;讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中&#xff0c;然后發布到任何流行的 Linux或Windows操作系統的機器上&#xff0c;也可以實現虛擬化。容器是完全使用沙箱機制&#xff0c;相互之間不會有任何接口。 準備…

dolphinscheduler-springboot集成

springboot集成dolphinscheduler 說明 為了避免對DolphinScheduler產生過度依賴&#xff0c;實踐中通常不會全面采用其內置的所有任務節點類型。相反&#xff0c;會選擇性地利用DolphinScheduler的HTTP任務節點功能&#xff0c;以此作為工作流執行管理的橋梁&#xff0c;對接…

信息技術課上的紀律秘訣:營造有序學習環境

信息技術課是學生們探索數字世界的樂園&#xff0c;但同時也是課堂紀律管理的挑戰場。電腦、網絡、游戲等元素可能分散學生的注意力&#xff0c;影響學習效果。本文將分享一些有效的策略&#xff0c;幫助教師在信息技術課上維持課堂紀律&#xff0c;確保教學活動順利進行。 制…

幾何建模基礎-樣條曲線和樣條曲面介紹

1.概念介紹 1.1 樣條曲線的來源 樣條的英語單詞spline來源于可變形的樣條工具&#xff0c;那是一種在造船和工程制圖時用來畫出光滑形狀的工具&#xff1a;富有彈性的均勻細木條/金屬條/有機玻璃條&#xff0c;它圍繞著按指定位置放置的重物或者壓鐵做彈性彎曲&#xff0c;以…

JS實現一個簡單的模糊匹配

1、示例數據如下&#xff1a; // 示例數據 const data [ { name: ‘Alice’, age: 25 }, { name: ‘Bob’, age: 30 }, { name: ‘Charlie’, age: 35 }, { name: ‘David’, age: 40 }, { name: ‘Eve’, age: 45 } ]; 2、模糊匹配函數 // 模糊匹配函數 function fuzzyMatch(…