iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Mobile Development

Ionic結合ChatGPT - 30天打造AI英語口說導師APP系列 第 19

【Day - 19】Function Calling實戰1 - 自定模型輸出格式

  • 分享至 

  • xImage
  •  

在【Day - 18】時,我們面臨了GPT-4模型速度過慢的問題,目前唯一的解決方案似乎是改用GPT-3.5模型。然而,使用GPT-3.5模型它不但沒辦法輸出SSML,甚至忽略了一些提示。因此今天我將使用Open AI提供的另一個功能:「Function Calling」。透過這個功能,神奇的讓GPT-3.5模型能夠依照我要的格式進行輸出。那麼讓我們今天的挑戰吧!

什麼是Function Calling

Function Calling是OpenAI在6月推出的一項功能,它允許開發者與GPT模型進行更結構化和互動性的對話。透過這個功能,開發者不僅可以與模型進行自然語言對話,還能在對話過程中調用特定函數,從而生成符合開發者期望的JSON資料格式。

為什麼使用Function Calling?

由於我們需要使用許多提示來達成特定功能,這也造成了提示過長的問題。在使用GPT-3.5模型時,過長的提示很容易被忽略,導致模型未能按照要求輸出SSML格式,也未能指出語法錯誤。正當我苦惱如何解決這個問題時,我突然想到了Function Calling功能。即使模型無法直接輸出SSML,如果它能提供聊天回應、對應的語氣和強度,以及希望強調的句子和單字,我就可以在前端自行組合成SSML。因此,我決定嘗試使用Function Calling功能來解決這個問題。

如何使用Function Calling

Function Calling的使用方法與GPT-3.5和GPT-4模型一樣,我們只需多添加兩個可選參數:

  • functions:定義模型可以生成的Function列表。
    • name:Function的名稱。
    • description:Function的描述,也可以視為提示。注意!描述內容的字數,會納入Token的計算範圍
    • parameters:依照JSON Schema進行定義。注意!JSON Schema裡面定義的所有描述(description),也會納入Token的計算範圍
  • function_call:設定模型如何調用Function,可選三個值:「none」、「auto」、或「{"name": "你的function name"}」。若functions列表內有任何Function,預設選項為「auto」。
    • none:永遠不調用function。
    • auto:GPT模型自行判斷是否需要調用Function。
    • {"name": "你的function name"}:強制GPT模型每次執行都使用Function Calling功能。

https://ithelp.ithome.com.tw/upload/images/20230919/20161663uSuwylhZhm.png

定義JSON Schema

Function Calling功能允許開發者通過使用JSON Schema來定義所期望的輸出格式,進而指導GPT模型如何進行輸出。考慮到我的SSML需求包括了語氣、語氣強度和強調等三個主要元素,我將這些需求細分成五個不同的屬性進行定義:

  • gptResponseText:代表GPT模型的對話內容。
  • gptResponseTextStyle:定義與對話內容相對應的語氣。
  • gptResponseTextStyleDegree:表示對應語氣的強度。
  • gptResponseEmphasisTexts:列出需要強調的句子或單字。
  • gptResponseEmphasisStyles:描述與gptResponseEmphasisTexts陣列屬性相對應的強調語氣。

接下來,我們根據這五個屬性來建立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"
        ]
    }
}

 

Postman測試

在進行測試前,我調整了提示策略,首先移除了所有有關SSML輸出格式和語法檢查的部分:

1.你是英文老師,所有對話都使用英文。
2.進行生活會話練習並適時的延續或開啟新的話題。
3.請使用多益400-600分的程度進行對話。

https://ithelp.ithome.com.tw/upload/images/20230919/20161663r35EJmgaUN.png
將剛才所建立的JSON Schema放入parameters中,然後在function_call的部分呼叫對應的function。
https://ithelp.ithome.com.tw/upload/images/20230919/20161663yC9wPpNS1l.png
最終,GPT-3.5模型成功的按照我所要求的JSON格式輸出,並根據自身的判斷提供了語氣、語氣強度,以及需要強調的句子和單詞。同時,GPT-3.5模型有更良好的回應速度。
https://ithelp.ithome.com.tw/upload/images/20230919/20161663mlGESD8EXT.png

Function Calling的一些小技巧

當Function Calling這個功能剛推出時,我就測試過許多不同的使用方式。在此,我想分享一些小技巧。當我們定義Function時,有時會用描述來說明這個方法要執行的操作,但還有另一個有效的做法,就是「命名要明確」。如果命名足夠清晰,通常就不太需要添加額外的描述,因為GPT模型會依照你的命名理解其功能。

舉例來說,我在這裡創建了一個不包含任何提示的範例,並故意使用了錯誤的文法「I has a good day.」。然而,由於Function Calling定義的屬性名稱是userContent,輸出結果仍然是依照User提供的Content內容。
https://ithelp.ithome.com.tw/upload/images/20230919/20161663aVAMtmTr4H.png
但是如果我將屬性名稱更改為grammerError,此時GPT模型在輸出時會直接糾正文法錯誤,並將其改為正確的形式。
https://ithelp.ithome.com.tw/upload/images/20230919/20161663lwZ88R97Eu.png

結語

今天,我們利用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


上一篇
【Day - 18】Speech Service串接 - 完成文字轉語音功能整合
下一篇
【Day - 20】Function Calling實戰2 - 讓語音重新播放
系列文
Ionic結合ChatGPT - 30天打造AI英語口說導師APP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言