[Day 21] Prompt 設計:如何讓 LLM 善用檢索結果
前言
前面 20 天我們把心力都放在「怎麼找到相關內容」,從今天開始要進入 Generation 階段:檢索到內容之後,該怎麼組裝 Prompt,才能讓 LLM 真正善用這些資料、產出高品質的回答。
一個常見的錯誤:只是把資料貼上去
很多人做 RAG 的第一版 Prompt,往往只是簡單地把檢索結果貼在問題前面:
{檢索到的內容}
問題:{使用者問題}
這樣做能動,但效果通常不夠好,因為沒有明確告訴模型「該怎麼使用這些資料」。
一個更完整的 RAG Prompt 結構
System:
你是一個專業的技術問答助手。請嚴格根據下方提供的「參考資料」回答使用者的問題。
規則:
參考資料:
[來源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])。"""
user_prompt = f"""參考資料:
{sources_text}
使用者問題:{question}"""
return system_prompt, user_prompt
檢索結果的排列順序也有影響
研究與實務經驗都指出,LLM 對 Prompt 中「開頭」與「結尾」的內容注意力較高,中間的內容容易被忽略(這個現象常被稱為 “Lost in the Middle”)。因此:
如果檢索結果有明確的相關度排序(例如經過 Day 17 的 Rerank),建議把最相關的內容放在最前面或最後面,而不是隨意排列
避免塞入過多不必要的候選結果,寧可精簡也不要求全
小結
Prompt 設計是 Generation 階段的第一步,核心原則是「明確告訴模型規則、限制它只根據提供的資料回答、處理查無資料的情況」。這些規則能大幅降低幻覺發生的機率。明天我們要來看即使 Prompt 設計得再好,生成階段仍然可能遇到的常見問題。