引言
RagflowPlus
v0.3.0 版本中,增加了對excel文件的解析支持,但收到反饋,說效果并不佳。
以下測試文件內容來自群友反饋提供,數據已脫敏處理。
經系統解析后,分塊效果如下:
可以看到,由于該文件包含很多列信息,導致表格被截斷,同一行信息完全錯位,分散到了不同的chunk中。
表格解析新思路
其實問題就出在對表格文件的處理上,直接套用MinerU
的文件處理管線,會先通過LibreOffice
將文件轉成pdf的形式,再進行表格區域識別。
其實,excel本身就是格式化的表格,這樣的處理方式,就像是拿尼康八百定去拍人物寫真,上重裝備,還拍不好。
既然excel已經是格式化的文件,只需要用pandas
去逐行讀取就行了。
考慮一般表格都會有表頭,每一行內容需要和表頭關聯,因此,每個chunk根據表頭+當前行的形式劃分即可,示例代碼如下:
import pandas as pddef parse_excel(file_path):# 讀取Excel文件df = pd.read_excel(file_path)# 獲取表頭headers = df.columns.tolist()blocks = []for _, row in df.iterrows():# 構建HTML表格html_table = "<html><body><table><tr>{}</tr><tr>{}</tr></table></body></html>".format("".join(f"<td>{col}</td>" for col in headers), "".join(f"<td>{row[col]}</td>" for col in headers))block = {"type": "table", "img_path": "", "table_caption": [], "table_footnote": [], "table_body": f"{html_table}", "page_idx": 0}blocks.append(block)return blocksif __name__ == "__main__":file_path = "test_excel.xls"parse_excel_result = parse_excel(file_path)print(parse_excel_result)
將這個解析邏輯融合進解析模塊,再次解析,效果如下:
關鍵詞編輯技巧
雖然已經把表格格式處理好了,但進行檢索測試,發現效果不好,關鍵詞相似度為0。
上篇文章,已經詳細分析過關鍵詞相似度的計算方式。由于表格實際上是html格式的數據,這會間接導致原始關鍵詞的提取存在問題。
實際上,ragflow原本就提供了一種為chunk塊編輯關鍵詞的方式。
雙擊chunk,可以對關鍵詞進行自定義設置。
比如,我設定該chunk的關鍵詞為某學員姓名,再次檢索此關鍵詞,關鍵詞相似度就變成了100。
用對話模型進行測試,模型能正確檢索回答。
公式解析適配
之前有群友問過:為什么解析文件時,會過濾公式的chunk。
我當時給出的回答是這樣:公式都是由數學符號組成,本身和問題不會具備相似性。比如,正常問題通常會問xx公式,但不會把公式原本的形式當成問題去問。這就會導致將公式變成解析塊會毫無意義,因為壓根不會被檢索出來。
但是利用關鍵詞編輯,就可以讓公式chunk具備實際意義,因此將公式chunk添加進解析結果。
以下是一個包含公式的文件解析結果:
以2-3公式(假設作為一個公式的具體名字)為測試文本進行檢索,是得不到任何結果的。
利用關鍵詞編輯,為其添加關鍵詞:
再次檢索,就可以順利檢索出來。
用問答模塊測試,也可以正常顯示。
總結
本文對表格和公式兩類元素進行調優測試,不難發現,對于rag系統來說,檢索是至關重要的環節。
想要效果好,就需要對每一個塊進行精調。
因此,在進行對話測試前,檢索測試是必要環節:如果檢索不出來,那就要排查chunk塊的類型和關鍵詞設定;如果能檢索到,模型回答不出來,那就是模型本身的性能問題。