先做个广告:如需代注册ChatGPT或充值 GPT4.0会员(plus),请添加站长微信:gptchongzhi
2023年6月,OpenAI模型重磅升级,支持调用本地API了,强悍的大脑不仅有嘴,还要长出手和脚。看到这个升级我有2个疑问:
推荐使用GPT中文版,国内可直接访问:https://ai.gpt86.top
OpenAI如何在服务端调用本地的API。
原来LangChain就已经支持了Tool调用,这次升级和LangChain的Agent的action有什么区别。
带着这2个问题,我看了官方文档后实践了一把,彻底弄清楚了以上疑问,先说结论。
OpenAI不会在服务端调用本地API,只会在合适的时机告诉你需要调用API,并给你调用参数,需要在本地执行调用。你需要把调用结果再发给OpenAI,它会结合你的返回结果来解决问题。
LangChain的工具声明都是通过Prompt实现,OpenAI的API声明提供了专用的Functions参数,鲁棒性会更强。
先做一个小实验,我们用高德API包装一个本地查询当地天气的API,让GPT来调用。
import requests
def get_current_weather(para):
#获取当天的天气预报
city = para["city"]
url = f'https://restapi.amap.com/v3/weather/weatherInfo?parameters'
params = {
'key': get_gaode_key(),#填入自己的高德API
'city': city,
'extensions': 'base',
'output': 'JSON',
'extensions':'all'
}
response = requests.get(url, params=params)
data = response.json()
return data['forecasts'][0]['casts'][0]
调用返回当天的天气预报情况,返回示例如下:
print(get_current_weather({"city":"北京"}))
{'date': '2023-06-17', 'week': '6', 'dayweather': '多云', 'nightweather': '晴', 'daytemp': '38', 'nighttemp': '22', 'daywind': '东南', 'nightwind': '东南', 'daypower': '≤3', 'nightpower': '≤3', 'daytemp_float': '38.0', 'nighttemp_float': '22.0' }
按照OpenAI的说明,定义一下这个API
functions = [ { "name": "get_current_weather", "description": "获取一个城市的当前天气", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名称" } }, "required": ["city"] } },]
调用最新升级的gpt-3.5-turbo-0613模型,增加functions参数
import openai
import json
def get_completion_from_messages(messages,functions, model="gpt-3.5-turbo-0613", temperature=0):
print("-----------------------------------------\n输入messages:"+str(json.dumps(messages, indent=1, ensure_ascii=False)))
print("输入functions:"+str(json.dumps(functions, indent=1, ensure_ascii=False)))
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature, # this is the degree of randomness of the model's output
functions=functions
)
print("输出:"+json.dumps(response, indent=1, ensure_ascii=False))
return response.choices[0]
调用GPT,当调用返回原因为function_call时,根据调用指示,调用本地天气查询API,并将查询结果返回GPT再次调用
#向GPT提问
def ask_gpt(prompt,functions):
#拼接消息
messages = [{"role": "user", "content": prompt}]
#第一轮调用GPT
response = get_completion_from_messages(messages,functions)
#如果返回终止原因是API调用,本地执行
if response['finish_reason'] == "function_call":
arguments = response["message"]["function_call"]["arguments"]
function = response["message"]["function_call"]["name"]
result = eval(f"{function}({arguments})")#根据API名称和参数动态调用本地接口
#把GPT的调用指令和API返回结果再次发送给GPT
messages.append(response["message"])
messages.append( {"role": "function", "name": "get_current_weather", "content":str(result)})
response = get_completion_from_messages(messages,functions)
print(response["message"]["content"])
问GPT“我在成都,今天出门需要带伞吗”
get_completion("我在成都,今天出门要带伞吗",functions)
输入参数:
输入messages:[ { "role": "user", "content": "我在成都,今天出门要带伞吗" }]输入functions:[ { "name": "get_current_weather", "description": "获取一个城市的当前天气", "parameters": { "type": "object", "properties": { "city": { "type": "string", "description": "城市名称" } }, "required": [ "city" ] } }]
输出返回提示我们要调用get_current_weather,输入参数是成都。
输出:{ "id": "chatcmpl-xxx", "object": "chat.completion", "created": 1687006874, "model": "gpt-3.5-turbo-0613", "choices": [ { "index": 0, "message": { "role": "assistant", "content": null, "function_call": { "name": "get_current_weather", "arguments": "{\n \"city\": \"成都\"\n}" } }, "finish_reason": "function_call" } ] }}
以下几句代码,执行调用天气查询接口。
if response['finish_reason'] == "function_call": arguments = response["message"]["function_call"]["arguments"] function = response["message"]["function_call"]["name"] #根据API名称和参数动态调用本地接口 result = eval(f"{function}({arguments})")
再次请求GPT,入参数如下
print(get_current_weather({"city":"北京"}))0
最终输出结果
print(get_current_weather({"city":"北京"}))1
我们在增加一个发送邮件的API,看调用结果
print(get_current_weather({"city":"北京"}))2
print(get_current_weather({"city":"北京"}))3
print(get_current_weather({"city":"北京"}))4
print(get_current_weather({"city":"北京"}))5
print(get_current_weather({"city":"北京"}))6
完整代码如下:
print(get_current_weather({"city":"北京"}))7
网友评论