HtmlRAG:RAG系統(tǒng)中,HTML比純文本效果更好 原創(chuàng)
??HtmlRAG?
? 方法通過使用 HTML 而不是純文本來增強(qiáng) RAG 系統(tǒng)中的知識表示能力。通過 HTML 清洗和兩步塊樹修剪方法,在保持關(guān)鍵信息的同時縮短了 HTML 文檔的長度。這種方法優(yōu)于現(xiàn)有基于純文本的RAG的性能。
方法
其實主要看下圍繞html提純思路,將提純后的Html內(nèi)容送入LLM進(jìn)行增強(qiáng)問答。
1. HTML 清洗
由于原始 HTML 文檔過長(每個超過 80K),并且不需要考慮用戶查詢的語義特征,因此在這個步驟中使用基于規(guī)則的方法進(jìn)行預(yù)處理。這個清洗過程移除無關(guān)內(nèi)容并壓縮冗余結(jié)構(gòu),保留原始 HTML 中的所有語義信息。清洗后的 HTML 適合于配備長上下文 LLM 的 RAG 系統(tǒng),并且不希望在生成前丟失任何信息。清洗后的 HTML 還是后續(xù) HTML 修剪的基礎(chǔ)。
1.1 HTML 內(nèi)容清洗
從網(wǎng)絡(luò)上檢索到的 HTML 文檔包含大量對人類用戶不可見的額外內(nèi)容,如 HTML 標(biāo)簽、CSS 和 JavaScript。大多數(shù) HTML 標(biāo)簽提供豐富的結(jié)構(gòu)信息,幫助 LLM 理解 HTML,而 CSS 和 JavaScript 內(nèi)容提供的幫助有限。具體的清洗步驟幾乎是無損的:
- 移除 CSS 樣式、注釋和 JavaScript。
- 清理冗長的 HTML 標(biāo)簽屬性。
1.2 無損結(jié)構(gòu)壓縮
在大多數(shù) HTML 文檔中,原始 HTML 結(jié)構(gòu)包含冗余。對 HTML 結(jié)構(gòu)進(jìn)行以下壓縮而不丟失語義信息:
- 合并多層單嵌套標(biāo)簽。例如,將?
?<div<div><p>some text</p></div></div>?
?? 簡化為??<p>some text</p>?
?。 - 移除空標(biāo)簽,如?
?<p></p>?
?。
2. 塊樹構(gòu)建
為了整體修剪所有檢索到的 HTML 文檔,我們首先將所有檢索到的 HTML 文檔連接在一起,并使用 Beautiful Soup 解析為單個 DOM 樹。使用 DOM 樹修剪 HTML 是最自然的方式,但 DOM 樹過于細(xì)粒度,導(dǎo)致大量的節(jié)點(diǎn)和深樹結(jié)構(gòu)帶來巨大的計算成本。
考慮到上述問題,我們提出了一種優(yōu)化的樹結(jié)構(gòu)來建模 HTML,這種結(jié)構(gòu)不是那么細(xì)粒度。理想情況下,樹結(jié)構(gòu)的粒度可以根據(jù)不同的修剪需求進(jìn)行調(diào)整。我們稱之為“塊樹”,并設(shè)置每個塊的最大單詞數(shù) 來控制塊樹的粒度。在構(gòu)建塊樹時,我們從 DOM 樹開始,合并碎片化的子節(jié)點(diǎn)到它們的父節(jié)點(diǎn),并將其視為一個塊。我們可以遞歸地合并塊或子節(jié)點(diǎn)到它們的父節(jié)點(diǎn),以形成更大的塊,條件是塊的單詞數(shù)不超過 。合并后,無法合并的原始葉節(jié)點(diǎn)也被視為塊。
3. 基于塊樹的 HTML 修剪
塊樹基礎(chǔ)的 HTML 修剪包括兩個步驟,這兩個步驟都在塊樹結(jié)構(gòu)上進(jìn)行。第一個修剪步驟使用嵌入模型來修剪 HTML 清洗模塊輸出的結(jié)果,而第二個步驟使用生成模型來修剪第一個修剪步驟輸出的結(jié)果。
3.1 基于文本嵌入的塊修剪
該步驟的目標(biāo)是在保持關(guān)鍵信息的同時,縮短檢索結(jié)果的 HTML 文檔長度。通過刪除與用戶查詢相關(guān)性較低的塊,可以減少輸入到LLM中的冗余信息,從而提高生成效率和質(zhì)量。
步驟
- 從每個塊中提取純文本內(nèi)容。使用文本嵌入模型計算這些文本內(nèi)容與用戶查詢的相似性得分。通常,嵌入模型會將文本轉(zhuǎn)換為向量表示,并計算這些向量之間的相似性。
- 貪心算法修剪:使用貪心算法來選擇要刪除的塊。算法會從相似性得分最低的塊開始刪除,直到 HTML 文檔的總長度滿足設(shè)定的上下文窗口要求。刪除塊時,可能會重新出現(xiàn)冗余的 HTML 結(jié)構(gòu)(如多層嵌套標(biāo)簽或空標(biāo)簽),因此需要重新調(diào)整 HTML 結(jié)構(gòu),以確保其簡潔性和正確性。
- 重新調(diào)整 HTML 結(jié)構(gòu):在刪除塊后,檢查并合并多層單嵌套標(biāo)簽(例如,將?
?<div<div><p>...</p></div></div>?
?? 簡化為??<p>...</p>?
??)。移除空標(biāo)簽(如??<p></p>?
?),以進(jìn)一步簡化 HTML 結(jié)構(gòu)。
3.2 生成模型的細(xì)粒度塊修剪
生成模型的細(xì)粒度塊修剪提示詞
如下圖,為了進(jìn)一步細(xì)粒度地修剪塊,擴(kuò)展了修剪后塊樹的葉節(jié)點(diǎn),構(gòu)建了一個更細(xì)粒度的塊樹。由于生成模型具有較長的上下文窗口,可以全局建模塊樹。生成模型計算每個塊的得分,得分由唯一序列的生成概率給出,序列由從根標(biāo)簽到塊標(biāo)簽和文本的HTML標(biāo)簽路徑表示。最后,根據(jù)塊得分,應(yīng)用類似的貪心算法獲得最終的修剪HTML。
塊得分計算。使用分詞器將塊樹轉(zhuǎn)換為標(biāo)記樹,相應(yīng)的HTML標(biāo)簽和標(biāo)記用相同的顏色標(biāo)記。標(biāo)記生成概率位于右上角,虛線框中的標(biāo)記不需要推理。塊樹的右上角顯示塊概率,可以從相應(yīng)的標(biāo)記概率推導(dǎo)出來。
實驗效果
- HtmlRAG的消融研究及塊樹粒度影響的實驗結(jié)果
本文轉(zhuǎn)載自公眾號大模型自然語言處理 作者:余俊暉
原文鏈接:??https://mp.weixin.qq.com/s/rNGc-Ffvj776Sp-vf9ME8w??
