在【Day - 18】時,我們面臨了GPT-4模型速度過慢的問題,目前唯一的解決方案似乎是改用GPT-3.5模型。然而,使用GPT-3.5模型它不但沒辦法輸出SSML,甚至忽略了一些提示。因此今天我將使用Open AI提供的另一個功能:「Function Calling」。透過這個功能,神奇的讓GPT-3.5模型能夠依照我要的格式進行輸出。那麼讓我們今天的挑戰吧!
Function Calling是OpenAI在6月推出的一項功能,它允許開發者與GPT模型進行更結構化和互動性的對話。透過這個功能,開發者不僅可以與模型進行自然語言對話,還能在對話過程中調用特定函數,從而生成符合開發者期望的JSON資料格式。
由於我們需要使用許多提示來達成特定功能,這也造成了提示過長的問題。在使用GPT-3.5模型時,過長的提示很容易被忽略,導致模型未能按照要求輸出SSML格式,也未能指出語法錯誤。正當我苦惱如何解決這個問題時,我突然想到了Function Calling功能。即使模型無法直接輸出SSML,如果它能提供聊天回應、對應的語氣和強度,以及希望強調的句子和單字,我就可以在前端自行組合成SSML。因此,我決定嘗試使用Function Calling功能來解決這個問題。
Function Calling的使用方法與GPT-3.5和GPT-4模型一樣,我們只需多添加兩個可選參數:
{"name": "你的function name"}
」。若functions列表內有任何Function,預設選項為「auto」。
{"name": "你的function name"}
:強制GPT模型每次執行都使用Function Calling功能。Function Calling功能允許開發者通過使用JSON Schema來定義所期望的輸出格式,進而指導GPT模型如何進行輸出。考慮到我的SSML需求包括了語氣、語氣強度和強調等三個主要元素,我將這些需求細分成五個不同的屬性進行定義:
接下來,我們根據這五個屬性來建立JSON Schema:
{
"name": "getEnglishTurtorConverstaionData",
"description": "",
"parameters": {
"type": "object",
"properties": {
"gptResponseText": {
"type": "string",
"description": "回覆的對話內容,請記得適時的延續或開啟新的話題。"
},
"gptResponseTextStyle": {
"type": "string",
"description": "根據回覆的對話內容相對應的語氣。可用:cheerful、friendly、excited"
},
"gptResponseTextStyleDegree": {
"type": "string",
"description": "對應gptResponseTextStyle語氣的強度。範圍在0.01到2。"
},
"gptResponseEmphasisTexts": {
"type": "array",
"description": "根據回覆的對話內容找出需要強調的句子或單字。",
"items": {
"type": "string",
"description": ""
}
},
"gptResponseEmphasisStyles": {
"type": "array",
"description": "對應gptResponseEmphasisTexts陣列的強調語氣。可用:reduced、none、moderate、strong",
"items": {
"type": "string",
"description": ""
}
}
},
"required": [
"gptResponseText",
"gptResponseTextStyle",
"gptResponseTextStyleDegree",
"gptResponseEmphasisTexts",
"gptResponseEmphasisStyles"
]
}
}
在進行測試前,我調整了提示策略,首先移除了所有有關SSML輸出格式和語法檢查的部分:
1.你是英文老師,所有對話都使用英文。
2.進行生活會話練習並適時的延續或開啟新的話題。
3.請使用多益400-600分的程度進行對話。
將剛才所建立的JSON Schema放入parameters
中,然後在function_call
的部分呼叫對應的function。
最終,GPT-3.5模型成功的按照我所要求的JSON格式輸出,並根據自身的判斷提供了語氣、語氣強度,以及需要強調的句子和單詞。同時,GPT-3.5模型有更良好的回應速度。
當Function Calling這個功能剛推出時,我就測試過許多不同的使用方式。在此,我想分享一些小技巧。當我們定義Function時,有時會用描述來說明這個方法要執行的操作,但還有另一個有效的做法,就是「命名要明確」。如果命名足夠清晰,通常就不太需要添加額外的描述,因為GPT模型會依照你的命名理解其功能。
舉例來說,我在這裡創建了一個不包含任何提示的範例,並故意使用了錯誤的文法「I has a good day.」。然而,由於Function Calling定義的屬性名稱是userContent
,輸出結果仍然是依照User提供的Content內容。
但是如果我將屬性名稱更改為grammerError
,此時GPT模型在輸出時會直接糾正文法錯誤,並將其改為正確的形式。
今天,我們利用Function Calling來克服GPT-4模型的速度慢和GPT-3.5模型的忽略提示問題。可能有人注意到,我並未在這個功能中加入文法檢查部分。這是因為經過一天的測試,我發現在GPT-3.5模型的Function Calling中,要同時回應訊息和進行文法檢查仍然非常困難。這可能是由於我的提示方式不完整所造成的。未來,如果有機會,我會投入更多時間來研究。當然,轉用GPT-4模型可以迅速解決這個問題,但使用GPT-3.5的主要目的就是解決回應速度慢的問題。所以,除非GPT-4的速度有所提升,不然現階段我們將繼續使用GPT-3.5模型搭配Function Calling來解決目前的困境。
Github專案程式碼:Ionic結合ChatGPT - Day19