從結構化表格中提取相關數據需要的不僅僅是標準的 RAG 方法
我們增強了提示工程,加入索引術語建議、上下文行檢索和動態少量示例,以生成可靠的 Pandas 查詢,讓我們的系統既準確又高效。
Clalit 健康組織
Clalit 是以色列最大的健康維護組織,為超過 450 萬名會員提供保險和健康服務。這樣的大組織擁有大量有用的信息,應該能夠提供給所有客戶和員工,包括醫療提供者名單、病人的資格、醫療檢查和程序的信息等等。不幸的是,這些信息分散在多個來源和系統中,讓最終用戶很難找到他們所需的具體信息。
解決方案
為了解決這個問題,我們決定建立一個多代理的 RAG 系統,能夠理解需要查詢的知識領域,從一個或多個來源提取相關上下文,並根據這些上下文提供正確和完整的答案。
每個代理專注於特定的領域,並且本身就是一個小型的 RAG,因此可以檢索上下文並回答有關其領域的問題。一個協調代理理解用戶的問題,並決定應該向哪個代理發送請求。然後,它會匯總所有相關代理的答案,並為用戶編制一個答案。
醫療提供者名單
在這篇文章中,我們將專注於一個特定的用例——醫療提供者名單,也稱為服務手冊。服務手冊是一個包含約 23,000 行的表格,每一行代表一個醫療提供者。每個提供者的信息包括地址和聯絡信息、提供的職業和服務(包括員工姓名)、開放時間以及一些有關診所可及性和評論的額外自由文本。
初步方法
我們的初步方法是將每一行轉換為文本文件,進行索引,然後使用簡單的 RAG 來提取。然而,我們很快發現這種方法有幾個限制:
- 用戶可能期望得到多行的答案。例如,考慮問題:“特拉維夫有哪些藥房?”我們的 RAG 應該檢索多少個文件?如果用戶明確定義期望的行數呢?
- 檢索器可能很難區分不同的字段——某個城市的診所可能以另一個城市命名(例如,耶路撒冷診所位於特拉維夫的耶路撒冷路上)。
- 作為人類,我們可能不會“掃描”表格來提取信息。我們更喜歡根據規則過濾表格。我們的應用程序沒有理由表現得不同。
新的方向
因此,我們決定採取不同的方向——要求 LLM 將用戶的問題轉換為提取相關行的計算機代碼。
這種方法受到 llama-index 的 Pandas 查詢引擎的啟發。簡而言之,LLM 的提示由用戶的查詢、df.head()(教 LLM 表格的結構)和一些一般指令組成。
處理生成代碼的挑戰
聽起來簡單,對吧?但在實踐中,我們遇到了殘酷的現實,生成的代碼中大多數情況下 Pandas 都會因某種原因報錯,因此主要工作才剛剛開始。
我們能夠識別生成代碼失敗的三個主要原因,並使用幾種動態提示工程技術來解決這些問題:
- 通過添加“同義詞庫”來修正不精確的術語,以過濾每一列。
- 提供 LLM 來自 df 的相關行,而不是隨機提取的 df.head() 行。
- 動態少量示例,提供量身定制的代碼示例,幫助 LLM 生成正確的 Pandas 代碼。
用戶問題的多樣性
在許多情況下,用戶的問題可能與表格“期望”的不完全相同。例如,用戶可能會詢問特拉維夫的藥房,但表格中的術語是特拉維夫-雅法。在另一種情況下,用戶可能在尋找眼科醫生,而不是眼科醫生,或者尋找心臟病專家而不是心臟病學。LLM 將很難編寫涵蓋所有這些情況的代碼。相反,檢索正確的術語並將其包含在提示中作為建議可能更有效。
結論
在這篇文章中,我們試圖描述幾種我們用來創建更具體和動態提示的啟發式方法,以從我們的表格中提取數據。通過使用預先索引的數據和檢索器,我們可以豐富我們的提示,使其根據用戶當前的問題進行定制。值得一提的是,儘管這使代理變得更加複雜,但運行時間仍然相對較低,因為檢索器通常比文本生成器快。這是一個完整流程的示例:
本文由 AI 台灣 運用 AI 技術編撰,內容僅供參考,請自行核實相關資訊。
歡迎加入我們的 AI TAIWAN 台灣人工智慧中心 FB 社團,
隨時掌握最新 AI 動態與實用資訊!