本日核心目標是在 Day 26 的基礎上,強化 RAG 系統的魯棒性 (Robustness)、安全性 (Safety) 和效能 (Performance)。
優化目標 | 核心技術 | 價值 |
---|---|---|
安全回答 | 閾值判斷 (best_distance > 1.0 ) |
避免回答知識庫範圍外的「未知問題」。 |
效能強化 | functools.lru_cache |
加速重複查詢,減少重複的 Embedding 計算。 |
回答控制 | Prompt 模板與長度限制 | 確保回答符合角色設定、語氣親切且不會超長。 |
本版本程式碼(Day 27 改良版)延續了 Day 26 的數據載入邏輯,並對 chatbot_reply
函數進行了關鍵的優化。
為了避免每次使用者輸入時都重新計算 Embedding 和執行索引搜索,我們在 retrieve_from_db
函數上使用了 @lru_cache
裝飾器。
# 使用 LRU cache 儲存重複查詢結果,maxsize=100
@lru_cache(maxsize=100)
def retrieve_from_db(query):
# ... 執行 Embedding 和 FAISS/NN 搜索 ...
return results
優勢:當使用者重複詢問相同的問題時,RAG 系統可以直接從快取中獲取結果,顯著加快響應速度。
在 chatbot_reply
函數中,我引入了 相似度距離閾值 (best_distance > 1.0
),這是防止 RAG 系統「胡亂猜測」的關鍵機制。
# ===== 檢查距離(越小越相似) =====
best_distance = results[0]["distance"]
if best_distance > 1.0: # 閾值判斷:距離過大,視為不相關
return "抱歉,資料庫中沒有相關資訊。"
優勢:有效控制了系統的邊界,強制 Chatbot 在知識庫不足時拒絕回答,而不是生成不準確的內容。
雖然此版本的回覆仍直接輸出 FAQ 答案,但我們在輸出中加入了 SYSTEM_PROMPT
作為提示工程 (Prompt Engineering) 的示範,並限制了最終回答的長度。
SYSTEM_PROMPT = (
"你是一個『google常見問題FAQ客服助理』,只能根據知識庫回答問題。\n"
# ... 限制規則 ...
)
# ...
answer = (
f"{SYSTEM_PROMPT}\n\n"
# ... 輸出結果 ...
)
# 限制輸出長度
if len(answer) > 400:
answer = answer[:400] + "..."
本版本繼續使用 gr.ChatInterface
,提供了清晰的對話泡泡介面,並新增了多個 examples
示範,包含已知問題和預期會被拒絕的未知問題,以便測試系統的邊界控制邏輯。