iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0
佛心分享-IT 人自學之術

LLM入門學習系列 第 28

Day 28:系統優化與安全回答邏輯實作

  • 分享至 

  • xImage
  •  

Day 28 報告:RAG 系統優化與安全回答邏輯實作

一、優化目標與系統架構進化

本日核心目標是在 Day 26 的基礎上,強化 RAG 系統的魯棒性 (Robustness)安全性 (Safety)效能 (Performance)

優化目標 核心技術 價值
安全回答 閾值判斷 (best_distance > 1.0) 避免回答知識庫範圍外的「未知問題」。
效能強化 functools.lru_cache 加速重複查詢,減少重複的 Embedding 計算。
回答控制 Prompt 模板與長度限制 確保回答符合角色設定、語氣親切且不會超長。

二、程式碼解析:優化邏輯與安全機制

本版本程式碼(Day 27 改良版)延續了 Day 26 的數據載入邏輯,並對 chatbot_reply 函數進行了關鍵的優化。

(1) 效能強化:LRU 快取機制

為了避免每次使用者輸入時都重新計算 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 系統可以直接從快取中獲取結果,顯著加快響應速度。

(2) 安全機制:未知問題處理邏輯

chatbot_reply 函數中,我引入了 相似度距離閾值 (best_distance > 1.0),這是防止 RAG 系統「胡亂猜測」的關鍵機制。

# ===== 檢查距離(越小越相似) =====
best_distance = results[0]["distance"]

if best_distance > 1.0:  # 閾值判斷:距離過大,視為不相關
    return "抱歉,資料庫中沒有相關資訊。"

優勢:有效控制了系統的邊界,強制 Chatbot 在知識庫不足時拒絕回答,而不是生成不準確的內容。

(3) Prompt 模板與回答格式

雖然此版本的回覆仍直接輸出 FAQ 答案,但我們在輸出中加入了 SYSTEM_PROMPT 作為提示工程 (Prompt Engineering) 的示範,並限制了最終回答的長度。

SYSTEM_PROMPT = (
    "你是一個『google常見問題FAQ客服助理』,只能根據知識庫回答問題。\n"
    # ... 限制規則 ...
)
# ...
answer = (
    f"{SYSTEM_PROMPT}\n\n"
    # ... 輸出結果 ...
)
# 限制輸出長度
if len(answer) > 400:
    answer = answer[:400] + "..."

三、Gradio 介面與功能展示

本版本繼續使用 gr.ChatInterface,提供了清晰的對話泡泡介面,並新增了多個 examples 示範,包含已知問題預期會被拒絕的未知問題,以便測試系統的邊界控制邏輯。


上一篇
Day 27 升級報告:Gradio ChatInterface 應用與透明度優化
下一篇
Day 29:功能擴充與自動評估 — 完整實作版
系列文
LLM入門學習29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言