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

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

我們在上一篇看到了以準確的分數來評估提示訊息的方式,也學習到了自動化評估的方法,本篇則專注在只能模糊評估的訊息,它的驗證方式。
我們先來看什麼是只能模糊評估的訊息,以下是我們取得回覆訊息的程式碼跟回覆內容:
customer_msg = f"""
可以幫我介紹關於 smartX ProPhone 手機和 fotosnap 單眼相機的資訊嗎?"""
products_by_category = utils.get_products_from_query(customer_msg)
category_and_product_list = utils.read_string_to_list(products_by_category)
product_info = utils.get_mentioned_product_info(category_and_product_list)
# 取得助理回覆
assistant_answer = utils.answer_user_msg(user_msg=customer_msg,
    product_info=product_info)
--- 以下是回覆內容 ---
>> 當然可以!我們有兩款產品可以介紹給您。
首先是 SmartX ProPhone 手機。這款手機具有6.1吋的顯示器和128GB的儲存空間,
讓您可以盡情儲存您的照片和影片。它還搭載了12MP的雙鏡頭,
讓您拍攝出更清晰和生動的照片。此外,它還支援5G網路,
讓您可以享受更快速的網路連接。SmartX ProPhone 手機的價格為899.99元,
並且附帶一年的保固。
另一款產品是 Fotosnap 單眼相機。這款相機具有24.2MP的感光元件,
可以捕捉出高品質的照片。它還支援1080p的影片拍攝,讓您可以錄製出清晰的視頻。
相機配備了一個3吋的LCD螢幕,方便您即時檢視拍攝的照片和影片。
此外,它還支援可更換鏡頭的功能,讓您可以根據不同的拍攝需求進行調整。
Fotosnap 單眼相機的價格為599.99元,同樣附帶一年的保固。
請問您對這兩款產品有任何進一步的問題嗎?
這類訊息的第一個評估方式是採用類似 Rubic 評分準則的方式,來將回覆訊息以我們判斷的重要評估面向來做驗證。
什麼是 Rubic 評分準則?

Rubic 評分準則是一種評價工具,用來確定特定任務或技能的效能或品質。評分標準分為多個等級,每個等級都有其相對應的分數範圍,並描述出達到該等級所需要的特定行為或表現。評分標準讓評分更加公平和透明,因為所有人都能明確地知道如何獲得不同的分數。

例如,如果我們要用評分標準來給小學生的書報告打分數,我們可能會設立以下幾個等級:

內容完整:包含報告的主題、主要觀點,以及你對主題的看法。優(10分):所有內容都包含並詳細解釋。
良好(7分):大部分內容都包含並有基本解釋。
普通(4分):只包含部分內容,或者沒有足夠的解釋。
不佳(0分):幾乎沒有包含需要的內容。

文字表達:句子的流暢性,以及是否使用了有趣的詞彙或句子結構。優(10分):句子流暢,且使用了豐富有趣的語言。
良好(7分):句子基本流暢,有時候使用了有趣的語言。
普通(4分):句子稍微生硬,或語言用詞簡單。
不佳(0分):句子難以理解,或語言用詞過於簡單。

拼字和語法:書寫是否正確,語法是否正確。優(10分):沒有拼字和語法錯誤。
良好(7分):有少數拼字或語法錯誤。
普通(4分):有多個拼字或語法錯誤。
不佳(0分):有大量拼字或語法錯誤。

所以,如果一個學生的報告在內容上獲得7分,在文字表達上獲得10分,並在拼字和語法上獲得4分,那他的總分就是7+10+4=21分。這種評分方式對於學生和老師都很清楚,學生可以知道他們哪裡做得好,哪裡還需要改進。
評估的提示訊息如下:
def eval_with_rubric(test_set, assistant_answer):
    cust_msg = test_set['customer_msg']
    context = test_set['context']
    completion = assistant_answer
    system_message = """\
    你是一個助理,透過檢視客服人員用來產生其回應的上下文, \
    評估客服人員回答使用者問題的表現。
    """
    user_message = f"""\
    你正在根據代理人用來回答問題的上下文,對提交的答案進行評估。
    以下是數據:
    [數據開始]
    ************
    [問題]: {cust_msg}
    ************
    [上下文]: {context}
    ************
    [提交的答案]: {completion}
    ************
    [數據結束]
    比較提交答案的事實內容與上下文,忽略風格、文法或標點符號的任何差異。
    回答以下問題(請記住你的答案,但是不要輸出):
    - 助理的回答僅基於所提供的上下文嗎?(是或否)
    - 答案是否包含上下文中未提供的資訊?(是或否)
    - 回應與上下文之間是否有任何不符?(是或否)
    - 計算使用者問了多少個問題。(輸出一個數字)
    - 對於使用者提出的每個問題,是否有相對應的答案?
    - 在問的問題數中,有多少個問題得到了答案的回應?(只要輸出一個數字)
    請將你以上各問題的答案,以以下格式輸出:
    問題1:(是或否)
    問題2:(是或否)
    ...
    問題N:(是或否)
    """
    messages = [
    {'role': 'system', 'content': system_message},
    {'role': 'user', 'content': user_message}
    ]
    response = get_completion_from_messages(messages)
    return response
