使用 ChatGPT API 建立對話系統 學習筆記 - 4

更新於 2023/07/21閱讀時間約 21 分鐘
這一系列文章其實就是 Andrew Ng 大大與 OpenAI 合作的一門免費課程【Building Systems with the ChatGPT API】的筆記。很建議大家直接看原本的課程影片,內容蠻淺顯易懂的。

在上一篇文章中,我們探討了如何將大型語言模型與我們的外部程式以及資源做整合,進而生成回應訊息。接下來我們通常會對生成的訊息進行做合適性的確認以及是否是合理的回覆的評估。

輸出內容的合適性確認

輸出內容的合適性確認方式,我們仍然選擇使用 OpenAI 的 Moderation API,使用方法如下:
# 這個訊息就是上個章節最後語言模型分成的回覆訊息
final_response_to_customer = f"""
以上是我們店裡的 SmartX Pro 手機和 FotoSnap 單眼相機的資訊。
SmartX Pro 手機擁有6.1吋顯示器、128GB 儲存空間、12MP 雙鏡頭和5G 網路等功能。
FotoSnap 單眼相機則擁有24.2MP 感光元件、1080p 影片、
3 吋 LCD 和可更換鏡頭等功能。
此外,我們店裡還有多款電視產品可供選擇。
CineView 4K 液晶電視擁有55吋顯示器、4K 解析度、HDR 和智慧電視等功能。
CineView 8K 液晶電視則擁有65吋顯示器、8K 解析度、HDR 和智慧電視等功能。
CineView OLED 電視則擁有55吋顯示器、4K 解析度、HDR 和智慧電視等功能。
此外,我們還有 SoundMax 家庭劇院和 SoundMax 音箱等產品,
可以升級您的電視聲光效果。
如果您對這些產品有任何問題或需要更多資訊,請隨時向我們詢問。
"""
response = openai.Moderation.create(
    input=final_response_to_customer
)
moderation_output = response["results"][0]
print(moderation_output)
--- 以下是 api 回覆的內容,通常只需要注意 flagged 是否為 true ---
>> {
   "categories": {
     "harassment": false,
     "harassment/threatening": false,
     "hate": false,
     "hate/threatening": false,
     "self-harm": false,
     "self-harm/instructions": false,
     "self-harm/intent": false,
     "sexual": false,
     "sexual/minors": false,
     "violence": false,
     "violence/graphic": false
   },
   "category_scores": {
     "harassment": 8.845762e-09,
     "harassment/threatening": 2.1843086e-08,
     "hate": 1.0149355e-09,
     "hate/threatening": 6.4688717e-09,
     "self-harm": 2.2744202e-09,
     "self-harm/instructions": 4.1273363e-09,
     "self-harm/intent": 1.8380901e-10,
     "sexual": 1.2166727e-06,
     "sexual/minors": 1.5611114e-08,
     "violence": 1.6215482e-07,
     "violence/graphic": 1.8128114e-08
   },
   "flagged": false
 }

是否解答了使用者詢問的評估

另一個不可忽視的評估環節是判斷回覆的訊息是否真正解答了使用者的疑問。對此,我們將採用一項全新的提示來進行檢視,其具體內容如下:
system_message = f"""
您是一位助理,主要負責評估客戶服務代表的回答是否足夠滿足客戶的問題, \
並且也驗證所有助理引用的產品資訊是否正確。 \
產品資訊以及用戶與客戶服務代表的訊息將以3個反引號(即```)進行區隔。 \
只需用Y或N字母來回應,不需要任何標點符號: \
如果輸出充分地回答了問題,並且回應正確地使用了產品資訊,則回答「Y」; \
否則,則回答「N」。
只輸出單一字母。
"""
customer_message = f"""
告訴我有關SmartX ProPhone和FotoSnap相機的資訊,
就是那款數位單眼相機的。另外也告訴我你們的電視有哪些。
"""
product_information = """
{
     "SmartX ProPhone": {
         "name": "SmartX ProPhone",
         "category": "手機和配件",
         "brand": "SmartX",
         "model_number": "SX-PP10",
         "warranty": "一年",
         "rating": 4.6,
         "features": ["6.1 吋顯示器", "128GB 儲存空間", "12MP 雙鏡頭", "5G 網路"],
         "description": "一款功能強大並具有先進照相功能的智慧手機",
         "price": 899.99
      },
      ... 中間省略 ...
      "FotoSnap 拍立得相機": {
         "name": "FotoSnap 拍立得相機",
         "category": "相機和攝影機",
         "brand": "FotoSnap",
         "model_number": "FS-IC10",
         "warranty": "一年",
         "rating": 4.1,
         "features": ["立即列印", "內建閃光燈", "自拍鏡", "可攜式電池"],
         "description": "用這款有趣和便攜的拍立得相機創造即時回憶。",
         "price": 69.99
     }
}
"""
q_a_pair = f"""
客戶訊息:{customer_message}
產品資訊:{product_information}
客服回覆:{final_response_to_customer}
回覆是否正確地使用了查詢到的資訊?
回覆是否足夠地回答了問題?
輸出 Y 或 N
"""
messages = [
     {'role': 'system', 'content': system_message},
     {'role': 'user', 'content': q_a_pair}
]
response = get_completion_from_messages(messages, max_tokens=1)
print(response)
--- 回覆的訊息 ---
>> Y

