給答案加上引用:可追溯的 RAG 怎麼實作
沒有引用的 RAG 等於沒有依據。這篇示範讓每一句答案都能對回原文的做法。
引用不只是體驗好,它是驗證機制:能引用代表模型真的用了檢索結果,而不是憑記憶編造。
給每個片段編號
ctx = '\n\n'.join(
f"[{i}] (來源:{c.doc_title} 第 {c.page} 頁)\n{c.text}"
for i, c in enumerate(chunks, start=1)
)要求逐句標註
限制:
- 只根據 <context> 作答。
- 每一個句子結尾都必須標註來源編號,格式為 [n],可標多個。
- 找不到依據的內容不得寫出。
輸出格式:
{"answer": "……[1] ……[2][3]", "used": [1, 2, 3]}程式端驗證
模型有可能標錯編號,所以要驗證:used 裡的編號必須都存在,而且答案中出現的編號要與 used 一致。不一致時,退回重生成或降級為「僅顯示原文片段」。
def verify_citations(ans, n_chunks):
used = set(ans.get('used', []))
inline = set(int(x) for x in re.findall(r'\[(\d+)\]', ans['answer']))
if not inline: return 'no_citation'
if inline != used: return 'mismatch'
if max(inline) > n_chunks: return 'out_of_range'
return 'ok'前端呈現
把編號做成可點擊的標記,點開顯示原文片段與來源文件連結。使用者能自己驗證,信任度會明顯不同——而且他們回報錯誤時能直接指出是哪一段。
把
no_citation 與 mismatch 的比例做成監控圖表。這兩個數字上升,通常代表檢索品質下滑,比等使用者抱怨早得多。