?? CSDN 葉庭云:https://yetingyun.blog.csdn.net/
一、前言
OpenAI 重磅更新,API 添加函數(shù)調(diào)用能力,能處理更長(zhǎng)上下文,價(jià)格又有所降低 …
知乎討論:https://www.zhihu.com/question/606520916
這次更新的主角,在我看來(lái)毫無(wú)疑問(wèn)是函數(shù)調(diào)用功能,過(guò)去要么依靠 Prompt Engineering 提供的信息,要么就需要使用 LangChain 這樣的框架實(shí)現(xiàn)?,F(xiàn)在官方提供了更穩(wěn)定的方式與本地代碼或者第三方 API,可以無(wú)縫將 GPT 的語(yǔ)言理解和解析能力整合入本地工作流中。
稍微再總結(jié)一下此次更新的主要內(nèi)容:
- 在 Chat Completions API 中提供函數(shù)調(diào)用能力
- 更新更易控制的 gpt-4 和 gpt-3.5-turbo 版本
- 新的 16k 上下文版本 gpt-3.5-turbo (與標(biāo)準(zhǔn)的 4k 版本相比很香)
- embeddings 嵌入模型價(jià)格降低了75%
- gpt-3.5-turbo 輸入 token 價(jià)格降低 25%
- 宣布 gpt-3.5-turbo-0301 和 gpt-4-0314 型號(hào)的棄用計(jì)劃
- 以上所有的模型都會(huì)遵循 0301 介紹的數(shù)據(jù)隱私規(guī)則:所有使用 API 的數(shù)據(jù)不會(huì)用于訓(xùn)練。
二、主要內(nèi)容
新增的函數(shù)調(diào)用功能的解釋:我理解的是,ChatGPT 的 API 現(xiàn)在可以根據(jù)你給出的函數(shù)描述,理解你的函數(shù)輸入輸出格式要求,把用戶的自然語(yǔ)言轉(zhuǎn)化成本地 / {/} /第三方函數(shù)的輸入?yún)?shù)。然后開(kāi)發(fā)者需要拿著這個(gè)參數(shù)自己執(zhí)行一下,得到一個(gè)結(jié)果再還給 ChatGPT,ChatGPT 最后會(huì)根據(jù)這個(gè)結(jié)果回答用戶的問(wèn)題,輸出最終內(nèi)容。
函數(shù)調(diào)用的官方示例:
自從 ChatGPT 插件的 alpha 版本發(fā)布以來(lái),我們已經(jīng)學(xué)到了很多關(guān)于如何安全地使工具和語(yǔ)言模型協(xié)同工作的知識(shí)。然而,仍有一些未解決的研究問(wèn)題。例如,一個(gè)概念驗(yàn)證漏洞說(shuō)明了不受信任的數(shù)據(jù)可以指示模型執(zhí)行意外操作。我們正在努力減輕這些和其他風(fēng)險(xiǎn)。開(kāi)發(fā)人員可以通過(guò)只消費(fèi)來(lái)自可信工具的信息并在執(zhí)行具有現(xiàn)實(shí)影響(例如發(fā)送電子郵件、在線發(fā)布或購(gòu)買)的操作之前包含用戶確認(rèn)步驟來(lái)保護(hù)其應(yīng)用程序。
下面我們自己寫(xiě)個(gè)實(shí)例來(lái)實(shí)踐和感受一下,以查詢國(guó)內(nèi)城市今天的天氣情況為例:
API 使用的是國(guó)家氣象局的接口,完全免費(fèi)的:http://t.weather.sojson.com/api/weather/city/101010100
城市到代碼的轉(zhuǎn)化是參考這篇博客:https://blog.csdn.net/qq_42855293/article/details/103864266。把他分享的內(nèi)容粘貼到 Excel 并保存,方便后續(xù)使用。
完整代碼如下:
import ast
import json
import requests
import pandas as pd
import openai
from pprint import pprint
def get_current_weather(city):
code = city2code[city]
resp = requests.get(f"http://t.weather.sojson.com/api/weather/city/{code}")
data = resp.json()["data"]
date_info = data["forecast"][0]["ymd"] + " - " + data["forecast"][0]["week"]
wendu = data["wendu"]
shidu = data["shidu"]
pm25 = data["pm25"]
pm10 = data["pm10"]
tianqi_type = data["forecast"][0]["type"]
air_quality = data["quality"]
zhuyi = data["forecast"][0]["notice"]
low = data["forecast"][0]["low"]
high = data["forecast"][0]["high"]
aqi = data["forecast"][0]["aqi"]
return {"時(shí)間": date_info, "溫度": wendu, "最高溫度": high, "最低溫度": low,
"濕度": shidu, "天氣類型": tianqi_type, "空氣質(zhì)量": air_quality,
"注意": zhuyi, "PM2.5": pm25, "PM10": pm10, "AQI": aqi}
openai.api_key = "請(qǐng)注意:替換為你的 API KEY" # 配置自己的 API Key
openai.api_base = 'https://你的反向代理域名-如果有的話/v1' # 請(qǐng)注意后面 /v1 不可省略
# 如果沒(méi)有自己的反向代理 你還需要設(shè)置你掛的魔法
# proxies = {'http': "http://127.0.0.1:7890", 'https': "https://127.0.0.1:7890"}
# openai.proxy = proxies
df = pd.read_excel("./citycode/city.xlsx")
city2code = {k: v for k, v in zip(df["區(qū)域"], df["區(qū)域編號(hào)"])}
prompt = "今天北京的天氣怎么樣?"
print("Prompt:")
print(prompt)
my_function = [{"name": "get_current_weather",
"description": "獲取給定位置的當(dāng)前天氣",
"parameters": {"type": "object",
"properties": {"location": {"type": "string", "description": "城市,例如北京"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["location"]
}
}
]
# LLMs as Controller
# 據(jù)你給出的函數(shù)描述,理解你的函數(shù)輸入輸出格式要求,把用戶的自然語(yǔ)言轉(zhuǎn)化成本地${/}$第三方函數(shù)的輸入?yún)?shù)和確定調(diào)用那個(gè)函數(shù)。然后開(kāi)發(fā)者需要拿著這個(gè)參數(shù)自己執(zhí)行一下,得到一個(gè)結(jié)果再還給 ChatGPT,ChatGPT 最后會(huì)根據(jù)這個(gè)結(jié)果回答用戶的問(wèn)題,輸出最終內(nèi)容。
resp1 = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",
messages=[{"role": "user", "content": prompt}],
temperature=0.0,
max_tokens=3072,
functions=my_function,
)
params = ast.literal_eval(resp1.choices[0].message.function_call["arguments"])
call_fuction = resp1.choices[0].message.function_call["name"]
if call_fuction == "get_current_weather":
weather_data = get_current_weather(params["location"])
resp2 = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",
messages=[{"role": "user", "content": prompt},
{"role": "assistant", "content": "null", "function_call": resp1.choices[0].message.function_call},
{"role": "function", "name": "call_fuction", "content": str(weather_data)}
],
temperature=0.0,
max_tokens=3072,
functions=my_function,
)
print("-" * 99)
print(resp2.choices[0].message.content)
這段代碼主要實(shí)現(xiàn)了以下功能:
- 引入了需要用到的庫(kù),包括 ast、json、requests、pandas、openai,以及 pprint 模塊的 pprint 函數(shù)。
- 定義了
get_current_weather
函數(shù),該函數(shù)接受一個(gè)參數(shù)city
,并返回一個(gè)字典對(duì)象,包含當(dāng)?shù)氐奶鞖庑畔ⅰ?/li> - 配置了 OpenAI 的 API Key 和 API Base。
- 從 Excel 文件中讀取了城市數(shù)據(jù),并將城市和編號(hào)映射為一個(gè)字典
city2code
。 - 定義了一個(gè)字符串變量
prompt
,表示用戶的對(duì)話詢問(wèn)。 - 定義了一個(gè)名為
my_function
的列表,其中包含一個(gè)名為get_current_weather
的字典對(duì)象,描述了返回值的數(shù)據(jù)結(jié)構(gòu)和輸入?yún)?shù)的類型等信息。 - 調(diào)用 OpenAI 的
ChatCompletion.create
函數(shù),傳入一些參數(shù),返回一個(gè) OpenAI 對(duì)話的響應(yīng)結(jié)果resp1
,其中包含對(duì)話的輸出及調(diào)用的函數(shù)名稱和參數(shù)。 - 解析
resp1
響應(yīng)結(jié)果中的參數(shù)信息,判斷調(diào)用的函數(shù)名稱是否為get_current_weather
,如果是則調(diào)用該函數(shù)獲取當(dāng)?shù)靥鞖庑畔ⅰ?/li> - 再次調(diào)用 OpenAI 的
ChatCompletion.create
函數(shù),不同的是帶入了調(diào)用的函數(shù)名稱和返回的天氣信息,返回 OpenAI 對(duì)話的響應(yīng)結(jié)果resp2
。 - 打印出
resp2
響應(yīng)結(jié)果中的內(nèi)容,即機(jī)器人回復(fù)的信息。
結(jié)果如下示意:
三、總結(jié)
所謂的「函數(shù)調(diào)用」功能,并不是說(shuō) GPT API 會(huì)幫你執(zhí)行某些第三方的功能或接口,而是說(shuō),通過(guò)提交給 GPT 函數(shù)的名稱、描述和輸入?yún)?shù),它能夠在語(yǔ)義中理解應(yīng)該調(diào)用哪一個(gè)函數(shù)去滿足用戶功能,如果此時(shí)的語(yǔ)境中缺少函數(shù)必需的參數(shù),GPT 會(huì)進(jìn)一步與用戶對(duì)話要求補(bǔ)全信息;當(dāng)滿足函數(shù)調(diào)用條件時(shí),GPT 會(huì)返回一個(gè)結(jié)果,告訴開(kāi)發(fā)者此時(shí)需要調(diào)用的函數(shù)名和相應(yīng)的參數(shù);然后開(kāi)發(fā)者自行執(zhí)行本地/第三方函數(shù),并將結(jié)果再次輸入給 GPT API,GPT API 則會(huì)根據(jù)返回值告訴用戶結(jié)果。
我們必須先理解了這個(gè)過(guò)程,至于具體的代碼很容易實(shí)現(xiàn)。從上面這段話抽取一下工作流程:
- GPT 根據(jù)開(kāi)發(fā)者給出的函數(shù)描述,理解函數(shù)功能和輸入?yún)?shù)要求;
- GPT 理解用戶的自然語(yǔ)言,決定此時(shí)是否需要調(diào)用某函數(shù),并從對(duì)話中抽取信息轉(zhuǎn)化成本地/第三方函數(shù)的輸入?yún)?shù);
- 如果此時(shí)缺少必要信息,GPT 會(huì)繼續(xù)與用戶對(duì)話詢問(wèn)補(bǔ)全;
- 開(kāi)發(fā)者拿到函數(shù)名和參數(shù)后,自己本地執(zhí)行,得到一個(gè)結(jié)果再還給GPT;
- GPT 最后會(huì)根據(jù)這個(gè)結(jié)果回答用戶的問(wèn)題。
示意圖如下所示(圖片來(lái)自知乎@段小草):
GPT API 是介于開(kāi)發(fā)者和用戶直接的「翻譯官」,干兩件事:
- 把「用戶」的自然語(yǔ)言 → 合適的函數(shù)功能和參數(shù) → 返回給「開(kāi)發(fā)者」
- 把「開(kāi)發(fā)者」接口返回的數(shù)據(jù)(一般是 JSON)→ 自然語(yǔ)言 → 返回給「用戶」
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-494820.html
??? 參考鏈接:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-494820.html
- OpenAI 重磅更新 變得更強(qiáng)啦 | 包括更多可控的 API 模型、函數(shù)調(diào)用能力、更長(zhǎng)的上下文和更低的價(jià)格
- OpenAI API 0613 更新:GPT-3.5-turbo-16k 模型、函數(shù)調(diào)用能力、更低的調(diào)用價(jià)格
- 知乎 | OpenAI 重磅更新,API 添加新函數(shù)調(diào)用能力,能處理更長(zhǎng)上下文,價(jià)格又降了 75%,有哪些影響?
- Python 實(shí)現(xiàn)天氣查詢功能(外加 Excel 技巧)
- 免費(fèi)的天氣 API 相關(guān)編碼(中國(guó)城市代碼檢索)
- 沈向洋:致 AI 時(shí)代的我們 —— 請(qǐng)不要忽視寫(xiě)作的魅力
到了這里,關(guān)于Python ChatGPT API 新增的函數(shù)調(diào)用功能演示的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!