LangChain的函數,工具和代理(一):OpenAI的函數調用

一、什么是函數調用功能

幾個月前OpenAI官方發布了其API的函數調用功能(Function calling),?在 API 調用中,您可以描述函數,并讓模型智能地選擇輸出包含調用一個或多個函數的參數的 JSON 對象。API函數“ChatCompletion”?雖然不會實際調用該函數;但是模型會生成這些基于函數參數的JSON對象,您可以使用它來調用代碼中的實際函數。

也就是說當用戶和ChatGPT對話的過程中需要調用某些外部的函數或者API時,我們可以讓ChatGPT生成調用外部函數所需的參數,然后我們再使用這些參數再去實際的調用外部函數,目前OpenAl 對 gpt-3.5-turbo-0613 和 gpt-4-0613 模型進行了微調,使它們具備了以下函數調用功能:

1. 接受額外的參數,用戶可以通過這些參數傳入函數的描述。
2. 如果相關,則返回要使用的函數的名稱,以及帶有適當輸入參數的 JSON 對象。

二,如何實現OpenAI的函數調用功能

在實現OpenAI的函數調用功能之前,我們先定義一個外部函數,當用戶和ChatGPT對話時,ChatGPT會自動判斷是否需要調用外部函數,當需要調用外部函數時ChatGPT會返回調用函數的json對象給用戶:

import json# 查詢天氣的模擬函數示例
# 在生產中,這可能是您的后端 API 或外部 API
def get_current_weather(location, unit="fahrenheit"):"""Get the current weather in a given location"""weather_info = {"location": location, #城市"temperature": "72", # 溫度"unit": unit, #溫度單位"forecast": ["sunny", "windy"], #天氣情況}return json.dumps(weather_info)

這里我們定義一個外部函數get_current_weather,他用來查詢特定城市的天氣情況,并返回一個jons對象作為查詢結果。接下來我們需要定義一個該函數的描述對象,該描述對象后面會作為參數傳遞給ChatGPT:

#函數描述對象
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"],},}
]

下面我們來說明一下函數描述對象的主要成員:

  • name: 外部函數名稱如get_current_weather
  • description:外部函數功能的描述
  • parameters:外部函數的參數集
  • parameters-type:外部函數的參數集的類型
  • properties:外部函數的具體參數集
  • location:具體的外部函數的參數
  • location-type:外部函數的參數的類型
  • location-description:外部函數的參數的描述
  • unit:具體的外部函數的參數
  • unit-type:外部函數的參數的類型
  • enum:外部函數的參數的枚舉值
  • required:必填的參數

這里我們生成了一個外部函數的描述對象,該描述對象會告訴ChatGPT該外部函數的作用,以及我們需要在恰當的時候來調用該函數,至于什么時候才是“恰當的時候”這需要由ChatGPT根據用戶對話的上下文來判斷。接下來我們向ChatGPT詢問一個關于天氣的問題:

import openai
openai.api_key = "XXXXXXXXX"messages = [{"role": "user","content": "上海的天氣怎么樣?"}
]response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions
)print(response)

這里我們向ChatGPT提出了關于天氣的問題:“上海的天氣怎么樣?”, 從ChatGPT的返回結果中我們看到"function_call",這告訴我們接下來我們該調用外部函數了,同時ChatGPT還返回了調用外部函數的參數location和unit,以及所需調用的外部函數名:get_current_weather,有意思的是這里返回的unit為“celsius”即攝氏度而非美國使用的"fahrenheit(華氏度)", 這似乎說明ChatGPT知道中國使用攝氏度作為溫度的單位,下面我們詢問一下美國城市的天氣:

messages = [{"role": "user","content": "What's the weather like in Boston?" #波士頓 的天氣怎么樣?}
]response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions
)print(response)

這里我們用英語詢問了美國城市波士頓的天氣情況,從ChatGPT的返回結果中我們看到arguments中只包含了location,而沒有包含unit, 而在我們的外部函數get_current_weather中unit為非必填參數,它有一個默認值為:unit="fahrenheit",因此在實際調用外部函數時我們只需將chatgpt返回結果中的arguments中取出對應的參數然后傳遞給外部函數即可,接下來我們從ChatGPT的返回結果中獲取參數來實際調用外部函數get_current_weather:

