天天看點

OpenAI 的 GPT 簡化版: 函數調用

作者:吉祥莊鋼鐵俠

ChatGPT 革命

在這個人工智能不斷進步的時代,在讨論軟體工程的最新發展時,幾乎不可能忽視 ChatGPT 的影響。開放人工智能(OpenAI)的創意及其颠覆性的潛力,已被科技行業的衆多軟體工程師和高管迅速整合,其中既有巨型科技企業,也有蓄勢待發的新興初創公司。從建立和完善會話式人工智能的開創性努力開始,OpenAI 已經成為幾乎整個科技領域必不可少的工具。

OpenAI 擁抱現代工作流程

OpenAI 意識到 GPT 模型在衆多軟體工程工作流程中所發揮的巨大作用,是以采取了大膽而前瞻性的舉措,利用一種稱為函數調用的新功能來更新其人工智能模型的功能。

起初,我以為這隻是炒作。我的意思是,我已經在背景針對特定用例開發了多步驟工作流,并已認證相應的前端應用程式進行引導。但這是一個全面、高維護的流程,工作流程越長,出錯的幾率就越高。(機率法則,對吧?) 試想一下,做出的更改會影響下遊其他部分的其他提示。

考慮一下預訂航班的聊天機器人。像 "預訂 8 月 25 日從紐約飛往舊金山的航班 "這樣的使用者輸入需要先解析意圖(預訂航班),然後請求特定的格式和變量類型進行解析,最後確定收到的所有值和類型都是正确的。隻有這樣,我們才能更有信心地調用我們的原始函數,并期待最好的結果。

現在,如果我們不需要考慮曲解、幻覺或僅僅是由于生成詞的機率而偏離最初預期的反應的可能性,所有這些聽起來都很完美。這正是函數調用的用處所在。

函數調用解密

函數調用允許開發人員從現有代碼(無論是前端代碼還是後端代碼)中提供對函數名稱的特定引用,并允許 GPT 在響應過程中考慮是否以及何時需要使用該函數。這包括兩個部分:函數和 function_call。這兩個部分都是變量,可以與完成 API 請求正文一起傳遞。

{
    apiKey: OPENAI_API_KEY,
        model: "gpt-3.5-turbo",
            functions: [
              {
                      name: "get_current_weather",
                      description: "Get the current weather in a given location",
                      parameters: {
                                type: "object",
                                properties: {
                                            location: {
                                                          type: "string",
                                                          description: "The city and state, e.g. San Francisco, CA",
                                                        },
                                            unit: { type: "string", enum: ["celsius", "fahrenheit"] },
                                          },
                                required: ["location"],
                              },
                    },
                ],
                function_call: "auto",
}
           

函數指的是作為附加屬性傳入 API 請求的函數引用數組(清單)。從上面的 JSON(作為配置傳入)中可以看出,這些引用采用對象(字典)格式,帶有相關的鍵和值,使 GPT 可以了解它們的用途、預期邏輯和輸入/輸出格式。GPT 會解析以下屬性:

  1. 名稱: 要考慮的函數的具體名稱。
  2. 描述: 對函數功能的簡短描述,用于 ChatGPT 的推理。
  3. 參數: 函數接受的參數,以 JSON 模式中的對象(字典)形式描述。每個對象應包括類型和屬性(或枚舉清單)。您還可以用單獨的清單定義哪些是必需的。

函數調用是指 GPT 使用預定義函數或考慮一系列函數的直接指令。該屬性的預設值為 auto,這意味着它會從函數清單中的可用選項中進行評估,并自動決定調用哪個最合适。或者,開發人員也可以編寫一個特定的 "function_name "來代替。

在這兩種情況下,開發人員都需要手動設定對 GPT 函數的處理,除非它足夠簡單,GPT 可以在沒有實際引用的情況下自行完成大部分邏輯。響應将包括一個直接的 function_call 标記,開發人員可以使用該标記來确定 GPT 何時決定需要函數調用,并對其進行适當處理。請看 OpenAI 團隊自己的示例:

response = openai.ChatCompletion.create(
      model="gpt-3.5-turbo-0613",
      messages=messages,
      functions=functions,
      function_call="auto",  # auto is default
  )

response_message = response["choices"][0]["message"]

if response_message.get("function_call"):
    available_functions = {
              "get_current_weather": get_current_weather,
              ...other functions
    }
    function_name = response_message["function_call"]["name"]
    fuction_to_call = available_functions[function_name]
    function_args = json.loads(response_message["function_call"]["arguments"])
    function_response = fuction_to_call(
              location=function_args.get("location"),
              unit=function_args.get("unit"),
          )

