3種方法讓大語言模型提取任意文檔中的知識點
大語言模型(LLM)使得從海量非結構化文檔中自動化、規(guī)模化地提取關鍵信息成為可能。無論是處理公司財報、技術白皮書,還是分析法律合同,LLM 都能扮演一個高效的知識抽取專家。
本指南將系統介紹從文檔預處理到知識提取的三種方法,幫助你根據不同場景選擇最優(yōu)方案。
預處理:將任意文檔轉換為結構化的純文本(Markdown)
在將任何文檔交給大模型之前,有一個至關重要的預處理步驟:將任意格式的文檔轉換為大模型可處理的純文本格式。信息的質量和格式,直接決定了模型提取知識的上限。
大語言模型本身不理解.pdf的視覺布局、不認識.docx的復雜樣式,也無法直接解析.html的標簽。它們的核心輸入是文本序列。因此,我們的首要任務,就是將五花八門的文檔格式統一轉換成一種既保留了原文結構、又便于模型理解的文本格式。
1. 目標:為什么選擇 Markdown?
我們的目標是將任意文檔轉換為 對大語言模型友好的格式——Markdown。
為什么是 Markdown?
- 結構清晰:Markdown 使用簡單的符號(如
#表示標題,-或*表示列表)來標記文本的層級和結構。這使得模型能夠輕松識別哪些是標題、哪些是正文、哪些是列表項,從而更好地理解上下文關系。 - 人類可讀:Markdown 格式本身就非常直觀,易于人類閱讀和校驗。
- 輕量純粹:它剔除了所有復雜的格式和樣式信息,只保留最核心的文本內容和邏輯結構,減少了無關噪聲對模型分析的干擾。
2. 核心挑戰(zhàn):格式的繁雜
在實際工作中,我們面臨的文檔格式多種多樣,每種都有其處理難點:
- PDF:布局復雜,包含多欄、圖表、頁眉頁腳,文本提取容易錯位或混雜。
- DOCX/DOC:富文本格式,包含大量樣式信息,直接轉換可能產生冗余的 XML 標簽。
- HTML:雖然是文本,但充滿了導航欄、廣告、腳本等與正文無關的“噪音”。
- PPTX:內容分散在各個幻燈片和文本框中,需要整合。
手動處理這些格式費時費力且容易出錯。因此,我們需要一個強大的自動化工具來預處理文檔。
3. 推薦方案:使用 Python 的markitdown庫
在這里,推薦使用一個專為此目的設計的 Python 開源項目——markitdown。它旨在將多種主流文檔格式一鍵轉換為干凈、高質量的 Markdown。
開源地址:https://github.com/microsoft/markitdown
總結
文檔預處理是構建高質量知識提取系統的基石。通過使用markitdown這類工具將任意文檔統一轉換為結構化的 Markdown 文本,我們?yōu)榇笳Z言模型鋪平了道路,確保了輸入數據的干凈、規(guī)整和易于理解。
在擁有了這份堅實的地基之后,我們便可以自信地進入知識提取的核心環(huán)節(jié)。接下來,我們將介紹第一種提取方法:直接提問,指定提取范式。
方法一:直接提問,指定提取范式
這種方法的核心思想是,當我們對目標文檔的內容類型有一定先驗知識時,可以主動為大模型設定一個清晰的“信息框架”或“提取模板”,引導模型像填寫一份結構化表單一樣,將文檔中的對應信息“填入”我們預設的類別中。
1. 核心原理
此方法模擬了人類專家閱讀文檔的過程。一位領域專家在閱讀材料時,腦海中通常會帶著明確的目標,例如:“這份財報的關鍵財務指標是什么?”或“這篇論文的核心技術貢獻有哪些?”。
“指定提取范式”正是將這種目標導向的思維模式,轉化為對大模型的明確指令。我們不讓模型漫無目的地“閱讀全文”,而是給它一個“任務清單”,要求它在文檔中尋找并填充我們指定的知識類別。這種方式極大地約束了模型的輸出空間,使其專注于提取我們最關心的信息。
2. 具體實現方式
實現此方法非常簡單,主要包含兩個步驟:
第一步:定義提取范式(Schema)
根據你的需求和文檔類型,預先定義好需要提取的知識點類別。這個范式可以是一個簡單的列表,也可以是更復雜的分類。
例如:
- 對于歷史事件文檔:可定義為
[關鍵人物, 事件起因, 發(fā)生時間, 地點, 主要影響] - 對于產品說明書:可定義為
[產品名稱,核心功能, 技術規(guī)格, 適用人群, 價格] - 對于科研論文摘要:可定義為
[研究背景, 研究方法, 主要發(fā)現, 結論與意義]
第二步:構建提示詞(Prompt)
將提取范式和原始文檔組合成一個清晰的提示詞。一個簡潔的提示詞結構通常如下:
# 任務指令
請根據下面提供的 {文檔類型} 內容,嚴格按照我給定的范式提取關鍵知識點。
# 提取范式
- {類別一}: [請在此處填寫提取內容]
- {類別二}: [請在此處填寫提取內容]
- {類別三}: [請在此處填寫提取內容]
...
# 文檔內容
{此處粘貼你的完整文檔文本}
3. 實戰(zhàn)示例:提取一篇人物簡介的核心信息
假設我們有一段關于瑪麗·居里的簡介,希望能快速抽取出其中的核心要素。
第一步:定義范式
對于人物簡介,我們關心的通常是人物、成就、關鍵時間和相關領域。因此,我們定義范式如下:
- 關鍵人物:
- 國籍/領域:
- 主要成就:
- 重要時間節(jié)點:
- 核心概念:
第二步:構建并發(fā)送 Prompt
# 任務指令
請根據下面提供的人物簡介,嚴格按照我給定的范式提取關鍵知識點。如果某一項在原文中未提及,請?zhí)顚憽拔刺峒啊薄?
# 提取范式
- 關鍵人物: [請在此處填寫提取內容]
- 國籍/領域: [請在此處填寫提取內容]
- 主要成就: [請在此處填寫提取內容]
- 重要時間節(jié)點: [請在此處填寫提取內容]
- 核心概念: [請在此處填寫提取內容]
# 文檔內容
瑪麗·居里(Marie Curie,1867年11月7日—1934年7月4日),出生于波蘭華沙,是世界著名的物理學家、化學家。她是放射性研究的先驅者,與其丈夫皮埃爾·居里共同發(fā)現了放射性元素釙(Po)和鐳(Ra)。1903年,他們因此與亨利·貝克勒勒共同獲得了諾貝爾物理學獎。1911年,瑪麗·居里因成功分離出純的金屬鐳而再次榮獲諾貝爾化學學獎,成為世界上第一位兩次獲得諾貝爾獎的人。她的研究極大地推動了原子物理學的發(fā)展,并為癌癥的放射性治療奠定了基礎。
第三步:獲取模型輸出
大模型會根據指令,生成如下結構清晰的輸出:
- 關鍵人物: 瑪麗·居里(Marie Curie)
- 國籍/領域: 波蘭裔;物理學家、化學家
- 主要成就: 發(fā)現放射性元素釙和鐳;成功分離出純的金屬鐳;成為首位兩獲諾貝爾獎的人。
- 重要時間節(jié)點: 1867 年(出生),1903 年(獲諾貝爾物理學獎),1911 年(獲諾貝爾化學學獎),1934 年(逝世)。
- 核心概念: 放射性研究、原子物理學、放射性治療
4. 優(yōu)點與局限性
優(yōu)點:
- 高精度與可控性:由于輸出格式被嚴格限定,模型“自由發(fā)揮”的空間小,減少了信息編造(幻覺)的風險,提取結果的準確率和穩(wěn)定性非常高。
- 結構化輸出:直接得到規(guī)整的、半結構化的數據,非常便于后續(xù)的程序處理、數據入庫或分析(當然,提示詞也可以改為結構化的 JSON Schema)。
- 簡單高效:實現門檻低,無需復雜的編程,只需精心設計提示詞即可完成任務,對于特定、重復性的提取任務效率極高。
局限性:
- 通用性不足:這是該方法最主要的缺點。提取范式與文檔類型和分析目的強綁定。處理新類型的文檔時,必須重新設計一套范式,無法“一招鮮吃遍天”。
- 可能遺漏未知信息:模型只會提取范式中列出的類別。如果文檔中包含了范式之外的重要知識點,這些信息將被直接忽略。這限制了其在探索性分析(不知道文檔里有什么重點)場景下的應用。
- 依賴先驗知識:設計一個有效的提取范式,需要用戶對該領域或該類文檔有基本的理解,知道“什么才是重要的”。
5. 適用場景
基于其優(yōu)缺點,此方法特別適用于以下場景:
- 批量處理同類文檔:例如,從上千份簡歷中提取
[姓名, 聯系方式, 工作年限, 畢業(yè)院校, 技能標簽];或從大量財務報告中提取[公司名稱, 報告期, 總收入, 凈利潤, 資產負債率]。 - 特定信息抽取任務:當你的目標非常明確,只關心文檔中的某幾個特定數據點時,此方法最為直接有效。
- 構建知識圖譜的初始數據:提取出的結構化實體和關系,可以作為構建知識圖譜的原子數據來源。
總而言之,“指定提取范式”是一種強大而可靠的知識提取工具。它最適合那些目標明確、結構重復的場景。然而,當我們面對內容多樣、結構未知的復雜文檔,或希望進行更全面的開放式知識探索時,就需要接下來將要介紹的、更具自適應性的方法了。
方法二:直接提問,提取為 JSON 結構
當方法一中預設的固定范式無法滿足我們對知識復雜性和靈活性的要求時,就需要一種更具彈性的提取方式。方法二“提取為 JSON 結構”應運而生。它利用 JSON 的強大數據表達能力,讓大語言模型自行發(fā)現并組織文檔中的知識結構,從而實現從“填空題”到“簡答題”的升級。
1. 核心原理
此方法的核心在于,我們不再為模型提供一個僵化的表單,而是要求它將文檔內容理解、歸納后,以一種通用的、自描述的、層次化的格式——JSON——進行輸出。
JSON 格式天然支持鍵值對、數組和對象嵌套,這使其能夠完美地表示現實世界中復雜的、非線性的知識關系。例如,一個“項目”可以包含多個“成員”,每個“成員”又有自己的“姓名”和“職責”。這種層級關系用方法一的扁平列表很難表達,但用 JSON 則輕而易舉。
通過要求 LLM 生成 JSON,我們實際上是授權模型:
- 識別實體(Entities):找出文檔中的關鍵對象,如人物、公司、產品。
- 提取屬性(Attributes):捕捉每個實體的相關信息,如人物的職位、產品的價格。
- 發(fā)現關系(Relationships):理解實體間的聯系,并用嵌套結構將其組織起來。
2. 具體實現方式
第一步:確定提取的廣度和深度
你不需要定義每一個具體的字段,但需要給模型一個大致的方向。是希望提取一個扁平的鍵值對集合,還是一個深度嵌套的復雜結構?希望關注哪些宏觀層面的信息?
第二步:構建提示詞(Prompt)
提示詞是這里的關鍵。一個好的提示詞應該清晰地傳達以下幾點:
- 明確要求輸出 JSON 格式:這是最基本的要求,可以直接使用“請?zhí)崛?JSON 格式”等字樣。
- (可選)建議頂層結構:可以建議一些頂層的 Key,引導模型組織信息,例如:“請以‘主要概念’、‘關鍵事件’和‘核心人物’為頂層鍵構建 JSON 對象。”
- (可選)給出示例(Few-shot):提供一個簡單的輸入和期望的 JSON 輸出示例,能極大地幫助模型理解你想要的結構,提升輸出的穩(wěn)定性和質量。
一個通用的提示詞模板如下:
# 任務指令
請仔細閱讀下方的文檔,并提取其中所有的關鍵知識點。
請將提取的結果組織成一個結構清晰、多層嵌套的JSON對象。
JSON的結構應該能反映信息之間的邏輯層級關系。
# 文檔內容
{此處粘貼你的完整文檔文本}
3. 實戰(zhàn)示例:再次提取瑪麗·居里的簡介
我們繼續(xù)使用相同的瑪麗·居里簡介文本,但這次采用 JSON 提取方法,以對比其與方法一的差異。
構建并發(fā)送 Prompt
# 任務指令
請仔細閱讀下方的個人簡介,并提取其中所有的關鍵信息。
請將提取的結果組織成一個結構清晰的JSON對象,其中應包含人物的基本信息、教育背景以及其主要科學成就(成就應作為一個列表,每個成就包含年份和描述)。
# 文檔內容
瑪麗·居里(Marie Curie,1867年11月7日—1934年7月4日),出生于波蘭華沙,是世界著名的物理學家、化學家。她是放射性研究的先驅者,與其丈夫皮埃爾·居里共同發(fā)現了放射性元素釙(Po)和鐳(Ra)。1903年,他們因此與亨利·貝克勒勒共同獲得了諾貝爾物理學獎。1911年,瑪麗·居里因成功分離出純的金屬鐳而再次榮獲諾貝爾化學學獎,成為世界上第一位兩次獲得諾貝爾獎的人。她的研究極大地推動了原子物理學的發(fā)展,并為癌癥的放射性治療奠定了基礎。
獲取模型輸出
模型會生成一個結構化的 JSON 對象,能夠清晰地展示信息層級:
{
"person": {
"name": "瑪麗·居里",
"english_name": "Marie Curie",
"lifespan": {
"birth": "1867-11-07",
"death": "1934-07-04"
},
"birthplace": "波蘭華沙",
"fields": ["物理學", "化學"],
"titles": ["物理學家", "化學家", "放射性研究的先驅者"],
"achievements": [
{
"year": 1903,
"award": "諾貝爾物理學獎",
"description": "與皮埃爾·居里、亨利·貝克勒勒共同因對放射性的研究獲獎。",
"related_discoveries": ["釙 (Po)", "鐳 (Ra)"]
},
{
"year": 1911,
"award": "諾貝爾化學學獎",
"description": "因成功分離出純的金屬鐳而獲獎,成為首位兩次獲得諾貝爾獎的人。"
}
],
"legacy": "極大地推動了原子物理學的發(fā)展,并為癌癥的放射性治療奠定了基礎。"
}
}
對比方法一的扁平列表,這個 JSON 輸出顯然包含了更豐富、更有條理的結構化信息。
4. 優(yōu)點與局限性
優(yōu)點:
- 自適應與靈活性:模型可以根據文檔內容自主決定最合適的知識結構,無需預先定義死板的范式,通用性強。
- 層次化表達能力:能夠捕捉文本信息中的嵌套關系,比扁平結構更能反映知識的真實面貌。
- 高度機器可讀性:JSON 是現代軟件開發(fā)的標準數據交換格式,輸出結果可以直接被各類應用程序和數據庫消費,便于自動化處理。
局限性:
- 結構不穩(wěn)定性:這是該方法最大的挑戰(zhàn)。即使是相同的輸入,每次請求模型返回的 JSON 結構也可能存在細微差異(例如,鍵名是
"name"還是"full_name","achievements"是列表還是對象)。這給需要穩(wěn)定數據結構的下游應用帶來了困難。 - 長文檔信息丟失:正如參考文章中所指出的,當處理長篇文檔時,大模型有限的“注意力”可能會被分散。模型可能會“忘記”文檔開頭或中間的細節(jié),導致生成的 JSON 丟失重要信息或只覆蓋了文檔的一部分。這是由當前 LLM 的上下文窗口(Context Window)和注意力機制的內在局限性決定的。
- 格式錯誤風險:模型偶爾會生成不符合規(guī)范的 JSON(如缺少逗號、括號不匹配、注釋使用不當),尤其是較深的嵌套結構時,導致程序解析失敗。因此,必須在應用中加入健壯的錯誤處理和容錯機制,例如通過正則匹配等方式進行回退處理。
5. 適用場景
盡管存在局限性,JSON 提取方法依然在許多場景下表現出色:
- 探索性知識發(fā)現:當你對一份文檔的內容結構不甚了解,希望模型幫助你梳理出其中的知識脈絡時,此方法是理想選擇。
- 處理半結構化數據:對于那些本身就包含一定結構(如產品規(guī)格表、組織架構圖描述)的文檔,JSON 能很好地還原并規(guī)范化這些結構。
- 為 API 或應用準備數據:當最終目的是將提取的知識點通過 API 提供服務或存入數據庫時,JSON 是天然的、最適配的格式。
總的來說,將知識提取為 JSON 是一種兼具靈活性和強大表達能力的先進方法。它將知識提取的自主權更多地交給了模型。然而,要真正發(fā)揮其威力,開發(fā)者必須正視并解決其在穩(wěn)定性和長文檔處理上的挑戰(zhàn),通常需要結合后續(xù)的數據校驗、清洗以及更精巧的文檔分塊處理策略(如參考下文中提到的“兩階段記憶-聚焦對話機制”)。
方法三:直接提問,提取為 QA 問答對
前面兩種方法分別解決了“按固定模板填空”和“按內容自主構建層級結構”的問題。然而,知識的最終目的是被應用和查詢。方法三“提取為 QA 問答對”將知識提取的焦點從“存儲”轉向了“使用”,它將文檔內容轉化為一系列直觀的、可供問答的知識單元,是構建智能問答系統和 RAG(Retrieval-Augmented Generation)應用的核心基石。
1. 核心原理
此方法的核心思想是 將陳述性知識轉換為可對話的、可檢索的原子單元。它不再問“這份文檔里有什么?”,而是問“這份文檔能回答哪些問題?”。
模型被要求扮演一個“出題老師”的角色,通讀全文后,針對其中的每一個關鍵知識點,設計一個問題(Question)并給出精準的答案(Answer)。這種轉換具有深遠的意義:
- 模擬用戶意圖:生成的問題(Q)天然地模擬了真實用戶在查詢相關信息時可能會提出的問題,這使得后續(xù)的語義匹配和檢索變得異常高效。
- 知識原子化:每個 QA 對都是一個獨立的、自包含的知識點。這種原子化的形式易于存儲、驗證、更新和單獨調用。
- 為 RAG 鋪路:在 RAG 系統中,用戶的提問會與知識庫中所有問題的向量進行相似度計算,快速找到最相關的幾個 QA 對。然后,將其對應的答案(A)作為上下文(Context)提供給大模型,從而生成精準且有據可依的回答。
2. 具體實現方式
實現 QA 提取,需要根據文檔的長度采用不同的策略,下面給出非常成熟的工程實踐。
第一步:基礎實現 - 簡單提示詞
對于中短篇幅、信息密度適中的文檔,一個簡單的指令即可生效。
構建提示詞(Prompt):
提示詞需要明確任務目標和輸出格式。
# 任務指令
請仔細閱讀以下文檔,并將其中的核心知識點提取為一系列「一問一答」的QA問答對。
請確保問題具有代表性,答案嚴格來源于原文內容。
# 輸出格式
請以JSON數組的格式輸出,每個對象包含"Question"和"Answer"兩個鍵。
[
{"Question": "string", "Answer": "string"},
{"Question": "string", "Answer": "string"}
]
# 文檔內容
{此處粘貼你的完整文檔文本}
第二步:進階策略 - 應對復雜文檔
簡單的全文輸入在處理極短或極長的文檔時會遇到瓶頸。因此,必須采用更精巧的策略。
-
針對短文檔(如 1-2 句話)的精準控制:
- 問題:模型容易過度解讀,編造原文未提及的信息。
- 解決方案:采用“基于句子計數的動態(tài)控制”。
- 將文檔分割成句子列表,計算總句數
N。 - 假設每個句子對應一個知識點,在提示詞中明確要求模型生成
N個 QA 對。這為模型提供了強約束,迫使其聚焦于原文,避免信息創(chuàng)造。
- 將文檔分割成句子列表,計算總句數
-
針對長文檔(如技術白皮書)的完整覆蓋:
- 問題:模型存在“注意力天花板”,輸出 QA 數量有限(如 10-15 個),且容易遺漏細節(jié)或重復提問。
- 解決方案:采用“兩階段記憶-聚焦對話機制”。
- 分塊:將長文檔按句子數量(如每 10 句)切分為多個片段。
- 記憶階段:在第一輪對話中,將 全文 發(fā)送給模型,指令其“記住下面的技術文檔”,為模型建立完整的上下文背景(長期記憶)。
- 聚焦階段:在第二輪對話中,依次發(fā)送 每一個文檔片段,指令其“僅針對當前片段提取 QA 問答對”。由于模型已具備全文記憶,它在處理局部片段時能更好地理解其在全局中的位置和意義,從而實現對局部內容的專注、深度提取。
- 合并:將所有片段生成的 QA 對合并,形成覆蓋整篇文檔的完整 QA 知識庫。
3. 實戰(zhàn)示例:依然是瑪麗·居里的簡介
我們使用基礎實現方式來處理這段文本。
構建并發(fā)送 Prompt
# 任務指令
請仔細閱讀以下文檔,并將其中的核心知識點提取為一系列「一問一答」的QA問答對。
請確保問題具有代表性,答案嚴格來源于原文內容。
# 輸出格式
請以JSON數組的格式輸出,每個對象包含"Question"和"Answer"兩個鍵。
# 文檔內容
瑪麗·居里(Marie Curie,1867年11月7日—1934年7月4日),出生于波蘭華沙,是世界著名的物理學家、化學家。她是放射性研究的先驅者,與其丈夫皮埃爾·居里共同發(fā)現了放射性元素釙(Po)和鐳(Ra)。1903年,他們因此與亨利·貝克勒勒共同獲得了諾貝爾物理學獎。1911年,瑪麗·居里因成功分離出純的金屬鐳而再次榮獲諾貝爾化學學獎,成為世界上第一位兩次獲得諾貝爾獎的人。她的研究極大地推動了原子物理學的發(fā)展,并為癌癥的放射性治療奠定了基礎。
獲取模型輸出
模型會生成一個可以直接用于知識庫的 JSON 數組:
[
{
"Question": "瑪麗·居里的出生地和職業(yè)是什么?",
"Answer": "她出生于波蘭華沙,是一位世界著名的物理學家和化學家。"
},
{
"Question": "瑪麗·居里在放射性研究領域的主要貢獻是什么?",
"Answer": "她是放射性研究的先驅者,并與其丈夫皮埃爾·居里共同發(fā)現了放射性元素釙(Po)和鐳(Ra)。"
},
{
"Question": "瑪麗·居里分別在哪一年獲得了諾貝爾獎?獲得了什么獎項?",
"Answer": "她于1903年獲得了諾貝爾物理學獎,并于1911年再次榮獲諾貝爾化學學獎。"
},
{
"Question": "瑪麗·居里為何成為世界上第一位兩次獲得諾貝爾獎的人?",
"Answer": "她因在1903年獲得諾貝爾物理學獎,并在1911年因成功分離出純的金屬鐳而再次獲得諾貝爾化學學獎。"
},
{
"Question": "瑪麗·居里的研究對后世產生了哪些重要影響?",
"Answer": "她的研究極大地推動了原子物理學的發(fā)展,并為癌癥的放射性治療奠定了基礎。"
}
]
4. 優(yōu)點與局限性
優(yōu)點:
- 極高的檢索適用性:QA 格式是為檢索而生的。用戶提問可以直接與庫中的“Question”和“Answer”同時進行語義匹配,召回率和精確率都非常高。
- 提升知識庫質量:生成 QA 的過程本身就是對原文信息的一次深度理解和驗證,有助于篩選出真正的核心知識點。
- 易于人工審核和維護:單個 QA 對清晰明了,便于人工快速判斷其準確性,也易于對單個知識點進行增刪改查。
局限性:
- 對模型能力要求高:生成高質量、不重復、全覆蓋的 QA 對,對大模型的理解、推理和概括能力提出了很高的要求。從工程實踐的經驗來看,通常需要 70B 參數規(guī)模以上的模型才能取得理想效果。
- 存在幻覺風險:尤其在處理信息模糊或句子簡短的文本時,模型可能會生成不準確或超范圍的答案,需要引入校驗機制。
- 成本較高:相比前兩種方法,生成高質量 QA 對(特別是采用長文檔處理策略時)需要更精巧的提示詞工程和可能更多的 API 調用,計算成本更高。
5. 適用場景
- 構建企業(yè)級智能問答系統或知識庫:這是最核心、最普遍的應用場景,用于內部知識管理、外部客戶支持等。
- 自動化生成 FAQ 頁面:將冗長的產品文檔、服務條款或技術手冊,一鍵轉化為用戶易于查詢的 FAQ 列表。
- 創(chuàng)建學習和培訓材料:從教材、講義或規(guī)章制度中提取 QA 對,用于制作學習卡片、在線測驗或培訓考核。
- 為模型微調準備高質量數據集:生成的 QA 對可以作為有監(jiān)督微調(SFT)的優(yōu)質數據,用于訓練更小、更專注的垂直領域問答模型。
綜上所述,提取 QA 問答對是一種面向應用的、高級的知識提取范式。它雖然實現起來最具挑戰(zhàn)性,但其產出物在知識檢索和人機交互場景中具有無與倫比的價值。
進階優(yōu)化:多維度的知識增強與擴展
至此,我們已經掌握了三種核心的知識提取方法。然而,在追求卓越的知識服務時,僅僅“提取”出知識是不夠的,其“價值”可以通過進一步的加工和擴展得到極大的提升。
在我們的實踐中,我們探索并驗證了一些行之有效的知識增強手段。這些方法尤其在構建先進的 RAG 檢索增強系統中,能夠發(fā)揮出巨大的威力。下面,我們分享三種主要的增強策略。
1. 摘要生成 (Summary)
在處理長文檔時,我們通常會將其切分為多個片段進行處理(如方法三所述)。這時,我們可以順便為每個片段生成一個高度濃縮的摘要。
實現方式
這通常不是一個獨立的操作,而是可以整合在 QA 提取的提示詞中。在要求模型提取 QA 對的同時,額外增加一條指令:
...
# 任務指令
1. 提取當前文檔片段的QA問答對。
2. 為該片段生成一個不超過50字的簡潔摘要。
# 輸出格式
請以JSON格式輸出,包含"Summary"和"PossibleQA"兩個鍵。
...
價值所在
這個簡單的摘要,為每個知識片段貼上了一個清晰的“內容導航標簽”。它的價值體現在多個層面:
- 提升檢索效率:摘要可以作為元數據(Metadata)與 QA 對一同存入向量數據庫的
payload字段。在檢索時,系統不僅可以匹配問題(Question),還可以匹配摘要內容。這使得即使用戶的提問與標準問題不完全一致,但只要與片段的主題相關,也能被成功召回(需與 Question/Answer 進行多路檢索融合排序)。 - 優(yōu)化用戶體驗:在搜索結果列表中,向用戶展示的不僅僅是生硬的 QA 對,還可以附上該 QA 所屬片段的摘要。這能讓用戶快速了解該知識點的上下文背景,判斷其是否為自己所需,從而更快地找到答案。
- 豐富生成上下文:在 RAG 的最后一步——將檢索到的內容交給大模型生成最終回答時,將相關的摘要也一并喂給模型。這能幫助模型更好地理解知識來源,甚至在最終答案中引用或推薦相關的參考來源,提升回答的專業(yè)性和可信度。
示例(瑪麗·居里)
假設一個片段同時包含了居里夫人的兩次諾獎經歷,其增強后的輸出可能如下:
{
"Summary": "本片段介紹了瑪麗·居里分別在1903年和1911年因放射性研究和分離純鐳而兩次榮獲諾貝爾獎的經歷。",
"PossibleQA": [
{
"Question": "瑪麗·居里在哪兩年獲得了諾貝爾獎?",
"Answer": "她分別在1903年和1911年獲得了諾貝爾獎。"
}
// ... 其他QA ...
]
}
2. 答案擴展 (Full Answer)
模型提取的答案(Answer)為了精準,往往非常簡潔。但在某些場景下,用戶可能需要更詳盡的解釋。為此,我們可以對核心的 QA 進行“答案擴展”。
實現方式
這是一個二次處理過程。在生成基礎 QA 對之后,可以對每個簡略的 QA 對,再次調用大模型:
# 原始信息
- 問題: "瑪麗·居里為何成為世界上第一位兩次獲得諾貝爾獎的人?"
- 簡潔答案: "她因在1903年獲得諾貝爾物理學獎,并在1911年因成功分離出純的金屬鐳而再次獲得諾貝爾化學學獎。"
# 相關原文
"{...粘貼相關的原文...}"
# 任務指令
請基于上述原文,為這個問題提供一個更詳細、更完整的回答。
價值所在
這個“完整答案”(Full Answer)同樣是寶貴的元數據,存入payload中。
- 提供深度信息:在應用界面上,可以在簡潔答案旁設置一個“查看詳情”的按鈕。用戶點擊后,即可展示這段更豐富的
Full Answer,滿足其深度閱讀的需求。 - 增強最終生成質量:在 RAG 流程中,如果檢索到了這個 QA,可以將
Full Answer作為更高質量的上下文注入給模型。這使得最終生成的回答不再是簡單復述,而是可以綜合更豐富信息,給出更有深度、更具解釋性的答案。
3. 同義問法擴增 (Question Variants)
一個知識點往往可以用無數種方式來提問。我們的標準問題可能只是其中最規(guī)范的一種,但用戶的實際提問卻是五花八門的。為了彌補這一差距,同義問法擴增應運而生。
實現方式
這也是一個二次處理步驟。針對每個生成的標準問題,再次調用大模型:
# 標準問題
"瑪麗·居里在哪兩年獲得了諾貝爾獎?"
# 任務指令
請為上面的問題生成3-5個語義完全相同,但表述方式不同的同義問法。
價值所在
我們認為,這是*顯著提升檢索系統召回率的手段。用戶不會總是按照我們預設的標準問題來提問。
- 提升召回率:通過為每個知識點預置多種可能的問法,并為所有這些問法生成向量,我們的知識庫就能夠覆蓋更廣泛的查詢意圖。無論用戶問“居里夫人拿過幾次諾獎?”還是“介紹下居里夫人的諾獎歷史”,系統都能準確地定位到同一個知識點。這極大地降低了因表述差異而導致“有答案卻搜不到”的尷尬情況。
示例(瑪麗·居里)
一個完整的、經過多維度增強的知識單元,在數據庫中可能看起來是這樣的:
{
"id": "doc_chunk_123",
"question_vector": [0.12, -0.45, ...], // 這是問題的向量(也可以同時有稀疏向量和稠密語義向量)
"answer_vector": [0.12, -0.45, ...], // 這是答案的向量(也可以同時有稀疏向量和稠密語義向量)
"summary_vector": [0.12, -0.45, ...], // 這是片段概要的向量(可選的)
"payload": {
"Summary": "本片段介紹了瑪麗·居里分別在1903年和1911年因放射性研究和分離純鐳而兩次榮獲諾貝爾獎的經歷。",
"Question": "瑪麗·居里在哪兩年獲得了諾貝爾獎?",
"Answer": "她分別在1903年和1911年獲得了諾貝爾獎。",
"FullAnswer": "瑪麗·居里于1903年,因對亨利·貝克勒勒發(fā)現的放射性現象的深入研究,與丈夫皮埃爾·居里及貝克勒勒本人共同榮獲諾貝爾物理學獎。隨后,她繼續(xù)不懈努力,于1911年成功分離出純的金屬鐳,并精確測定了其性質,因此獨立獲得了諾貝爾化學學獎,這一成就使她成為歷史第一人。"
"...":"..." // 其他屬性
}
}
通過這三種進階優(yōu)化,我們手中的知識點不再是孤立、單薄的條目,而是轉化為了信息層次豐富的知識對象,為構建真正智能、強大且用戶友好的知識應用奠定了堅實的基礎。
附:開源項目 GC-QA-RAG
以上知識增強方法,源自項目 GC-QA-RAG,這是一個面向高質量知識檢索與問答的開源解決方案。
項目地址:https://github.com/GrapeCity-AI/gc-qa-rag (MIT License)
浙公網安備 33010602011771號