知識圖譜輔助檢索:關聯性問題的解法
「A 的主管的部門負責哪些產品」這種問題,向量檢索天生做不好。
向量檢索擅長找「語意相近的片段」,不擅長回答需要多跳關聯的問題。因為答案不在任何單一片段裡,而在片段之間的關係中。
典型的失敗例子:「去年離職的那位工程師負責的專案,現在由誰接手」。這需要串起三個事實,每個事實可能在不同文件裡。
什麼時候值得加圖
- 大量問題涉及實體之間的關係(人、組織、產品、零件)。
- 需要多跳推理(A→B→C)。
- 實體與關係相對穩定,值得投入抽取成本。
不值得加圖的情況
- 問題多為「這個怎麼做」的操作型查詢。
- 文件內容變動極快,圖的維護成本會超過收益。
- 團隊沒有維運圖資料庫的經驗——這是真實的成本。
實體與關係抽取
EXTRACT = '''從下列文件片段抽取實體與關係,只輸出 JSON。
實體型別:Person | Team | Product | Document | System
關係型別:manages | belongs_to | owns | depends_on | supersedes
規則:
- 只抽取文中明確陳述的關係,不要推論。
- 每個關係必須附上原文依據 evidence。
輸出:{"entities": [{"id","type","name"}],
"relations": [{"from","type","to","evidence"}]}'''evidence 欄位是品質控管的關鍵:沒有原文依據的關係一律丟棄。抽取階段的寬鬆會在查詢階段變成錯誤答案。
混合查詢流程
def hybrid_answer(q):
ents = link_entities(q) # 找出問題中的實體
if len(ents) >= 1 and needs_hop(q):
sub = graph.neighborhood(ents, hops=2) # 取兩跳子圖
facts = render_triples(sub) # 轉成可讀的事實句
else:
facts = ''
chunks = vector_search(q, top_k=5)
return generate(q, context=facts + '\n\n' + render(chunks))把圖轉成文字給模型
不要讓模型直接讀圖資料庫的查詢結果格式。把三元組轉成自然語句——「張三 管理 平台team」寫成「張三管理平台團隊」——模型的理解正確率會明顯較高。
維護的現實成本
- 文件更新時,舊的關係要失效。這比更新文字片段複雜得多。
- 實體對齊(同一個人的不同稱呼)需要持續維護。
- 抽取錯誤會累積,需要定期抽查與人工修正機制。
別在第一版就上知識圖譜。先做好基礎 RAG,用真實的失敗案例證明「這些問題確實需要關聯推理」,再決定投入。
訂閱後繼續閱讀全文
本篇為訂閱者專屬內容。訂閱後可取得下列權限:
- 解鎖全部內容權限
- 閱讀不限篇數
- 全站移除廣告
月卡
NT$240
開通 30 天
一次付清,開通 30 天
季卡
NT$620
開通 90 天
一次付清,開通 90 天,每天約 NT$7
年卡
NT$2,160
開通 365 天
一次付清,開通 365 天,每天約 NT$6
一次性付款,付款成功後立即開通,到期自動結束,不會再次扣款,也不需要取消訂閱。
立即訂閱
金額均為新臺幣(TWD),即實際扣款金額,不另收手續費
支援信用卡 · Apple Pay · Google Pay · WebATM · ATM 轉帳
購買須知與退款政策