Function Call 是 openai 6 月份推出的一个新功能,可以把 GPT 作为输入输出,中间数据的处理生成由外部处理。
理解
Function Call 比较好理解
- 定义函数,供 GPT 选择调用
- GPT 作为输入端,提取用户的输入作为参数,调用自定义的函数
- GPT 语义化输出函数的内容
举例
// openai function call example
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: "", // 你的 key});
// 被调用的函数,这里是静态数据
function getCurrentWeather(location, unit = "fahrenheit") {
const weatherInfo = {
"location": location,
"temperature": "22",
"unit": unit,
"forecast": ["sunny", "windy"],
};
return JSON.stringify(weatherInfo);
}
async function runConversation() {
// Step 1: 发生消息给 GPT
const messages = [{"role": "user", "content": "今天的天气怎么样?"}];
const functions = [
{
// 定义函数名称
"name": "get_current_weather",
// 定义函数的作用
"description": "Get the current weather in a given location,没有地点,需要询问用户",
// 描述函数接受的参数的 JSON 架构对象
// https://json-schema.org/understanding-json-schema
"parameters": {
"type": "object",
// 函数参数
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string", "enum": ["celsius"]},
},
// 函数参数是否必传
"required": ["location"],
},
}
];
const response = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: messages,
// 注意,这里新增了 function 参数
functions: functions,
function_call: "auto", // auto is default, but we'll be explicit
});
const responseMessage = response.choices[0].message;
// Step 2: 检查返回的消息是否包含函数调用
if (responseMessage.function_call) {
// Step 3: 调用函数
// Note: the JSON response may not always be valid; be sure to handle errors
const availableFunctions = {
get_current_weather: getCurrentWeather,
}; // only one function in this example, but you can have multiple
const functionName = responseMessage.function_call.name;
const functionToCall = availableFunctions[functionName];
const functionArgs = JSON.parse(responseMessage.function_call.arguments);
const functionResponse = functionToCall(
functionArgs.location,
functionArgs.unit,
);
// Step 4: 把函数返回结果发送给 GPT messages.push(responseMessage); // extend conversation with assistant's reply
messages.push({
"role": "function",
"name": functionName,
"content": functionResponse,
});
// 获取 GPT 的转换之后的回复。
const secondResponse = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: messages,
}); // get a new response from GPT where it can see the function response
return secondResponse;
}
}
runConversation().then(console.log).catch(console.error);
functions 函数有三个主参数:name、description 和 parameters。模型使用 description 参数来确定何时以及如何调用函数,需要提供说明。
parameters 是描述函数接受的参数的 JSON 架构对象。可以在 JSON 架构参考 中详细了解 JSON 架构对象。
对话举例:
user - 今天天气怎么样
gpt - 请给出你的城市
user - 无锡
gpt - (调用函数)今天天气晴
user - 无锡今天天气怎么样
gpt - (调用函数)今天天气晴
使用场景
可以极大的扩展GPT的使用场景,可以相对安全的输出内容。
- 客服场景:根据关键词触发相关的回答
- 搜索:根据关键词进行搜索,比如搜索语雀等知识库,输出相关内容
参考
如何将函数调用与 Azure OpenAI 服务配合使用 - Azure OpenAI Service | Microsoft Learn
Function calling and other API updates