args = json.loads(response_message["function_call"]["arguments"])
result=get_current_weather(args)
print(result)

?接下來我們來測試一下ChatGPT能否準確識別何時該調用外部函數,下面我們會對ChatGPT發送一個簡單的問候語:hi,? 當Chatgpt收到該問候語時不應該觸發函數調用功能:

messages = [{"role": "user","content": "hi!",}
]response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,
)print(response)

從上面的chatgpt的返回結果中我們看到不存在先前的“function_call"內容即沒有生成外部函數的調用參數,這說明此時我們不需要調用外部函數。

三、設置OPAI API的默認參數

openai的API函數ChatCompletion.create中存在一個function_call的參數,該參數的默認值為“auto”即讓模型自己來選擇是否需要調用外部函數:

messages = [{"role": "user","content": "hi!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call="auto",
)
print(response)

上面我們在openai.ChatCompletion.create的方法中加入了function_call="auto",意思是讓模型根據上下文來確定是否調用外部函數,我們看到當我們向ChatGPT打招呼時,如輸入“hi”時 ,chatgpt的返回結果中沒有“function_call”的內容。這說明ChatGPT知道此時不應該調用外部函數。

messages = [{"role": "user","content": "hi!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call="none",#禁止調用外部函數
)
print(response)

上面當我們將function_cal設置為"none"時(即禁止chatGPT調用外部函數),chatGPT的返回結果中也不會出現“function_call”的內容。

messages = [{"role": "user","content": "What's the weather in Boston?",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call="none", #禁止調用外部函數
)
print(response)

在上面的代碼中我們向ChatGPT詢問了波士頓的天氣,但是我們設置了function_call="none",也就是說雖然我們詢問了波士頓的天氣情況,但我們卻禁止chatgpt調用外部函數,從chatgpt的返回結果中我們看到仍然沒有“function_cal”的相關內容。

下面我們設置chatgpt強制調用外部函數,看看會發生上面情況:

messages = [{"role": "user","content": "hi!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call={"name": "get_current_weather"},#強制調用外部函數
)
print(response)

在上面的代碼中我們在?ChatCompletion.create中設置了function_call={"name": "get_current_weather"}意思是讓chatgpt強制生成調用get_current_weather函數的參數,但是我們向chatgpt發送的用戶消息卻是:hi!, 這時會讓chatgpt產生困惑,因為用戶消息中沒有有關詢問天氣的內容,但是卻要強制chatgpt去生成外部函數的調用參數,所以在chatgpt的返回結果中function_call中的arguments中給出了一個隨機的location:San Francisco,CA。

下面我們向chatgpt詢問波士頓的天氣,并且讓chatgpt強制調用get_current_weather,看看會發生什么情況:

messages = [{"role": "user","content": "What's the weather like in Boston!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages,functions=functions,function_call={"name": "get_current_weather"}, #強制調用外部函數
)
print(response)

從上面的chatgpt的返回結果中我們看到了“function_call”中的內容。這說明只要我們設置了chatgpt強制指定了外部調用函數時,它總會生成相應的函數參數。

四、外部函數的調用結果的應用

上面我們讓chatgpt來判斷是否應該調用外部函數,并且讓chatgpt返回了調用外部函數的參數,接下來我們要做的是用chatgpt提供的參數去實際調用外部函數,并將外部函數的返回結果再喂給chatgpt,這樣做的目的是讓chatgpt來匯總所有的信息并產生最終對用戶友好的返回信息。

#整合chatgpt的返回結果
messages.append(response["choices"][0]["message"])
#從chatgpt的返回結果中獲取外部函數的調用參數
args = json.loads(response["choices"][0]["message"]['function_call']['arguments'])
#調用外部函數
observation = get_current_weather(args)messages.append({"role": "function","name": "get_current_weather","content": observation, #外部函數的返回結果}
)response = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",messages=messages,
)
print(response)

?這里我們看到ChatGPT最終返回了一個非常友好的回復,該回復是在外部函數調用結果的基礎上經過整理后得到的。

五、關于token統計

我們知道chatgpt的API是通過token來收費的,這里我們在使用chatgpt的函數調用功能時我們創建了一個函數描述對象functions,因此functions也會作為上下文的一部分被統計token數,下面我們去掉ChatCompletion.create中的functions和function_call這兩個參數看看最后chatgpt返回的總的token數是多少:

messages = [{"role": "user","content": "What's the weather like in Boston!",}
]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo-1106",messages=messages
)
print(response)

從上面的返回結果中我們看到當我們去掉了ChatCompletion.create中的functions和function_call這兩個參數時,總token數為48,而先前的總token數為99,這說明外部函數描述對象functions被統計了token數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167218.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167218.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言變量和常量

變量和常量 標識符 在計算機高級語言中,用來對變量、符號常量、函數、數組、類型等命名的有效字符序列統稱為標識符(identifier)。 C語言規定標識符: 只能由字母,數字和下劃線組成。不能以數字開頭。字母區分大小寫…

一站式企業快遞管理平臺使用教程

因公寄件在企業中重要性的提升,催生出了企業快遞管理平臺。為什么這么說呢? 隨著經濟和快遞行業的發展,因公寄件在企業中成了一件“常事”,寄文件合同、發票、節假日慰問品、樣品等等,這種情況之下,因公寄件…

Vue3 設置點擊后滾動條移動到固定的位置

需求&#xff1a; 點擊不通過按鈕&#xff0c;顯示紅框中表單&#xff0c;且滾動條滾動到底部 &#xff08;顯示紅框中表單默認不顯示&#xff09; <el-button click"onApprovalPass">不通過</el-button> <div class"item" v-if"app…

vue打包優化

vue.config.js文件中 module.exports defineConfig({ productionSourceMap: false,//去掉mapjs文件 });

pwn:[SWPUCTF 2021 新生賽]nc簽到

題目 linux環境下顯示為 配合題目的下載附件&#xff0c;發現過濾了一些&#xff0c;一旦輸入這些會自動關閉程序 ls被過濾了&#xff0c;可以使用l\s cat和空格都被過濾了&#xff0c;cat可以換成c\at ,空格可以換成$IFS$9

<HarmonyOS第一課>1·運行Hello World【課后考核】

【習題】運行Hello World工程 判斷題 1.DevEco Studio是開發HarmonyOS應用的一站式集成開發環境。 正確(True) 2.main_pages.json存放頁面page路徑配置信息。 正確(True) 單選題 1.在stage模型中&#xff0c;下列配置文件屬于AppScope文件夾的是&#xff1f;&#xff08;…

Youtube0播放?運營教你需要的技巧、策略與工具!

對于有跨境意向的內容創作者或者品牌企業來說&#xff0c;YouTube是因其巨大的潛在受眾群和商業價值成為最值得投入變現與營銷計劃的平臺。 據統計&#xff0c;98% 的美國人每月訪問 YouTube&#xff0c;近三分之二的人每天訪問。但是&#xff0c;YouTube還遠未達到過度飽和的…

酵母雙雜交服務專題(一)

酵母雙雜交系統是一種在酵母這種真核生物模型中執行的實驗方法&#xff0c;用于探索活細胞內部蛋白質間的相互作用。這種技術能夠敏感地捕捉蛋白質間的細微和短暫相互作用&#xff0c;通過檢測報告基因的表達產物來實現。作為一種高度靈敏的技術&#xff0c;酵母雙雜交系統被廣…

Spring Cloud LoadBalancer 簡單介紹與實戰

前言 本文為SpringCloud的學習筆記&#xff0c;如有錯誤&#xff0c;希望各位高手能指出&#xff0c;主要介紹SpringCloudLoadBalancer的基本概念和實戰 文章目錄 前言什么是LoadBalancer負載均衡分類服務端負載均衡客戶端負載均衡服務端負載均衡和客戶端負載均衡的優缺點 常見…

評測|PolarDB MySQL 版 Serverless

評測&#xff5c;PolarDB MySQL 版 Serverless 目錄 一、測試背景 1.1、云原生數據庫 PolarDB Serverless新架構概念 1.2、Serverless資源彈性擴縮觸發條件 二、PolarDB的Serverless能力與同類型產品進行對比 三、動態彈性升降資源的能力測試 3.1、測試資源 3.2、測試一…

ubuntu22.04在線安裝redis,可選擇版本

安裝腳本7.0.5版本 在線安裝腳本&#xff0c;默認版本號是7.0.5&#xff0c;可以根據需要選擇需要的版本進行下載編譯安裝 sudo apt-get install gcc -y sudo apt-get install pkg-config -y sudo apt-get install build-essential -y#安裝redis rm -rf ./tmp.log systemctl …

freeRTOS下載鏈接(sourceForge)

FreeRTOS Real Time Kernel (RTOS) download | SourceForge.net 文件名&#xff1a;FreeRTOSv202212.00.exe 雙擊后會自動變成這個樣子的&#xff1a; 文件夾大小&#xff1a;506M 可以看到跟那個教程里面的文件結構是一模一樣的&#xff0c;所以很可能是同一個最新版本的文件…

Linux(Centos)上使用crontab實現定時任務(定時執行腳本)

場景 Windows中通過bat定時執行命令和mysqldump實現數據庫備份&#xff1a; Windows中通過bat定時執行命令和mysqldump實現數據庫備份_mysqldump bat-CSDN博客 上面講windows中使用bat實現定時任務的方式&#xff0c;如果是在linux上可以通過crontab實現。 cron是服務名稱。…

高斯DB數據庫添加字段并添加字段注釋

個人網站 公眾號小肖學數據分析 可以使用以下SQL語句向高斯DB數據庫添加字段并添加字段注釋&#xff1a; ALTER TABLE 表名 ADD COLUMN 列名 數據類型 COMMENT 字段注釋; "表名"替換為要添加字段的表名&#xff0c;"列名"替換為要添加的字段名&#xf…

怎樣提升倫敦銀買賣技巧?

如果投資者想提升倫敦銀的買賣技巧&#xff0c;可以學習一些有用的技術分析方法。所謂技術分析&#xff0c;就是通過對行情過往價格和相關交易數據進行收集&#xff0c;用圖表的方式解讀白銀市場&#xff0c;進而預測行情未來主線走勢、判斷價格細節變化、尋找重要支撐點阻力點…

Linux系統常用的組合命令

1. 管道&#xff08;|&#xff09;&#xff1a;將一個命令的輸出傳遞給另一個命令作為輸入。例如&#xff1a; command1 | command2 在這個命令中&#xff0c;command1 的輸出會作為 command2 的輸入,直接將一個命令的輸出傳遞給另一個命令進行處理. 你可以使用 grep 來查找關…

TikTok Shop 與英國皇家郵政合作:為賣家提供“Click and Drop”服務

11 月 21 日&#xff0c;TikTok Shop 宣布與皇家郵政 建立新的合作伙伴關系 &#xff0c;為平臺上的商家推出 Click & Drop。此次合作將使各種規模的商家能夠通過將皇家郵政的 Click & Drop 與其 TikTok Shop 帳戶集成來改善其履行體驗并更有效地發出訂單&#xff0c;…

科普:多領域分布式協同仿真

分布式協同仿真是一種在分布式計算環境中進行協同工作的仿真方法。使用該方法進行協同仿真時&#xff0c;仿真任務將被分發到多個計算節點上&#xff0c;并且這些節點可以同時工作以模擬完整的系統行為。分布式協同仿真已被廣泛應用于工程、科學和軍事領域&#xff0c;以便更好…

醫保線上購藥系統:代碼驅動的醫療創新

醫保線上購藥系統&#xff0c;這是一個融合技術和醫療的創新典范。本文將通過簡單的技術代碼示例&#xff0c;為您揭示這一系統是如何通過技術驅動醫療創新&#xff0c;為用戶提供更智能、便捷的健康管理體驗的。 1. 前端界面開發 使用React框架&#xff0c;我們可以輕松構建…

深度探究數據要素市場,企業為什么要參與數據資產化建設

我國正在發展數字經濟&#xff0c;培育數字要素市場&#xff0c;推進數據市場化。在十四五數字經濟發展規劃中就已經將數據要素列為數字經濟深化發展的核心引擎。今天和大家分享關于數據要素的前世今生&#xff0c;您將了解以下知識點&#xff1a; 1.什么是數據要素&#xff1f…