本文為 聊天機器人-建議回復 系列文,第 8 篇:
- 如何用「建議回覆」提升 AI 客服體驗?讓對話更快更準確!
- 如何設計高效的快速回復 (Quick Replies) 功能?—— 完整指南
- 如何取得 OpenAI 的 API 金鑰:詳細步驟與完整指南
- 使用 Python-dotenv 管理環境變數:完整指南
- OpenAI 套件介紹(Python)—— 從安裝到實戰應用
- 設計高效 Prompt 工程:提升 AI 生成 Quick Replies 的準確性
- 實作 Quick Replies 生成函式:完整指南
- 結構化數據整合與上下文處理:提升 AI 生成 Quick Replies 的準確性 👈進度
- 生成回覆與異常處理:確保 AI 提供高效、可靠的建議回覆
- 自動化測試與效能監控:確保 Quick Replies 生成穩定可靠
- 優化策略與擴展應用:提升 AI 建議回覆(Quick Replies)的效能與適應性
在 AI 聊天機器人的應用中,能夠快速且準確地生成 建議回覆(Quick Replies) 是提升用戶體驗的重要關鍵。
然而,AI 模型的輸出品質取決於輸入的數據,若缺乏適當的上下文資訊,回覆可能會顯得過於籠統,甚至無法滿足用戶需求。
因此,我們需要整合 結構化數據,並在 AI 請求時動態注入 多維度上下文,讓 AI 更智慧地理解用戶意圖,生成更精準的回覆。
本篇文章將深入探討 如何整合對話歷史(chat_history)、常見問題(FAQ)、產品清單(product_list)等數據來源,並在 OpenAI API 請求中合理運用這些資訊,使 Quick Replies 具備更強的上下文感知能力。
為什麼需要結構化數據與上下文?
Quick Replies 的核心挑戰
在設計 AI 生成的建議回覆時,開發者通常會面臨以下問題:
- 回覆與上下文脫節:AI 可能無法正確理解當前對話的背景,導致回覆內容過於通用或不相關。
- 缺乏個性化與準確性:如果不考慮用戶過往的對話歷史或產品資訊,AI 可能會給出不適當的建議,影響使用者體驗。
- API 請求中的資訊過載或不足:傳遞過多無關數據會增加 API 成本,傳遞過少則會降低 AI 的回覆質量。
結構化數據如何幫助 AI?
透過整理與整合不同的數據來源,我們可以提供 AI 清晰的上下文,幫助它做出更符合用戶需求的回應。
常見的結構化數據來源包含:
- 對話歷史(chat_history):記錄用戶過去的提問與 AI 回覆,幫助 AI 理解當前對話的背景。
- 常見問題(FAQ):提供標準化的問題與回答,提高 AI 生成 Quick Replies 的準確性。
- 產品清單(product_list):包含商品名稱、描述、價格、庫存等資訊,幫助 AI 針對電商應用場景提供精準回覆。
數據來源解析:chat_history、FAQ、product_list
對話歷史(chat_history)
定義:用戶與 AI 之間的歷史對話記錄,包含使用者的問題與 AI 先前的回覆。
範例格式(JSON):
"chat_history": [
{"user": "請問這款耳機有降噪功能嗎?", "ai": "是的,這款耳機支援主動降噪(ANC)。"},
{"user": "那電池續航力如何?", "ai": "續航力可達 30 小時,並支援快充功能。"}
]
用途:
- 幫助 AI 理解對話上下文,避免重複回答已經解釋過的內容。
- 讓 AI 生成更符合對話邏輯的回覆,避免語意斷裂。
常見問題(FAQ)
定義:根據用戶常見疑問整理出的標準化問答集,幫助 AI 提供快速且準確的回應。
範例格式(JSON):
"faq_list": [
{"question": "如何查詢訂單狀態?", "answer": "您可以在「我的訂單」頁面查詢最新的訂單狀態。"},
{"question": "支援哪些付款方式?", "answer": "我們支援信用卡、Apple Pay、Google Pay 及銀行轉帳。"}
]
用途:
- 提供標準化回答,確保 AI 回覆的一致性與準確性。
- 減少 AI 需要即時推理的負擔,提高回覆效率。
產品清單(product_list)
定義:存放與產品相關的結構化數據,包括商品名稱、價格、庫存狀態等資訊。
範例格式(JSON):
"product_list": [
{"id": "P001", "name": "無線降噪耳機", "price": 3990, "stock": "有貨"},
{"id": "P002", "name": "智慧手錶", "price": 5990, "stock": "缺貨"}
]
用途:
- 幫助 AI 根據產品資訊提供即時回覆,例如價格、庫存狀態等。
- 提供更精準的 Quick Replies,例如「加入購物車」、「查看詳情」等操作建議。
如何在 API 請求中動態注入上下文?
在調用 OpenAI API 時,我們可以動態注入 對話歷史(chat_history)、FAQ(faq_list)、產品清單(product_list),確保 AI 擁有足夠的上下文資訊來生成 Quick Replies。
最佳化 API 調用範例
import openai
import json
# 設定 API Key
openai.api_key = "your-api-key"
# 準備數據
chat_history = [
{"user": "請問這款耳機有降噪功能嗎?", "ai": "是的,這款耳機支援主動降噪(ANC)。"},
{"user": "那電池續航力呢?", "ai": "續航力可達 30 小時,並支援快充功能。"},
{"user": "有支援無線充電嗎?", "ai": "這款耳機不支援無線充電,但有 Type-C 快充。"},
{"user": "音質表現如何?", "ai": "採用高解析音頻技術,提供優質音質。"},
{"user": "有藍牙 5.3 嗎?", "ai": "是的,支援藍牙 5.3,連線穩定。"},
{"user": "這款耳機防水嗎?", "ai": "具備 IPX4 防水等級,可應對日常汗水與小雨。"}
]
faq_list = [
{"question": "如何查詢訂單狀態?", "answer": "您可以在「我的訂單」頁面查詢最新的訂單狀態。"}
]
product_list = [
{"id": "P001", "name": "無線降噪耳機", "price": 3990, "stock": "有貨"}
]
# 建立 system 訊息,設定 AI 角色
system_message = {
"role": "system",
"content": "你是一個智慧客服 AI,請根據對話歷史、FAQ 和產品資訊提供 Quick Replies,"
"回應格式需為 JSON,包含 quick_replies 陣列。"
}
# 組合對話歷史
messages = [system_message]
# 添加對話歷史(最近 3~5 條,避免過長)
for entry in chat_history[-5:]:
messages.append({"role": "user", "content": entry["user"]})
messages.append({"role": "assistant", "content": entry["ai"]})
# 加入當前用戶問題
user_message = {
"role": "user",
"content": f"FAQ:{json.dumps(faq_list, ensure_ascii=False)}\n"
f"產品資訊:{json.dumps(product_list, ensure_ascii=False)}\n"
"請根據這些資訊提供 Quick Replies。"
}
messages.append(user_message)
# 調用 OpenAI API
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=messages
)
# 解析結果
print(response["choices"][0]["message"]["content"])
設定 API 金鑰
這一行用來設定你的 OpenAI API 金鑰,確保我們可以發送請求給 OpenAI:
openai.api_key = "your-api-key"👉 記得換成自己的 API Key!
準備數據
我們要準備 3 種資料,提供 AI 更多背景資訊:
🔹(1) chat_history(對話歷史)
讓 AI 知道用戶先前問過什麼問題,避免重複回答。
chat_history = [
{"user": "請問這款耳機有降噪功能嗎?", "ai": "是的,這款耳機支援主動降噪(ANC)。"},
{"user": "那電池續航力呢?", "ai": "續航力可達 30 小時,並支援快充功能。"},
{"user": "有支援無線充電嗎?", "ai": "這款耳機不支援無線充電,但有 Type-C 快充。"},
{"user": "音質表現如何?", "ai": "採用高解析音頻技術,提供優質音質。"},
{"user": "有藍牙 5.3 嗎?", "ai": "是的,支援藍牙 5.3,連線穩定。"},
{"user": "這款耳機防水嗎?", "ai": "具備 IPX4 防水等級,可應對日常汗水與小雨。"}
]
🔹(2) FAQ(常見問題)
讓 AI 能夠使用標準答案,提高準確性。
faq_list = [
{"question": "如何查詢訂單狀態?", "answer": "您可以在「我的訂單」頁面查詢最新的訂單狀態。"}
]
🔹(3) product_list(產品清單)
讓 AI 知道有哪些商品,確保回應符合產品資訊。
product_list = [
{"id": "P001", "name": "無線降噪耳機", "price": 3990, "stock": "有貨"}
]設定 system 訊息(讓 AI 扮演角色)
在 system 角色中,我們定義 AI 是一個「智慧客服助理」,並告訴它要提供 JSON 格式的 Quick Replies。
system_message = {
"role": "system",
"content": "你是一個智慧客服 AI,請根據對話歷史、FAQ 和產品資訊提供 Quick Replies,"
"回應格式需為 JSON,包含 quick_replies 陣列。"
}
構建 messages 陣列
messages 是一個 對話記錄列表,它告訴 AI:
- system(設定 AI 角色)
- user(使用者的輸入)
- assistant(AI 之前的回覆)
- user(最新的問題,讓 AI 生成 Quick Replies)
🔹(1) 先加入 system 訊息
messages = [system_message]
👉 這樣 AI 就知道自己的角色,不能亂回應。
🔹(2) 加入 chat_history(用戶過去對話)
我們只保留最近 5 則對話,避免 API 負擔過重。
for entry in chat_history[-5:]:
messages.append({"role": "user", "content": entry["user"]})
messages.append({"role": "assistant", "content": entry["ai"]})
📌 這段程式碼的意思:
chat_history[-5:]取最近 5 則對話- 把
user和assistant的對話 逐一加入messages
🔹(3) 加入最新的用戶問題
這時,我們讓使用者詢問新的問題,並 附上 FAQ 與產品資訊。
user_message = {
"role": "user",
"content": f"FAQ:{json.dumps(faq_list, ensure_ascii=False)}\n"
f"產品資訊:{json.dumps(product_list, ensure_ascii=False)}\n"
"請根據這些資訊提供 Quick Replies。"
}
messages.append(user_message)
📌 這段程式碼的意思:
- 用戶輸入新的問題
- AI 會看到 FAQ 和產品資訊,確保回應是 準確的
發送 API 請求
現在,我們使用 openai.ChatCompletion.create() 發送請求給 OpenAI。
response = openai.ChatCompletion.create(
model="gpt-4o",
messages=messages
)
📌 這裡的重點:
model="gpt-4o":使用 GPT-4o 模型(比 GPT-3.5 更強)。messages=messages:傳入我們剛剛整理好的 對話記錄。
解析 AI 回覆
最後,我們取出 AI 回應的 content,然後印出來。
print(response["choices"][0]["message"]["content"])📌 這段程式碼的意思:
response["choices"][0]["message"]["content"]:取得 AI 產生的 Quick Replies。print():把結果顯示在終端機上。
這樣 AI 會產生什麼回覆?
假設用戶現在問:「這款耳機有什麼功能?」
AI 可能會回應:
{
"quick_replies": [
"這款耳機支援主動降噪(ANC)",
"電池續航力可達 30 小時",
"點擊這裡查看詳細規格"
]
}
這樣的回應比單純的文字 更有結構性,可以直接在聊天機器人 UI 上顯示 按鈕選項,提升用戶體驗!
messages 組合過程
我們先假設 chat_history 只有一條紀錄,來看看 messages 會變成什麼樣子:
初始數據
chat_history = [
{"user": "請問這款耳機有降噪功能嗎?", "ai": "是的,這款耳機支援主動降噪(ANC)。"}
]
faq_list = [
{"question": "如何查詢訂單狀態?", "answer": "您可以在「我的訂單」頁面查詢最新的訂單狀態。"}
]
product_list = [
{"id": "P001", "name": "無線降噪耳機", "price": 3990, "stock": "有貨"}
]
messages 建立過程
1️⃣ system_message 進入 messages
messages = [system_message]📌 結果:
[
{
"role": "system",
"content": "你是一個智慧客服 AI,請根據對話歷史、FAQ 和產品資訊提供 Quick Replies,回應格式需為 JSON,包含 quick_replies 陣列。"
}
]
2️⃣ 加入 chat_history
這一段程式碼:
for entry in chat_history[-5:]:
messages.append({"role": "user", "content": entry["user"]})
messages.append({"role": "assistant", "content": entry["ai"]})
📌 結果(因為 chat_history 只有一條對話,所以只加一組 user 和 assistant):
[
{
"role": "system",
"content": "你是一個智慧客服 AI,請根據對話歷史、FAQ 和產品資訊提供 Quick Replies,回應格式需為 JSON,包含 quick_replies 陣列。"
},
{
"role": "user",
"content": "請問這款耳機有降噪功能嗎?"
},
{
"role": "assistant",
"content": "是的,這款耳機支援主動降噪(ANC)。"
}
]
3️⃣ user_message 進入 messages
這段程式碼:
user_message = {
"role": "user",
"content": f"FAQ:{json.dumps(faq_list, ensure_ascii=False)}\n"
f"產品資訊:{json.dumps(product_list, ensure_ascii=False)}\n"
"請根據這些資訊提供 Quick Replies。"
}
messages.append(user_message)
📌 結果(完整的 messages):
[
{
"role": "system",
"content": "你是一個智慧客服 AI,請根據對話歷史、FAQ 和產品資訊提供 Quick Replies,回應格式需為 JSON,包含 quick_replies 陣列。"
},
{
"role": "user",
"content": "請問這款耳機有降噪功能嗎?"
},
{
"role": "assistant",
"content": "是的,這款耳機支援主動降噪(ANC)。"
},
{
"role": "user",
"content": "FAQ:[{'question': '如何查詢訂單狀態?', 'answer': '您可以在「我的訂單」頁面查詢最新的訂單狀態。'}]\n"
"產品資訊:[{'id': 'P001', 'name': '無線降噪耳機', 'price': 3990, 'stock': '有貨'}]\n"
"請根據這些資訊提供 Quick Replies。"
}
]
如果 chat_history 變多,messages 會變得更長
假設 chat_history 變成:
chat_history = [
{"user": "這款耳機有降噪功能嗎?", "ai": "是的,這款耳機支援主動降噪(ANC)。"},
{"user": "那電池續航力呢?", "ai": "續航力可達 30 小時,並支援快充功能。"}
]
那 messages 會變成:
[
{
"role": "system",
"content": "你是一個智慧客服 AI,請根據對話歷史、FAQ 和產品資訊提供 Quick Replies,回應格式需為 JSON,包含 quick_replies 陣列。"
},
{
"role": "user",
"content": "這款耳機有降噪功能嗎?"
},
{
"role": "assistant",
"content": "是的,這款耳機支援主動降噪(ANC)。"
},
{
"role": "user",
"content": "那電池續航力呢?"
},
{
"role": "assistant",
"content": "續航力可達 30 小時,並支援快充功能。"
},
{
"role": "user",
"content": "FAQ:[{'question': '如何查詢訂單狀態?', 'answer': '您可以在「我的訂單」頁面查詢最新的訂單狀態。'}]\n"
"產品資訊:[{'id': 'P001', 'name': '無線降噪耳機', 'price': 3990, 'stock': '有貨'}]\n"
"請根據這些資訊提供 Quick Replies。"
}
]
這樣 AI 會知道:
- 用戶之前問了 降噪 和 電池續航力,不需要重複回答。
- 用戶現在的問題與 FAQ、產品資訊有關,所以可以產生更精準的建議回覆。
結論
透過整合 對話歷史、FAQ、產品清單 等結構化數據,我們可以讓 AI 生成更準確、個性化的 Quick Replies,提升聊天機器人的智能程度與用戶體驗。
在實作上,合理篩選並動態注入上下文資訊,是確保 AI 回覆品質的關鍵。
下一步,我們將進一步探討 如何解析 OpenAI 回應並處理異常狀況,讓 AI 生成的 Quick Replies 更穩定可靠。