iT邦幫忙

2026 iThome 鐵人賽

DAY 21
0
AI Engineering

從零打造 RAG 系統:檢索、生成與落地全紀錄系列 第 21 篇

[Day 21] Prompt 設計:如何讓 LLM 善用檢索結果

  • 分享至 

  • xImage
  •  

[Day 21] Prompt 設計:如何讓 LLM 善用檢索結果
前言
前面 20 天我們把心力都放在「怎麼找到相關內容」,從今天開始要進入 Generation 階段:檢索到內容之後,該怎麼組裝 Prompt,才能讓 LLM 真正善用這些資料、產出高品質的回答。
一個常見的錯誤:只是把資料貼上去
很多人做 RAG 的第一版 Prompt,往往只是簡單地把檢索結果貼在問題前面:
{檢索到的內容}

問題:{使用者問題}
​
這樣做能動,但效果通常不夠好,因為沒有明確告訴模型「該怎麼使用這些資料」。
一個更完整的 RAG Prompt 結構
System:
你是一個專業的技術問答助手。請嚴格根據下方提供的「參考資料」回答使用者的問題。

規則:

  1. 只根據參考資料中的內容回答,不要使用參考資料以外的知識。
  2. 如果參考資料中找不到答案,請明確告知使用者「目前查無相關資訊」,不要編造答案。
  3. 回答時請標註是根據哪一段參考資料(例如:[來源1])。
  4. 如果多筆參考資料有衝突,請指出衝突,不要自行選擇其中一個當作標準答案。

參考資料:
[來源1] {chunk 1 內容}
[來源2] {chunk 2 內容}
[來源3] {chunk 3 內容}

使用者問題:{question}
​
這幾條規則分別對應到不同的目的:

  • 規則 1:限制模型只用檢索到的資料,減少幻覺

  • 規則 2:處理「查無資料」的情況,避免模型硬凹答案

  • 規則 3:讓回答可追溯、可驗證

  • 規則 4:處理知識庫中可能存在的過時或矛盾資訊
    實作範例
    def build_rag_prompt(question, retrieved_chunks):
    sources_text = "\n".join(
    f"[來源{i+1}]{chunk['content']}"
    for i, chunk in enumerate(retrieved_chunks)
    )

    system_prompt = """你是一個專業的技術問答助手。請嚴格根據下方提供的「參考資料」回答使用者的問題。

規則:

  1. 只根據參考資料中的內容回答,不要使用參考資料以外的知識。

  2. 如果參考資料中找不到答案,請明確告知使用者「目前查無相關資訊」,不要編造答案。

  3. 回答時請標註是根據哪一段參考資料(例如:[來源1])。"""

    user_prompt = f"""參考資料:
    {sources_text}

使用者問題:{question}"""

return system_prompt, user_prompt

​
檢索結果的排列順序也有影響
研究與實務經驗都指出,LLM 對 Prompt 中「開頭」與「結尾」的內容注意力較高,中間的內容容易被忽略(這個現象常被稱為 “Lost in the Middle”)。因此:
如果檢索結果有明確的相關度排序(例如經過 Day 17 的 Rerank),建議把最相關的內容放在最前面或最後面,而不是隨意排列
避免塞入過多不必要的候選結果,寧可精簡也不要求全
小結
Prompt 設計是 Generation 階段的第一步,核心原則是「明確告訴模型規則、限制它只根據提供的資料回答、處理查無資料的情況」。這些規則能大幅降低幻覺發生的機率。明天我們要來看即使 Prompt 設計得再好,生成階段仍然可能遇到的常見問題。


上一篇
[Day 20] 處理長文件與多文件交叉引用
下一篇
[Day 22] 生成階段常見問題:幻覺、答非所問、引用錯誤
系列文
從零打造 RAG 系統:檢索、生成與落地全紀錄 共 23 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言