整體流程的匯整

最後,我們將所有我們在先前文章中所學習到的ChatGPT應用實作結構集結一起,將所有步驟整合在同一流程,讓所有的過程一目了然。
# 這個程序總和了之前幾個課程中的所有步驟,讓大家可以看到整個 ChatGPT 應用的完整流程
def process_user_message(user_input, all_messages, debug=True):
     delimiter = "```"
     
     # 步驟 1:使用 Moderation API 來檢查輸入是否違反正常使用規則
     response = openai.Moderation.create(input=user_input)
     moderation_output = response["results"][0]
     
     if moderation_output["flagged"]:
         print("步驟 1: 輸入被 Moderation API 檢查出有問題。")
         return "很抱歉, 我們無法處理這訊息"
     if debug: print("步驟 1: 通過訊息適用度檢查。")
      		
     # 步驟 2-1:從使用者的訊息中提取產品類別和產品名稱
     category_and_product_response = utils.find_category_and_product_only(user_input, utils.get_products_and_category())
     #print(f"category_and_product_response: {category_and_product_response}")
      
     # 步驟 2-2:將使用者詢問的產品轉換為產品列表
     category_and_product_list = utils.read_string_to_list(category_and_product_response)
     #print(f"category_and_product_list: {category_and_product_list}")
      
     if debug: print("步驟 2: 提取產品列表。")
      
     # 步驟 3:如果找到產品,則查找它們
     product_information = utils.generate_output_string(category_and_product_list)
     
     if debug:
         print(f"步驟 3: 查詢產品資訊。")
         #print(f"product_information: {product_information}")
      
     # 步驟 4:回答使用者問題
     system_message = f"""
     你是一家大型電子商店的客服助理。\
     以友好和樂於助人的口吻回答,並提供簡潔的答案。\
     請確保向使用者提出相關的後續問題。"""
     messages = [
         {'role': 'system', 'content': system_message},
         {'role': 'user', 'content': f"{delimiter}{user_input}{delimiter}"},
         {'role': 'assistant', 'content': f"Relevant product information:\n{product_information}"}
     ]
      
     final_response = get_completion_from_messages(all_messages + messages)
     if debug:print(f"步驟 4: 生成回應。")
     all_messages = all_messages + messages[1:]
      
     # 步驟 5:將回應再次傳送給 Moderation API 做適用度檢查
     response = openai.Moderation.create(input=final_response)
     moderation_output = response["results"][0]
      
     if moderation_output["flagged"]:
         if debug: print("步驟 5: 回應被 Moderation API 檢查出有問題。")
         return "很抱歉, 我們無法提供這訊息"
      
     if debug: print("步驟 5: 回應通過適用度檢查。")
      
     # 步驟 6:詢問模型回應是否足以回答使用者的問題
     user_message = f"""
     Customer message: {delimiter}{user_input}{delimiter}
     Agent response: {delimiter}{final_response}{delimiter}
     
     是否回應足以回答使用者的問題? (Y/N)
     """
     messages = [
         {'role': 'system', 'content': system_message},
         {'role': 'user', 'content': user_message}
     ]
     evaluation_response = get_completion_from_messages(messages)
      
     if debug:
         print(f"步驟 6: 模型完成回應的評估。")
         #print(f"evaluation_response: {evaluation_response}")
      
     # 步驟 7:如果是(通過評估),則使用此回答;如果不是(無法通過評估),則說將使用者連接到人員
     if "Y" in evaluation_response:   # 使用 "in" 而不是 "==" 來更安全地處理模型輸出變化(例如,"Y." 或 "Yes")
         if debug: print("步驟 7: 模型通過回應的評估。")
         return final_response, all_messages
     else:
         if debug:
             print(f"步驟 7: 模型未通過回應的評估。")
             #print(f"user_input: {user_input}, final_response: {final_response}\n")
         neg_str = "很抱歉, 我們無法提供這訊息,我們將會將您轉接到服務人員。"
         return neg_str, all_messages
 user_input = """
 告訴我有關SmartX ProPhone和FotoSnap相機的資訊,
 就是那款數位單眼相機的。另外也告訴我你們的電視有哪些。
 """
 response,_ = process_user_message(user_input,[])
 print(response)
