TextIn:一款優秀的文檔解析神器,提升RAG性能必備 原創 精華
前言
在私有領域知識問答和企業知識管理領域,結合檢索增強型生成模型(Retrieval-Augmented Generation, RAG)大模型(Large Language Model, LLM)已成為一種趨勢。然而,在RAG系統的文檔預處理階段和檢索階段,經常碰到三個主要問題。
- 企業內部常常積累了大量包含PDF格式的文檔,這些文檔的解析精度不足,嚴重制約了基于專業知識的問答系統的性能。因此,提高這些PDF文件的解析質量,對于構建高效的RAG系統至關重要。
- 構建起一個完備的智能文檔解析服務后,需要一個有效的評測工具來有評測文檔的解析質量,而不是主觀的通過肉眼感知。
- 用戶查詢通過text embedding向量模型快速、準確、有效從知識庫中檢索出相關知識片段,使得LLM回答準確。
本文將先探討下文檔解析的準確性對RAG系統的影響;然后介紹下智能文檔解析關鍵技術,并介紹閉源的通用文檔解析服務——TextIn,還介紹了一款開源的文檔解析質量評測工具-Markdown Tester,最后介紹下合合信息開發的向量表征模型-acge_text_embedding。
RAG一般流程
一、文檔解析的準確性對RAG系統的影響
在RAG的預處理階段,文檔解析的準確性是至關重要的。如果文檔解析不準確,這將直接影響到后續的檢索和生成階段,導致整個RAG系統的性能下降。以下是文檔解析不準確可能帶來的具體問題及其影響:
- 內容識別錯誤:如果文檔中的文本、圖像或格式被錯誤識別,將導致原始信息的丟失或錯誤。例如:(1)表格數據可能被錯誤地解析為普通文本,表格的行列關系混亂等:導致表格數值類問題無法進行精準的回答和RAG系統可能無法正確理解數據間的關聯性。(2)圖像中的文字(OCR)被錯誤識別:如果文檔中的文本或圖像被錯誤識別,系統接收到的數據質量會下降,這將影響系統生成的輸出質量。
- 布局信息丟失:PDF文件的布局信息,如頁面布局、段落、標題層級等,在解析過程中可能會丟失,這會影響對文檔結構的把握,進而影響分塊(chunks)。為了適應模型的輸入要求,文檔需要被分割成小塊。如果分塊策略不當,可能會導致語義信息的丟失,影響模型對文檔內容的理解。
- 編碼問題:PDF文件可能包含多種字符編碼、水印等,一些pdf解析工具不能正確處理這些編碼,可能會導致亂碼。亂碼的文本內容如果解析出來混合在文本中,會給知識庫帶來大量的噪聲,這也會影響RAG系統的性能。
- 文檔復雜性:(1)復雜的文檔結構,如多欄布局、閱讀順序恢復、混合文本和圖像等,可能會給解析帶來額外的挑戰,增加解析錯誤的風險。(2)文檔元素的復雜性:文檔中包含各種元素類型,如:段落、表格、公式和圖表。錯誤的解析這些元素內容,也會給RAG系統的知識庫帶來大量噪聲。
因此,對于C端文檔問答的RAG系統應用產品,迫切的需要對文檔進行精準解析。理想情況下,文檔解析器應具備以下關鍵特征:
- 文檔結構識別:能夠靈活地將頁面劃分為不同類型的內容塊,如標題、段落、表格、公式和圖表。這確保了劃分的文本塊是完整和獨立的語義單元。
- 文檔內元素準確解析:在文檔結構識別之后,識別出來的內容塊準確解析,如:OCR準確無誤的將標題、段落解析成文本內容;表格識別解析精確:尤其是數值類文檔問答敏感的場景;公式能夠準確的解析成Latex格式。
- 在復雜文檔布局中保持魯棒性:即使是在文檔頁面布局復雜的情況下也能保證解析效果,如多列頁面、無邊框表格甚至合并單元格的表格。
二、文檔解析的技術路線
對于簡單的文檔解析,langchain 和 llama_index 中集成了各種基于規則引擎的解析工具(如:解析pdf的pdfplumber,pyPDF2等)或者簡單的開源的ocr工具(如:paddleocr),能夠對多種文件類型進行解析。
解析工具常出現的問題
對于復雜的文檔解析,常基于深度學習的方法進行解析,在上篇文章中(《??【文檔智能 & RAG】RAG增強之路:增強PDF解析并結構化技術路線方案及思路??》)也講解了文檔解析的一些關鍵的開源技術路徑及方案。
文檔內容解析路徑
智能文檔(文本內容)技術路線
然而,對于通用文檔解析而言還存在著一些挑戰:
2.1 版式分析
版式分析
版面分析指的是對文檔進行區域劃分,通過bounding box定位其中的關鍵區域,如:文字、標題、表格、圖片等。
版式分析的優勢:
1.通過大量標注的數據,準確的劃分出文檔關鍵區域。如:
- 文本區域:頁眉、頁腳、標題、段落、頁碼、腳注、圖片標題、表格標題等
- 表格
- 公式
- 圖片
2.能對復雜的版式進行區塊識別
復雜版式
版式分析的缺點,目前基本都是通過目標檢測的形式進行版式分析,因此其挑戰也是伴隨著特定場景的標注數據,尤其是通用場景的版式分析,難度巨大。
2.2 表格識別與解析
表格識別與解析的難點一般如下:
- 表格的多樣性和復雜性:表格的形式多種多樣,包括有線表、無線表和少線表,這使得檢測和分割單元格變得復雜 。
- 表格單元格的合并與拆分:某些表格中的單元格可能跨行或跨列,甚至跨頁,需要準確識別這些合并的單元格并將其恢復成標準單元格 。
- 表格內容的識別和解析:表格中可能包含圖像、公式、符號等非文本內容,需要將它們轉換成文本或保留格式 。
- 表格結構的表示和輸出:不同的應用場景可能需要不同的表格結構表示方式,如 HTML、JSON、CSV 等,需要將識別結果轉換成適合目標應用的格式,并保留數據和樣式信息。
2.3 公式識別與解析
公式識別類型
數學公式識別與解析是一個技術挑戰性很高的領域,主要難點包括:
- 公式結構的復雜性:數學公式往往包含復雜的嵌套結構,這些結構的識別需要算法能夠準確理解公式的層次關系,例如多層的分數、根號等 。
- 形近字的識別難度:在手寫識別中,相似形狀的字符如大寫X和小寫x,大寫Z和數字2,希臘字母γ和字母r等容易混淆,增加了識別的難度 。
- 非常規符號的識別:比賽中添加的非常規符號組合可能會與公式混淆,增加了識別的復雜度。
2.4 閱讀順序
由于文檔布局的復雜性,包括多欄、嵌套表格、不規則的文本框等,這增加了閱讀順序恢復的難度。往期中也介紹了閱讀順序相關內容(《??【文檔智能】符合人類閱讀順序的文檔模型-LayoutReader及非官方權重開源??》)
多列布局閱讀順序恢復
小結:以上文檔解析的每個環節無論是數據標注、模型訓練、實驗,都需要投入巨大的成本和精細化的優化,在工業落地場景,在保證解析效果的同時,還需要關注文檔的解析速度。尤其是OCR過程,文字密集型文檔的解析速度影響特別大。
三、TextIn
針對以上痛點,筆者深度體驗了一下合合信息自研文檔解析技術-TextIn。該技術深度融合了文字識別(OCR)、計算機圖形圖像技術以及智能圖像處理引擎,使得紙質文檔或圖片中的文字信息能夠迅速、精準地轉化為計算機易于處理的文本格式。
TextIn文檔智能關鍵技術如下:
3.1 版面分析關鍵技術 Layout-engine
3.2 文檔樹提取關鍵技術 Catalog-engine
3.3 解析體驗
測試樣例:
TextIn解析輸出:
TextIn解析結果
可以看到,TextIn將pdf文件解析成markdown格式,并將標題、段落、行內公式及行間公式準確解析。
值得關注的是,標題,段落的準確解析、并按照閱讀順序進行輸出,這是生成文檔目錄及文檔樹的基礎。
快速上手代碼:
import requests
import json
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
class TextinOcr(object):
def __init__(self, app_id, app_secret):
self._app_id = app_id
self._app_secret = app_secret
self.host = 'https://api.textin.com'
def recognize_pdf2md(self, image, options):
"""
pdf to markdown
:param options: request params
:param image: file bytes
:return: response
options = {
'pdf_pwd': None,
'dpi': 72,
'page_start': 0,
'page_count': 24,
'apply_document_tree': 0,
'markdown_details': 0,
'table_flavor': 'md',
'get_image': 'none',
'parse_mode': 'auto',
}
"""
url = self.host + '/ai/service/v1/pdf_to_markdown'
headers = {
'x-ti-app-id': self._app_id,
'x-ti-secret-code': self._app_secret
}
return requests.post(url, data=image, headers=headers, params=options)
def write_file(markdown_result, filepath = 'test.md'):
f = open(filepath, 'w')
f.write(markdown_result)
f.close()
if __name__ == "__main__":
textin = TextinOcr('app-id', 'app-secret')
image = get_file_content('test.pdf')
resp = textin.recognize_pdf2md(image, {
'page_start': 0,
'page_count': 14,
'table_flavor': 'html',
'parse_mode': 'auto',
'apply_document_tree': 1,
'markdown_details': 1,
# 'get_image': 1,
})
print("request time: ", resp.elapsed.total_seconds())
json_data = json.loads(resp.text)
write_file(json_data['result']['markdown'], 'test2.md')
3.4 一個解析引擎速度的重要性
目前,基于多模態大模型技術的快速發展,文檔解析可以通過多模態大模型進行解決,如:gpt-4o等,但是,基于多模態大模型的解決方案,成本大、非常耗時、容易產生幻覺問題,尤其是表格的解析,數值上的幻覺問題是災難性的。
筆者在體驗TextIn時,感覺解析速度非常快,這對于RAG系統的增益可以從離線和在線兩個方面展開講:
- 離線模式
- 數據預處理: 在離線模式下,解析引擎可以預先處理和索引大量文檔,為在線查詢做好準備。
- 定期更新知識庫:可以定期更新模型和索引,以適應新的數據和需求變化。
2. 在線模式
- c端用戶通過網頁知識空間上傳新的文件時,在線模式允許解析引擎實時響應用戶查詢,提供即時的文檔解析服務。
- 用戶體驗: 用戶期望快速且準確的響應,因此解析引擎的速度和準確性在在線模式下尤為重要。
4、文檔解析評測工具-Markdown Tester
在文檔解析中,有了解析工具后,對于開發者,針對文檔解析的解析效果,需要一款比較好用的評價工具來客觀對解析效果進行評價;對于購買解析服務的c端客戶,同樣也需要評價文檔解析服務的效果,在自建數據集上先評測一下,然后有針對性的進行解析服務選購。因此,下面介紹一下 Markdown Tester:
該評測工具用于評價markdown文檔相似性,從段落、標題、表格和公式四個維度進行評價,相關評價指標的定義如下表:
段落、標題、表格和公式四個維度定義
對于RAG中文檔解析,必須強調為什么使用markdown進行表示:Markdown格式因其簡潔性和易于解析的特點,?被廣泛認為是LLM(?大型語言模型)?友好的文檔格式。?Markdown通過明確的標記語法,?幫助模型更好地理解文檔結構和內容,?從而提高信息提取的準確性和效率。?特別在存在大量公式、?表格的學術論文場景下,?Markdown可能是更合適的格式選擇。?這種格式選擇的原因主要包括:?
- 結構化信息的保留:?Markdown能夠很好地保留結構化信息(非常適合需要保留標題層級、?公式和表格等結構信息的場景),?這對于需要精確提取和分析文本內容的場景尤為重要。?
- 易于解析:?Markdown的簡潔性和明確的標記語法使得它易于被計算機程序解析和處理,?這對于自動化文檔處理和數據分析任務非常有利。?
- 支持場景多:?Markdown作為一種輕量級標記語言,?被廣泛用于編寫文檔、?筆記、?博客文章、?技術文檔等場景。
4.1 使用方法
- step1:
git clone https://github.com/intsig/markdown_tester.git
cd markdown_tester
./install.sh
- step2:
Markdown Tester的倉庫中給出了一些22份文檔的grounding truth用于評測各種解析工具效果。待測評樣本按照下述方式放置:
dataset/
├── pred/
│ ├── gpt-4o/
│ ├── vendor_A/
│ ├── vendor_B/
│ ├── ...
├── gt/
- step3:
python run_test.py --pred_path path_to_pred_md --gt_path path_to_gt_md
4.2 運行效果
對比表格
對比雷達圖-可視化
筆者在評測過程中發現,自研模型對于識別準確率較高,但召回率普遍不行。
五、text embedding在RAG環節的作用
由于LLM固有的問題,如:LLM的知識不是實時更新的;LLM無法回答私域知識問題。因為,LLM的專長在于生成和理解復雜的自然語言查詢。嵌入模型(比如Embedding)的專長在于將文本映射到高維空間中,以便進行相似性比較;生成可用于高效檢索的密集向量。
因此,目前主流的實現方式都是通過RAG的方式對上述問題進行解決。text embedding在RAG中充當重要的角色,主要有以下幾個作用:
- 捕捉語義信息:文本嵌入將文本轉換為數值向量,這些向量能夠捕捉到文本的語義信息。
- 增強上下文理解:在RAG系統中,文本嵌入幫助模型掌握輸入查詢的上下文,并在NLP任務的檢索階段提取相關信息。通過這種方式,模型能夠更好地理解和處理非結構化文本中的模糊性和可變性。
- 提高檢索性能:有效的文本嵌入能夠顯著提升RAG系統的性能。例如,不同的嵌入模型帶來的效果也不盡相同,選擇合適的嵌入模型可以優化模型的檢索性能。此外,結合知識圖譜和文本嵌入,可以實現結構化知識和非結構化文本的無縫融合,從而產生信息更豐富、上下文相關的響應。并且,文本嵌入增強了對自然語言中歧義和可變性的適應能力,使RAG模型能夠更好地應對模糊和多義的表達。這在處理開放域問答等復雜任務時尤為重要。
下面介紹一個效果比較好的文本向量嵌入的表征模型-acge_text_embedding
5.1 acge_text_embedding
acge_text_embedding是由合合信息研發的向量表征模型,技術架構上,acge_text_embedding采用了俄羅斯套娃表示學習(Matryoshka Representation Learning,MRL)編碼不同粒度的信息,并讓一個編碼能夠適應不同計算資源的下游任務。MRL的目的是學習許多個小于等于 的前 維表征,即總維度的前 維。在訓練時,MRL根據指定維度的向量來計算多個。
一種比較高效的做法是將每個投射頭看成是一個大投射頭的的一部分,即 ,這種做法在大輸出空間時尤其重要,稱之為Efficient Matryoshka Representation Learning (MRL–E)。
因此,該表示學習框架的核心思想是學習不同粒度的信息,允許一個嵌入向量在保持準確性和豐富性的同時,適應不同計算資源的需求,并可以無縫地適應大多數表示學習框架,并且可以擴展到多種標準計算機視覺和自然語言處理任務。
acge_text_embedding通過應用多模態表示學習(MRL)技術,能夠實現一次訓練過程,從而獲得豐富多樣的表征維度。特別值得一提的是,自適應粗粒度到細粒度表示(acge)模型,它采用了一種層次化的方法,從宏觀到微觀逐步深化表征的深度和精度。這種方法不僅在推理和部署階段無需額外成本,還提供了一種靈活且高效的表征方式。在具體的實踐應用中,為了更好地適應不同任務的需求,acge模型采用了策略學習的訓練方法。這種方法通過針對性地調整學習策略,顯著提升了模型在檢索、聚類和排序等任務上的性能表現。此外,模型還引入了持續學習的訓練機制,有效解決了神經網絡在學習過程中可能出現的災難性遺忘問題。這使得模型能夠在訓練迭代中達到更加優秀的收斂狀態,為持續優化和提升模型性能奠定了基礎。
5.2 acge_text_embedding使用
- 在sentence-transformer庫中的使用:
from sentence_transformers import SentenceTransformer
sentences = ["數據1", "數據2"]
model = SentenceTransformer('acge_text_embedding') # 替換成你下載的權重地址
print(model.max_seq_length)
embeddings_1 = model.encode(sentences, normalize_embeddings=True)
embeddings_2 = model.encode(sentences, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)
- 在sentence-transformer庫中的使用方法,選取不同的維度:
from sklearn.preprocessing import normalize
from sentence_transformers import SentenceTransformer
sentences = ["數據1", "數據2"]
model = SentenceTransformer('acge_text_embedding') # 替換成你下載的權重地址
embeddings = model.encode(sentences, normalize_embeddings=False)
matryoshka_dim = 1024
embeddings = embeddings[..., :matryoshka_dim] # Shrink the embedding dimensions
embeddings = normalize(embeddings, norm="l2", axis=1)
print(embeddings.shape)
# => (2, 1024)
5.3 acge_text_embedding優點總結
性能優勢:
- acge模型較小,占用資源少;
- 模型輸入文本長度為1024,滿足絕大部分場景的需求
- acge模型支持可變輸出維度,能夠根據具體場景去合理分配資源。
框架優勢:
- 對比學習技術,通過最小化正對之間的距離和最大化負對之間的距離來呈現文本語義表示。
- 數據挖掘,構造多場景、數量龐大的數據集提升模型泛化能力,挑選高質量數據集加快模型收斂。
- 多任務混合訓練,多loss適配場景,適應各種下游任務
- MRL訓練,訓練可變維度的嵌入,提高了處理速度,降低了存儲需求
- 持續學習, 改善引入新數據后模型災難性遺忘問題
總結
本文主要探討了檢索增強型生成模型(RAG)在私有領域知識問答和企業知識管理中的應用,重點分析了文檔解析的準確性對RAG系統性能的影響,介紹了智能文檔解析的關鍵技術,并介紹了合合信息自研的文檔解析服務TextIn,以及開源的文檔解析質量評測工具Markdown Tester。此外,還介紹了合合信息開發的文本向量嵌入模型acge_text_embedding,強調了其在RAG系統中的作用和優勢。整體而言,文檔解析的準確性、速度和質量對RAG系統的性能至關重要,而TextIn和acge_text_embedding等工具能夠顯著提升文檔解析的效果和效率。
參考文獻
- Markdown Tester:https://github.com/intsig/markdown_tester
- TextIn:https://www.textin.com/experience/pdf_to_markdown?from=acg-github
- acge_text_embedding:https://huggingface.co/aspire/acge_text_embedding
本文轉載自公眾號哎呀AIYA