以下是實際評估時得到的回應狀況:
cust_prod_info = {
    'customer_msg': customer_msg,
    'context': product_info
}
evaluation_output = eval_with_rubric(cust_prod_info, assistant_answer)
print(evaluation_output)
--- 以下是回應的內容 ---
>> 問題1:是
問題2:是
問題3:是
問題4:1
問題5:是
問題6:1
第二個評估方式,我們將會先提供專家的回應內容,然後將專家回覆與真實的回覆做個比較,評估的提示訊息如下:
def eval_vs_ideal(test_set, assistant_answer):
    cust_msg = test_set['customer_msg']
    ideal = test_set['ideal_answer']
    completion = assistant_answer
    system_message = """\
    你是一個評分的助手,請透過實際回答與專家回答的內容比較來做評估。\
    評估結果你只能回答一個字母。
    """
    user_message= f"""\
    你正在針對原始問題來做實際回答以及專家回答間的差異評分,並且依照評分邏輯做為判斷邏輯。
    [評分資料開始]
    ************
    [原始問題]: {cust_msg}
    ************
    [專家回答]: {ideal}
    ************
    [實際回答]: {completion}
    ************
    [評分邏輯]:
    1. 將實際回答內容與專家的回答內容進行比較,忽略風格、語法、順序或標點的差異。
    2. 如果兩者回覆的內容,只是表達方式和詳細程度不同,請當作相同的回答。
    3. 實際回答可能是專家回答的子集或超集,或者可能與專家回答有衝突。
    ************
    [評分資料結束]
    請你確定下方哪種情況適用,並且只回覆 ABCDE 中的一個字元:
    (A) 實際回答是專家回答的子集。
    (B) 實際回答是專家回答的超集。
    (C) 實際回答和專家答案之間有不同意見。
    (D) 實際回答和專家答案相同
    (E) 答案有所不同,但從實際性的角度看,這些差異並不重要。
    """
    #print(f'user_msg: {user_message}')
    messages = [
        {'role': 'system', 'content': system_message},
        {'role': 'user', 'content': user_message}
    ]
    response = get_completion_from_messages(messages)
    return response
下面則是專家內容跟實際的回覆內容:
test_set_ideal = {
    'customer_msg': """ \
    可以幫我介紹關於 smartX ProPhone 手機和 fotosnap 單眼相機的資訊嗎?""",
    'ideal_answer':""" \
    當然可以!SmartX ProPhone 是一款功能強大的智慧型手機,具有先進的相機功能。 \
    例如,它擁有一個 1200 萬像素的雙鏡頭、5G 無線和 128GB 的儲存空間。 \
    它還有一個 6.1 吋的顯示器。價格是 $899.99。
    FotoSnap 數位單眼相機非常適合捕捉令人驚嘆的照片和影片。 \
    一些功能包括 1080p 的影片,3 吋液晶螢幕,2420 萬像素的感光元件,
    以及可更換鏡頭。價格是 $599.99。
    你對這些產品有什麼其他的問題嗎?
    或者有其他我可以幫你解答的問題嗎?
"""
}
實際的回覆內容如下:
print(assistant_answer)
--- 回覆內容 ---
>> 當然可以!我們有兩款產品可以介紹給您。
首先是 SmartX ProPhone 手機。這款手機具有6.1吋的顯示器和128GB的儲存空間,
讓您可以盡情儲存您的照片和影片。它還搭載了12MP的雙鏡頭,讓您拍攝出更清晰和
生動的照片。此外,它還支援5G網路,讓您可以享受更快速的網路連接。
SmartX ProPhone 手機的價格為899.99元,並且附帶一年的保固。
另一款產品是 Fotosnap 單眼相機。這款相機具有24.2MP的感光元件,
可以捕捉出高品質的照片。它還支援1080p的影片拍攝,讓您可以錄製出清晰的視頻。
相機配備了一個3吋的LCD螢幕,方便您即時檢視拍攝的照片和影片。
此外,它還支援可更換鏡頭的功能,讓您可以根據不同的拍攝需求進行調整。
Fotosnap 單眼相機的價格為599.99元,同樣附帶一年的保固。
請問您對這兩款產品有任何進一步的問題嗎?
將兩者做評估:
eval_vs_ideal(test_set_ideal, assistant_answer)
--- 回覆內容 ---
>> 'B'
大家可以看到,評估的分數是 B(實際回答是專家回答的超集。),
我們模擬的資料,的確真實回覆的訊息量比我們設定的專家回覆還要多,您可以再試試看幾個案例。
以上是我們這個系列的所有內容,相信大家到現在已經有足夠的知識,可以開始開發自己的對話系統(對話機器人)了,開工!
為什麼會看到廣告
Ted Chen
Ted Chen
一個近幾年專注於 語言教育 / 自然語言處理 / 大型語言模型應用 的 IT 人 https://www.facebook.com/Chen.Ching.Tai
留言0
查看全部
發表第一個留言支持創作者!