透過上述流程,我們可以鮮明地掌握每個內部處理步驟,以及最終產出的回覆訊息:
步驟 1: 通過訊息適用度檢查。
步驟 2: 提取產品列表。
步驟 3: 查詢產品資訊。
步驟 4: 生成回應。
步驟 5: 回應通過適用度檢查。
步驟 6: 模型完成回應的評估。
步驟 7: 模型通過回應的評估。
關於SmartX ProPhone和FotoSnap相機的資訊如下:
SmartX ProPhone是一款功能強大並具有先進照相功能的智慧手機。它擁有6.1吋顯示器、128GB儲存空間、12MP雙鏡頭和5G網路。價格為899.99美元。
FotoSnap相機是一款多功能的單眼相機,具有24.2MP感光元件、1080p影片、3吋LCD和可更換鏡頭。價格為599.99美元。
我們的電視產品包括CineView 4K液晶電視、CineView 8K液晶電視和CineView OLED電視。CineView 4K液晶電視擁有55吋顯示器、4K解析度、HDR和智慧電視功能,價格為599.99美元。CineView 8K液晶電視擁有65吋顯示器、8K解析度、HDR和智慧電視功能,價格為2999.99美元。CineView OLED電視擁有55吋顯示器、4K解析度、HDR和智慧電視功能,價格為1499.99美元。
請問您對這些產品有任何特定的問題嗎?
這就是我們的ChatGPT應用程式處理訊息的整體輪廓,除此之外,我們還將說明更多有關回應訊息評估的細節。我們將在這個系列的下一篇文章中與大家分享。

完整程式碼連結

