免費全文 RAG 檢索增強 實戰

給答案加上引用:可追溯的 RAG 怎麼實作

沒有引用的 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_citationmismatch 的比例做成監控圖表。這兩個數字上升,通常代表檢索品質下滑,比等使用者抱怨早得多。
下一步

這個主題還有更深入的實戰教程

VIP 專區收錄 50 篇進階內容:架構設計、生產環境取捨、成本與合規。 每週五新增 3 篇。

看訂閱方案 → 先逛逛 VIP 專區