messages.append(
  {
            "role": "function",
            "name": function_name,
            "content": function_response,
  }
  )
           

現在,你可以說,多提示工作流程(想想 LangChain)可以輕松幫助解決其中的一些限制,這并不完全錯誤。但請記住,OpenAI API 的請求每小時、每天和每月都有限制。在決定使用許多前置程式和指令來過濾輸入和輸出時,還存在令牌成本的因素。但最重要的還是時間延遲因素。根據令牌的長度,一個請求很容易讓我們等待幾秒鐘。試想一下,在做出響應之前,我們需要通過中間處理來獲得多個人工智能響應。

是以,歸根結底,它有助于簡化從提示到響應的流程,而無需過多插手中間的過濾器和中間件。畢竟,在我們的工作流程中使用人工智能的整體目标就是将重複性任務和複雜問題解決的重任交給他人,不是嗎?

好處說明

至少從我個人的實驗來看,函數調用确實帶來了一系列令人印象深刻的好處,極大地改善了軟體工程師的工作流程,使編碼更高效、更不易出錯、更能适應複雜的場景。下面是我的一些觀察結果:

  1. 優化解析和處理步驟: 在傳統的應用場景中,人工智能應用程式需要解釋使用者輸入、提取關鍵資料、格式化資料,然後根據這些資料執行函數。有了函數調用,解析和處理使用者輸入所需的工作就大大減少了,GPT 現在可以直接将使用者意圖映射到相應的函數,進而減少了對複雜、易出錯的工作流程的需求。
  2. 減少應用程式接口設定開銷: 函數調用無需大量中間件、過濾政策或提示鍊,進而減少了設定應用程式接口的開銷。通過函數調用,模型可以處理函數的執行,進而避免了多次 API 調用,簡化了邏輯。
  3. 降低令牌成本: 由于函數調用不需要這些更複雜的提示鍊,是以消耗的令牌更少。這意味着您可以用更少的令牌實作更多的功能,進而降低更全面的生産工作流程的成本。
  4. 提高響應的準确性:通過指定 GPT 要調用或考慮的确切函數,開發人員可以大大減少在一系列重要步驟中出現誤解和幻覺的機會。這将帶來更準确、更可靠的結果,增強使用者的信任感。
  5. 簡化工作流程變更: 當工作流程發生變化或發展時,調整人工智能的行為可能是一個繁瑣且容易出錯的過程。然而,有了函數調用,隻需更改函數定義,就能輕松處理這些更新。提高響應的準确性:通過指定 GPT 要調用或考慮的确切函數,開發人員可以大大減少在一系列重要步驟中出現誤解和幻覺的機會。這将帶來更準确、更可靠的結果,增強使用者的信任感。

挑戰與專業技巧

不過,函數調用雖然具有革命性,但也并非沒有挑戰:

函數設定和處理的複雜性: 函數調用的初始設定可能有點棘手,尤其是對于那些剛接觸 GPT 模型的人來說。這包括設定函數引用和處理函數調用響應。最重要的一點是,函數調用允許 GPT 對函數進行推理并引用其調用,但不能直接執行。我們需要适當處理這些調用。

  1. 提示:在進入複雜場景之前,先從簡單的函數和簡單的響應開始。這将幫助您了解 ChatGPT 如何解釋函數以及如何處理響應。

過度拟合的可能性: 根據使用函數調用的方式和時間,GPT 可能會過度使用某些函數,而對其他函數使用不足。這可能會導緻重複響應,并限制輸出的多樣性。

  1. 提示:實施定期監控,并嘗試使用不同的描述和參數,以了解它們如何影響函數調用。

廣泛測試的必要性: 鑒于函數調用的複雜性及其對輸出的重大影響,有必要進行廣泛的測試,以確定響應的準确性和函數調用的正确處理。

  1. 小貼士 自動化單元測試可以大大減少大量測試所需的時間和精力。考慮通過持續內建建立一個測試套件,確定函數調用的所有選項都能按預期運作。

人工智能進步的新曙光

我們所看到的進步,尤其是在函數調用方面的進步,充分說明了一件事:人工智能的發展才剛剛起步。随着我們将這些工具更深入地內建到我們的流程中,人類直覺和機器處理之間的界限将不斷模糊。人工智能潛力巨大,前景光明。下一步是什麼?隻有時間(也許還有下一次 ChatGPT 的疊代)會告訴我們答案。

繼續閱讀