最近看到一篇論文“KG-HTC: Integrating Knowledge Graphs into LLMs for
Effective Zero-shot Hierarchical Text Classification”,介紹了文本分類的技巧,這篇文航主要利用了知識圖譜+大模型的思路,實驗效果不錯,里面的一些論述也很符合實踐經驗,因此想推薦給大家。
論文解讀網上已經有一些了,這里主要用一個實際案例來做分享,這個案例是大模型結合原文內容生成的,大家可以結合網絡解讀和論文原文一起看看。這篇文章的例子可能有些不太準確,大家只需要理解algorithm1和algorithm2,以及In-context Learning即可。
這個場景大概是這樣:
- 待分類文本:居民區水泥桿上,在10m的位置懸掛警示牌,
- 潛在類別:三級分類,例如(輸電-鐵塔-高處作業,輸電鐵塔-橫擔作業)假設我有20個一級分類,100個二級分類,500個3級分類。
- 真實答案:配網-電線桿-懸掛警示牌。
- 說明:實際場景可能是多分類,關于論文如何進行多分類,請看“L2 預測 (基于 y1=“配網” 的約束 + Q2)
1.工作安全文本分類任務示例
輸入文本: “居民區水泥桿上,在10m的位置懸掛警示牌,作業人員已佩戴安全帽和安全帶。”
假設待匹配分類 (三級標簽體系,還有其他的很多類別):
- 輸電-鐵塔-高處作業
- 輸電-鐵塔-橫擔作業
- 輸電-鐵塔-塔身作業
- 配網-電線桿-高處作業
- 配網-電線桿-警示牌懸掛
- 配網-高處作業-樹障清理
- 配網-高處作業-鳥巢清理
- 個人防護-安全帽-正確佩戴
- 個人防護-安全帶-正確使用
2.KG-HTC 流程模擬(包含多分類篩選)😗*
2.1 存儲層級標簽 (準備階段)** :
- VectorDB (向量數據庫): 存儲所有安全分類標簽的語義嵌入,包括我們假設的 20 個一級、100 個二級和 500 個三級分類的向量表示。例如,“水泥桿”、“警示牌懸掛”、“安全帽”、“安全帶”、“鐵塔”、“吊臂車”等所有標簽的語義都被數字化存儲。
- GraphDB (圖數據庫): 存儲這些標簽之間的層級關系。例如,配網 --is_parent_of–> 電線桿,電線桿 --is_parent_of–> 高處作業,高處作業 --is_parent_of–> 警示牌懸掛。同時,個人防護 --is_parent_of–> 安全帽,安全帽 --is_parent_of–> 正確佩戴。這些層級關系構成了分類的“知識圖譜” 。
2.2 根據輸入的文本,檢索相關標簽并初步構建子圖 (RAG 增強)** :
- 輸入文本嵌入: 首先,計算輸入文本 “居民區水泥桿上,在10m的位置懸掛警示牌,作業人員已佩戴安全帽和安全帶” 的向量嵌入 Ψ(x) 。
- 層級相似度檢索 (使用閾值 τl?) :
- Level 1 (Q1): LLM 會計算輸入文本與所有 20 個一級標簽的余弦相似度 。根據預設的相似度閾值 τ1?,可能檢索到最相關的幾個一級標簽,例如:“配網” (因為"水泥桿"通常與配網相關) 和 “個人防護” (因為提到"安全帽和安全帶") 。
- Level 2 (Q2): LLM 會計算輸入文本與所有 100 個二級標簽的相似度 。根據 τ2?,可能檢索到:
- 與“配網”相關的子類:“電線桿” (因為提到"水泥桿")。
- 與“高處作業”相關的類別:“高處作業” (因為提到"10m高"、“懸掛”)。
- 與“個人防護”相關的子類:“安全帽”、“安全帶” 。
- 也可能檢索到一些與“輸電”相關的但在此情境下弱相關的標簽,例如:“鐵塔” (因為“高處作業”可能也發生在鐵塔上)。
- 此時,Q2 可能包含多個候選:“電線桿”、“高處作業”、“鐵塔”、“安全帽”、“安全帶”。
- Level 3 (Q3): LLM 會計算輸入文本與所有 500 個三級標簽的相似度 。根據 τ3?,可能檢索到:
- 與“電線桿”和“高處作業”相關的:“警示牌懸掛” (直接匹配任務)、高處作業
- 與“鐵塔”相關的:“橫擔作業”、“塔身作業” (雖然關聯性弱,但因為 Level 2 檢索到了“鐵塔”,Level 3 可能會帶出其子類)。
- 與“安全帽”和“安全帶”相關的:“正確佩戴”、“正確使用”。
- 此時,Q3 可能包含多個候選:“警示牌懸掛”、“”高處作業“、”“橫擔作業”、“塔身作業”、“正確佩戴”、“正確使用”。
- 構建有效子圖 (Algorithm 1) :
- 系統會根據父子關系嚴格驗證這些檢索到的候選標簽。只有當一個子標簽的父標簽也在其上一層的候選集中時,這個子標簽才會被保留在子圖中 。
- 例如:
- 警示牌懸掛 (L3) 的父級 電線桿 (L2) 在 Q2 中,且 電線桿 (L2) 的父級 配網 (L1) 在 Q1 中 → 保留路徑:配網 -> 電線桿 -> 警示牌懸掛、
- 類似的,保留:配網-電線桿-高處作業*
- 橫擔作業 (L3) 的父級 鐵塔 (L2) 在 Q2 中,但鐵塔 (L2) 的父級 輸電 (L1)不 在 Q1 中 → 不保留路徑:輸電 -> 鐵塔 -> 橫擔作業 。
- 塔身(L3) 的父級 鐵塔 (L2) 在 Q2 中,但鐵塔 (L2) 的父級 輸電 (L1)不 在 Q1 中 → 不保留路徑:輸電 -> 鐵塔 -> 塔身作業 。
- 正確佩戴 (L3) 的父級 安全帽 (L2) 在 Q2 中,且 安全帽 (L2) 的父級 個人防護 (L1) 在 Q1 中 → 保留路徑:個人防護 -> 安全帽 -> 正確佩戴
- 類似的,保留:個人防護 -> 安全帶-> 正確使用。
- 最終形成的子圖 G 可能包含4條有效的層級路徑,反映了輸入文本可能涉及的多個相關方面。
2.3 從子圖轉換為提示 (Algorithm 2)** :
-
系統會從這個子圖 G 中,通過向上回溯算法,枚舉所有從葉節點到根節點的有效層級路徑 。
-
將這些路徑反轉,使其從根節點開始,并用“->”連接,形成結構化的文本提示 。
-
結構化提示 (Prompt of Subgraph): 可能包含多條路徑,例如:
配網 -> 電線桿 -> 高處作業
配網 -> 電線桿 -> 警示牌懸掛
個人防護 -> 安全帽 -> 正確佩戴
個人防護 -> 安全帶 -> 正確使用
這個提示將被插入到分類模板中,作為 LLM 理解和推理的“知識上下文” 。
2.4 LLM 逐層分類并進行最終篩選 (In-context Learning)** :
-
構建分類提示 (Prompt 2) : 將原始輸入文本、步驟 3 中生成的結構化知識圖譜提示,以及當前層級的候選標簽(基于前一層的預測和 Ql)拼接起來,輸入 LLM 。
-
L1 預測:
- 候選標簽: 所有 20 個一級分類標簽。
- LLM 推理: LLM 會根據文本內容和知識圖譜提示,識別出文本主要涉及“配網”和“個人防護”領域。
- LLM 生成 (y1): “配網” (更直接描述場景主要活動),但也可能同時識別出“個人防護”這個方面。在嚴格的單分類輸出要求下,LLM 會基于其內部權重和上下文關聯度選擇一個最佳匹配。假設第一次迭代主要選擇**“配網”。**
-
L2 預測 (基于 y1=“配網” 的約束 + Q2):
-
候選標簽: 僅考慮“配網”的子類別(如“電線桿”、“高處作業”、“箱變”等)以及 Q2 中與文本更相關的二級標簽。 Q2 中的二級標簽在 L2 預測時起到了一個重要的補充和糾錯作用。 它擴展了僅依賴 L1 預測結果子類別的候選空間,使得 LLM 能夠更靈活地應對復雜或模糊的文本,并有機會修正上一層可能存在的潛在錯誤,從而提高最終分類的準確性
-
LLM 推理: LLM 看到“水泥桿”會進一步聚焦到“電線桿”這個類別,而“10m位置懸掛”則指向“高處作業”。
-
LLM 生成 (y2): 此時,LLM 可能會識別出兩個強相關的二級類別:“電線桿” 和 “高處作業”。 ,忽略掉配網子類別中的箱變和其他Q2中的二級標簽。
- 此處進行篩選: 如果 LLM 被指示只能輸出一個最相關的二級標簽,它會根據文本中“水泥桿”和“10m位置”的關聯性,選擇更直接的“電線桿”。
- 然而,如果 LLM 被允許識別多個相關方面,它可能會在內部考慮兩者,并在下一層(L3)中融合它們。 對于嚴格的層級路徑,LLM 需要在此時確定一個主路徑。
- 我們假設 LLM 優先選擇更具體的物理對象: $y^2 = $ “電線桿”。
-
-
L3 預測 (基于 y2=“電線桿” 的約束 + Q3):
- 候選標簽: 僅考慮“電線桿”的子類別(如“警示牌懸掛”、“高處作業”、“登桿作業”、“桿塔巡檢”),以及 Q3 中檢索到的相關三級標簽。 同理,這里擴展了電線桿的子類別,也是為了提供更多選擇,減輕之前模型的判斷失誤。
- LLM 推理: 基于“電線桿”和文本中的“懸掛警示牌”,LLM 會準確鎖定“警示牌懸掛”。雖然“高處作業”和“登桿作業”也是一個重要方面,但“警示牌懸掛”是更具體的任務描述。
- LLM 生成 (y3): “警示牌懸掛”
2.5 多分類篩選的體現:**
- RAG 階段的初步篩選: 通過余弦相似度 (dC?) 和閾值 (τl?),RAG 系統已經對所有 500 個三級分類、100 個二級分類進行了第一輪的“粗篩”,只檢索出語義上最相關的一小部分候選標簽 (Ql) 。這大大減小了后續 LLM 處理的標簽空間 。
- 子圖構建中的結構篩選: Algorithm 1 進一步保證了檢索到的標簽在層級上的一致性 。它會剔除那些雖然語義相似但沒有正確父子關系的標簽。例如,如果“塔身作業”被檢索到,但它的父級“鐵塔”沒有和“輸電”構成一條完整的、從一級到三級的路徑,或者與文本的整體語義關聯度非常低,那么這條路徑在構建結構化提示時可能就不會被優先考慮或直接被排除。
- LLM 推理時的上下文篩選與優先級判斷:
- In-context Learning: LLM 在接收到包含多條路徑的“Prompt of Subgraph”時,它會利用自身的理解和推理能力,結合原始輸入文本,判斷哪條路徑與當前文本的核心意圖最匹配。即使提示中存在多條可能性路徑(如“輸電 -> 鐵塔 -> 橫擔作業”),LLM 會根據文本中“水泥桿”這一強特征,將權重更多地分配給“配網 -> 電線桿 -> 警示牌懸掛”這條路徑。
- 逐層預測的精煉: 每一層的預測結果都會作為下一層預測的約束 。例如,一旦確定一級是“配網”,那么二級就只會從“配網”的子類或與“配網”強相關的類別中選擇,從而排除了“輸電”下的大量二級和三級分類。這是一種“漏斗式”的篩選,逐步縮小了搜索空間。
- 緩解前一層錯誤: 即使前一層的預測偶爾出現偏差,通過結合當前層級的 Ql (通過相似度直接檢索到的候選),LLM 仍然有機會糾正方向,提高分類的魯棒性。這意味著它不完全依賴于上一步的硬性選擇,而是會重新評估所有相關候選。
最終,通過 RAG 的語義篩選、知識圖譜的結構篩選,以及 LLM 自身的上下文理解和逐層推理,KG-HTC 能夠在多個潛在分類中,精確地鎖定最符合輸入文本描述的唯一或最佳匹配的層級分類路徑。