Openai function_calling不执行该函数

Openai function_calling not execute the function

提问人:SkyBest I 提问时间:11/11/2023 更新时间:11/14/2023 访问量:41

问:

使用函数调用,openai 不会执行函数,而是打印带有参数的函数,请参见下文:

我在 colab 中使用本地 LLM (Llama2)。

已安装 OpenAI 版本 0.27.8

!pip install openai==0.27.8

os.environ['OPENAI_API_KEY'] = 'NULL'
os.environ['OPENAI_API_BASE'] = "http://localhost:8000/v1"

#import OpenAI from "openai";
openai.api_base = os.getenv('OPENAI_API_BASE')
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.api_version = "2023-07-01-preview"

这里的功能:

def get_current_weather(location):
"""Get the current weather in a given location"""

url = "https://weatherapi-com.p.rapidapi.com/forecast.json"

querystring = {"q":location, "days":"1"}

headers = {
    "X-RapidAPI-Key": "xxxxx",
    "X-RapidAPI-Host": "weatherapi-com.p.rapidapi.com"
}

response = requests.get(url, headers=headers, params=querystring)

weather_info = {
    "location": response.json()['location']['name'],
    "temperature": response.json()['current']['temp_c'],
}

print(json.dumps(weather_info))

return json.dumps(weather_info)

它返回以下结果:

response=get_current_weather('Naples, Italy')
{"location": "Naples", "temperature": 17.0}

这里是函数的架构

function_descriptions = [{
    "name": "get_current_weather",
    "description": "Get the current weather",
    "parameters": {
        "type": "object",
        "properties": {
            "location": {
                "type": "string",
                "description": "The city and state, e.g. San Francisco, CA"
            },
        },
        "required": ["location"],
    },
}]

聊天到此结束

completion = openai.ChatCompletion.create(
model="gpt-35-turbo-0613",
messages=[{"role": "user", "content": user_prompt}],
functions=function_descriptions,
function_call={"name": "get_current_weather"}
#function_call="auto"
)
output = completion.choices[0].message
print(output)
{
   "role": "assistant",
   "content": "Ah, thank you for asking! The current temperature in Naples, Italy is approximately {get_current_weather({location: \"Naples, Italy\"})}. Would you like me to tell you more about the weather there?<|END_OF_ASSISTANT|></s>"
 }

为什么它不执行函数,而只是打印调用 {get_current_weather({location: “那不勒斯,意大利”})} ???

openai-api 函数调用 大语言模型

评论


答:

1赞 Daniel Benzaquen 11/14/2023 #1

大型语言模型 (LLM) 无法直接运行代码。他们的专长在于处理和生成文本,其中包括代码片段,但不会扩展到实际执行。如果目标是执行代码,则有两种选择:

  • 服务器端执行: 在这种方法中,代码在 OpenAI 或 Google 等实体拥有的服务器上执行。但是,由于存在任意代码执行的风险,此方法会带来安全问题。需要注意的是,您并没有将实际函数传递给模型,而只是在 中提供了描述。get_current_weatherfunction_descriptions

  • 客户端处理: 许多公司选择客户端处理,其中模型标识的参数被发送到客户端,以便用户可以处理(参数的功能选择和识别是该功能的实际好处)。为此,需要在客户端仔细管理模型的输出。 收到模型的响应后,可以通过检查 来解析结果。如果您正在使用并且模型确定需要函数调用,则返回 .您可以使用此信息智能地解析输出并在服务器上执行代码,从而保持对执行过程的控制。finish_reasonresponse.choices[0].finish_reasonfunction_call="auto"finish_reason='function_call'