最後,本篇文章的完整程式碼您可以參考以下連結,
為什麼會看到廣告
avatar-img
18會員
19內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Ted Chen的沙龍 的其他內容
本文詳述如何將大型語言模型(LLM)與程式碼深度整合,運用於3C賣場的客服助理示例,透過接收並解析使用者訊息,提取產品資訊,並與後端產品資料庫整合。接著,將整合資訊回傳給LLM生成最終回應訊息。同時,也探討了中英文理解差距及解決方法,並展示如何利用Python模擬資料庫提取詳細資訊。
這篇文章詳細說明了「思考鏈」的概念以及如何應用在設計語言模型客服助理的過程中。使用分隔號和角括弧以設定步驟、區隔訊息和提供填充空間,這種方式可使語言模型更有效地處理和回應使用者的諮詢,包括在產品清單中找不到的諮詢。
這堂課闡述開發ChatGPT所需的重要概念和工具。涵蓋語言模型如何處理文字(Token),LLM的兩種類型(Base LLM和Instruction tuned LLM),系統、助手和用戶的角色定義。並介紹以Prompting簡化AI開發流程,且透過實戰教學說明如何進行分類和預防注入提示
本文探討大資料對模型的影響。研究指出,大資料量對模型的語法和世界知識理解有顯著影響。固定運算資源下,DeepMind發現適應參數數量更重要,這使模型Chinchilla以較小規模但更多訓練資料,在實際任務中優於Gopher模型。這說明增大模型的規模已不具有太大意義,應增加訓練資料。
本文探討了大型語言模型中的特殊現象,包括頓悟現象,大模型的隱藏知識引導,以及模型越大對某些問題的理解越偏離的U型曲線。文章強調,當模型不夠理想時,我們需要更好地引導模型或了解問題的本質,而非只是增加模型的大小。
本文探討大型語言模型的兩種主要類型:GPT和BERT。GPT,如ChatGPT,被視為"通才",能執行多種任務。BERT則被視為"專才"的基本語言模型。兩者各有優點:專才模型在特定任務上準確度高,而通才模型靈活多功能。選擇哪種取決於需求和目標。
本文詳述如何將大型語言模型(LLM)與程式碼深度整合,運用於3C賣場的客服助理示例,透過接收並解析使用者訊息,提取產品資訊,並與後端產品資料庫整合。接著,將整合資訊回傳給LLM生成最終回應訊息。同時,也探討了中英文理解差距及解決方法,並展示如何利用Python模擬資料庫提取詳細資訊。
這篇文章詳細說明了「思考鏈」的概念以及如何應用在設計語言模型客服助理的過程中。使用分隔號和角括弧以設定步驟、區隔訊息和提供填充空間,這種方式可使語言模型更有效地處理和回應使用者的諮詢,包括在產品清單中找不到的諮詢。
這堂課闡述開發ChatGPT所需的重要概念和工具。涵蓋語言模型如何處理文字(Token),LLM的兩種類型(Base LLM和Instruction tuned LLM),系統、助手和用戶的角色定義。並介紹以Prompting簡化AI開發流程,且透過實戰教學說明如何進行分類和預防注入提示
本文探討大資料對模型的影響。研究指出,大資料量對模型的語法和世界知識理解有顯著影響。固定運算資源下,DeepMind發現適應參數數量更重要,這使模型Chinchilla以較小規模但更多訓練資料,在實際任務中優於Gopher模型。這說明增大模型的規模已不具有太大意義,應增加訓練資料。
本文探討了大型語言模型中的特殊現象,包括頓悟現象,大模型的隱藏知識引導,以及模型越大對某些問題的理解越偏離的U型曲線。文章強調,當模型不夠理想時,我們需要更好地引導模型或了解問題的本質,而非只是增加模型的大小。
本文探討大型語言模型的兩種主要類型:GPT和BERT。GPT,如ChatGPT,被視為"通才",能執行多種任務。BERT則被視為"專才"的基本語言模型。兩者各有優點:專才模型在特定任務上準確度高,而通才模型靈活多功能。選擇哪種取決於需求和目標。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
大家好,今天我精選了一系列服務,讓您可以免費使用廣受好評的神經網絡“ChatGPT 4”(而不是每月 20 美元),無需註冊、使用 VPN 和其他注意事項。 1.“ForeFront AI” ForeFront AI 是一項提供免費訪問“GPT-4”模型的服務。 要使用它,只需註冊,選擇模型“GPT
Thumbnail
自從 ChatGPT 發布以來,互聯網上充斥著關於如何使用 AI 或 ChatGPT 賺錢的文章和視頻。 最近,我決定自己嘗試使用 ChatGPT 賺錢,並成功賺到了我的第一筆 25 美元。 就在幾天前,我因在 ChatGPT 的幫助下寫有趣的笑話而又收到了 25 美元。 如果您有興趣使用 Chat
這篇教學文章將介紹如何使用 OpenAI 的 GPT-3 模型來建立一個簡單的聊天機器人。
Thumbnail
雖然從2022年底,到現在已經過了快半年的時間,但是去詢問身旁的朋友,還是有很多人只知道有Chathpt的存在,也知道它好像很厲害,但是沒用過的人還是大有人在。 雖然註冊Chatgpt,已經有太多人說過,但考量我之後很多的教學,也會需要用到,所以這個主題我會用手把手的方式,讓你學會該怎麼開始使用Ch
Thumbnail
那天腦動大開,於是來試試用chatGPT預估下一期樂透開獎號碼。 用數學邏輯訓練你的AI,我幫大家做這個實驗,用10組Data查看chatGPT預估數據的命中律是多少? 這項科技有什麼不能做的嗎?我的意思是,它都已經在國際象棋上打敗了人類,駕駛汽車,預告未來趨勢,現在它讓我們變得非常富有!(線上有一
Thumbnail
我自己是使用微軟的SQLIT軟體 這個軟體的操作上 沒有辦法直接用滑鼠點選或是拖拉的方式來看到你想看到的表格 都是要下指令的像是要看data.sqlite中的user這個table我就必須下 才能把table調閱出來看 那做為一個python三年工作經驗的工程師通常我不會直接在SQLIT軟體 裡面下
ChatGPT 可以幫你翻譯,我認為品質比 Google / DeepL / Microsoft 都更好。但每次能翻譯的字數有限,也沒有全頁翻譯的功能,對小說閱讀者基本上是無用的。但 ChatGPT API 發布之後,情況有巨大的改變。這篇文章將會介紹我現在閱讀日文小說的步驟以及範例。
Thumbnail
使用三步驟便能讓ChatGPT幫你創作小說,還能跨平台接力使用,不僅方便,又很輕鬆愉快。但對於敏感內容,或是字數太多的內容,ChatGPT便處理不來。使用ChatGPT與Midjourney時,偶爾會讓我感受到「腦子裡沒想法,工具再強也沒有用」 的挫折
Thumbnail
身為一個實在不太怕被AI搶飯碗的專業文案(我覺得它寫的成果對創意廣告文案來說,我直接寫出完稿,比設法詠唱問題更快,但企劃、論述、增長改短這些工作上面,我則已經在使用它來降低成本了),忽然很好奇我到底有哪些事情可以請它幫忙,哪些事情還是自己動手比較又快又好? 今天我就
Thumbnail
ChatGPT是一個可以幫助您利用自然語言處理和機器學習技術來開發、部署和維護聊天機器人的平台。它可以讓您使用自己的資料和模型,ChatGPT可以幫助你在部落格上賺取收入,讓您可以更輕鬆地寫出有價值的文章。 ChatGPT可以根據你給定的概念或主題,提供詞彙和提示,幫助你更快速地開發優秀的內容。此
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
大家好,今天我精選了一系列服務,讓您可以免費使用廣受好評的神經網絡“ChatGPT 4”(而不是每月 20 美元),無需註冊、使用 VPN 和其他注意事項。 1.“ForeFront AI” ForeFront AI 是一項提供免費訪問“GPT-4”模型的服務。 要使用它,只需註冊,選擇模型“GPT
Thumbnail
自從 ChatGPT 發布以來,互聯網上充斥著關於如何使用 AI 或 ChatGPT 賺錢的文章和視頻。 最近,我決定自己嘗試使用 ChatGPT 賺錢,並成功賺到了我的第一筆 25 美元。 就在幾天前,我因在 ChatGPT 的幫助下寫有趣的笑話而又收到了 25 美元。 如果您有興趣使用 Chat
這篇教學文章將介紹如何使用 OpenAI 的 GPT-3 模型來建立一個簡單的聊天機器人。
Thumbnail
雖然從2022年底,到現在已經過了快半年的時間,但是去詢問身旁的朋友,還是有很多人只知道有Chathpt的存在,也知道它好像很厲害,但是沒用過的人還是大有人在。 雖然註冊Chatgpt,已經有太多人說過,但考量我之後很多的教學,也會需要用到,所以這個主題我會用手把手的方式,讓你學會該怎麼開始使用Ch
Thumbnail
那天腦動大開,於是來試試用chatGPT預估下一期樂透開獎號碼。 用數學邏輯訓練你的AI,我幫大家做這個實驗,用10組Data查看chatGPT預估數據的命中律是多少? 這項科技有什麼不能做的嗎?我的意思是,它都已經在國際象棋上打敗了人類,駕駛汽車,預告未來趨勢,現在它讓我們變得非常富有!(線上有一
Thumbnail
我自己是使用微軟的SQLIT軟體 這個軟體的操作上 沒有辦法直接用滑鼠點選或是拖拉的方式來看到你想看到的表格 都是要下指令的像是要看data.sqlite中的user這個table我就必須下 才能把table調閱出來看 那做為一個python三年工作經驗的工程師通常我不會直接在SQLIT軟體 裡面下
ChatGPT 可以幫你翻譯,我認為品質比 Google / DeepL / Microsoft 都更好。但每次能翻譯的字數有限,也沒有全頁翻譯的功能,對小說閱讀者基本上是無用的。但 ChatGPT API 發布之後,情況有巨大的改變。這篇文章將會介紹我現在閱讀日文小說的步驟以及範例。
Thumbnail
使用三步驟便能讓ChatGPT幫你創作小說,還能跨平台接力使用,不僅方便,又很輕鬆愉快。但對於敏感內容,或是字數太多的內容,ChatGPT便處理不來。使用ChatGPT與Midjourney時,偶爾會讓我感受到「腦子裡沒想法,工具再強也沒有用」 的挫折
Thumbnail
身為一個實在不太怕被AI搶飯碗的專業文案(我覺得它寫的成果對創意廣告文案來說,我直接寫出完稿,比設法詠唱問題更快,但企劃、論述、增長改短這些工作上面,我則已經在使用它來降低成本了),忽然很好奇我到底有哪些事情可以請它幫忙,哪些事情還是自己動手比較又快又好? 今天我就
Thumbnail
ChatGPT是一個可以幫助您利用自然語言處理和機器學習技術來開發、部署和維護聊天機器人的平台。它可以讓您使用自己的資料和模型,ChatGPT可以幫助你在部落格上賺取收入,讓您可以更輕鬆地寫出有價值的文章。 ChatGPT可以根據你給定的概念或主題,提供詞彙和提示,幫助你更快速地開發優秀的內容。此