結構化數據整合與上下文處理:提升 AI 生成 Quick Replies 的準確性

Published February 10, 2025 by 徐培鈞
Python

在 AI 聊天機器人的應用中,能夠快速且準確地生成 建議回覆(Quick Replies) 是提升用戶體驗的重要關鍵。

然而,AI 模型的輸出品質取決於輸入的數據,若缺乏適當的上下文資訊,回覆可能會顯得過於籠統,甚至無法滿足用戶需求。

因此,我們需要整合 結構化數據,並在 AI 請求時動態注入 多維度上下文,讓 AI 更智慧地理解用戶意圖,生成更精準的回覆。

本篇文章將深入探討 如何整合對話歷史(chat_history)、常見問題(FAQ)、產品清單(product_list)等數據來源,並在 OpenAI API 請求中合理運用這些資訊,使 Quick Replies 具備更強的上下文感知能力。


為什麼需要結構化數據與上下文?

Quick Replies 的核心挑戰

在設計 AI 生成的建議回覆時,開發者通常會面臨以下問題:

  1. 回覆與上下文脫節:AI 可能無法正確理解當前對話的背景,導致回覆內容過於通用或不相關。
  2. 缺乏個性化與準確性:如果不考慮用戶過往的對話歷史或產品資訊,AI 可能會給出不適當的建議,影響使用者體驗。
  3. 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:

  1. system(設定 AI 角色)
  2. user(使用者的輸入)
  3. assistant(AI 之前的回覆)
  4. 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 則對話
  • userassistant 的對話 逐一加入 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 只有一條對話,所以只加一組 userassistant):

[
    {
        "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 更穩定可靠。