那些外贸网站个人可以做,微信网页版还能用吗,电子商务网站建设与维护课程标准,网站建议怎么写Function Call 概念
关于 GPT 中API的function参数#xff0c;提供了一些能力 这个函数调用是 Open AI 在2023年的6.13号发布的新能力根据它的官方描述, 函数调用能力可以让模型输出一个请求调用函数的消息其中包含所需调用函数的信息#xff0c;以及调用函数时所需携带的参…Function Call 概念
关于 GPT 中API的function参数提供了一些能力 这个函数调用是 Open AI 在2023年的6.13号发布的新能力根据它的官方描述, 函数调用能力可以让模型输出一个请求调用函数的消息其中包含所需调用函数的信息以及调用函数时所需携带的参数的信息 这种方式是一种将GPT的能力和外部的工具外部的API连接起来的新的方式
函数调用的机制
那么应该如何去使用函数调用 首先我们需要去选择函数调用的新模型用户在构造message参数时候需要主动的告诉模型有哪些函数GPT 知道我们有哪些函数之后根据对于自然语言的理解根据用户的输入GPT会自行的判断何时需要调用这些函数然后会根据目标函数它的描述生成符合要求的请求的参数然后返回给我们我们根据GPT的信息再去调用函数
函数的作用
第一种进行自然语言交流时通过调用外部工具回答问题 通过这种函数调用的能力我们可以将GPT和第三方的工具去进行一个集成形成类似于GPT插件的这种模式 第二种如果我们有特殊的对于自然语言处理的逻辑 我们可以利用GPT, 将自然语言转换成调用API时使用的参数, 或转换成查询数据库时所使用的条件等等 第三种我们可以利用这种能力从文本当中去提取一些结构化的数据这是函数的一些基础的作用。
函数调用的使用
那么我们如何去使用函数调用呢如何在它的聊天API的接口上去添加函数相关的这些参数呢为了实现函数调用的能力, 在API里面有新的请求的参数就是function, function call等等, 在官方的API文档上可以查询在使用之前我们先来了解一下函数调用的步骤 第一步, 当我们去调用函数的时候首先我们需要在请求参数当中向API也就是向GPT去传递信息, 我们要告诉GPT, 我们有哪些可以调用的函数第二步, 我们根据GPT的返回, 我们要去进行解析, 判断模型是不是需要调用函数, 如果不需要我们则不处理 如果需要调用函数我们这里要根据需要调用的函数根据GPT输入的参数去进行调用调用完成之后得到函数调用的结果 最后, 我们再将函数调用的结果添加到GPT的消息列表来告诉GPT
代码实现
参考前文: https://blog.csdn.net/Tyro_java/article/details/134781021
1 新增一些实现类结构如下
src main java com.xxx.gpt.client entity ChatFunction.javaFunctionCallResult.java … test java com.xxx.gpt.client.test FunctionCallTest.java…
ChatFunction.java
package com.xxx.gpt.client.entity;import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;Data
AllArgsConstructor
NoArgsConstructor
Builder
JsonInclude(JsonInclude.Include.NON_NULL)
public class ChatFunction {String name;String description;ChatParameter parameters;DataAllArgsConstructorNoArgsConstructorBuilderJsonInclude(JsonInclude.Include.NON_NULL)public static class ChatParameter {String type;ListString required;Object properties;}
}ChatFunction 类中包含名称描述参数等等字段
FunctionCallResult.java
package com.xxx.gpt.client.entity;import lombok.Data;Data
public class FunctionCallResult {String name;String arguments;
}FunctionCallResult 定义了名称参数的字段
FunctionCallTest.java
package com.xxx.gpt.client.test;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xxx.gpt.client.ChatGPTClient;
import com.xxx.gpt.client.entity.*;
import com.xxx.gpt.client.util.Proxys;
import org.junit.Before;
import org.junit.Test;import java.net.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class FunctionCallTest {private ChatGPTClient chatGPTClient;Beforepublic void before() {Proxy proxy Proxys.http(127.0.0.1, 7890);chatGPTClient ChatGPTClient.builder().apiKey(sk-6kchn0DasdfqOJqkc3aI665ct) // 填入自己的 key.timeout(900).proxy(proxy).apiHost(https://api.openai.com/).build().init();}// 调用gpt的时候带上函数信息让GPT选择是否调用Testpublic void chat() {ListChatFunction functions new ArrayList();ChatFunction function new ChatFunction();function.setName(getCurrentWeather); // 设置函数信息function.setDescription(获取给定位置的当前天气);function.setParameters(ChatFunction.ChatParameter.builder().type(object).required(Arrays.asList(location)).properties(JSON.parseObject({\n \location\: {\n \type\: \string\,\n \description\: \The city and state, e.g. San Francisco, CA\\n },\n \unit\: {\n \type\: \string\,\n \enum\: [\celsius\, \fahrenheit\]\n }\n })).build());// 添加到列表中functions.add(function);// 构造 messageMessage message Message.of(上海的天气怎么样);// 构造调用 api 参数ChatCompletion chatCompletion ChatCompletion.builder().model(Model.GPT_3_5_TURBO_16K.getName()).messages(Arrays.asList(message)).functions(functions).maxTokens(8000).temperature(0.9).build();// 调用ChatCompletionResponse response chatGPTClient.chatCompletion(chatCompletion);ChatChoice choice response.getChoices().get(0);Message res choice.getMessage();System.out.println(res);// 基于 finish reason 判断如果是 function_call 就需要调用函数if (function_call.equals(choice.getFinishReason())) {FunctionCallResult functionCall res.getFunctionCall();String functionCallName functionCall.getName();// 如果需要调用的是 getCurrentWeatherif (getCurrentWeather.equals(functionCallName)) {String arguments functionCall.getArguments();JSONObject jsonObject JSON.parseObject(arguments);String location jsonObject.getString(location);String unit jsonObject.getString(unit);// 得到最终的结果String weather getCurrentWeather(location, unit);res.setContent();// 将结果 weather 告诉GPTcallWithWeather(weather, res, functions);}}}// 将结果传送给GPTprivate void callWithWeather(String weather, Message res, ListChatFunction functions) {Message message Message.of(上海的天气怎么样);Message function1 Message.ofFunction(weather);function1.setName(getCurrentWeather);ChatCompletion chatCompletion ChatCompletion.builder().model(Model.GPT_3_5_TURBO_16K.getName()).messages(Arrays.asList(message, res, function1)).functions(functions).maxTokens(8000).temperature(0.9).build();ChatCompletionResponse response chatGPTClient.chatCompletion(chatCompletion);ChatChoice choice response.getChoices().get(0);Message res2 choice.getMessage();//上海目前天气晴朗气温为 22 摄氏度。System.out.println(res2.getContent());}// 首先我们添加一个函数函数是获取天气的信息这里需要传入 location// return 我们这里的返回值是根据location构造出来的一个JSON, 这里设置的固定的就是模拟接口或者对接天气网站接口都可public String getCurrentWeather(String location, String unit) {return { \temperature\: 22, \unit\: \celsius\, \description\: \晴朗\ };}
}
// 本地有一个函数将函数信息告诉chatgpt并告诉chatgpt什么情况需要调用这个函数。由chatgpt判断是否需要调用该函数如果需要在交互中进行调用。类似于委托机制第一步需要告诉GPT我们有哪些函数也就是这些函数是我们本地定义的第二步是在调用GPT的时候带上函数信息然后让GPT选择是否调用函数第三步解析GPT的返回如果GPT需要调用函数我们在本地根据GPT返回的参数调用函数获取结果在获取结果之后将结果告诉GPT通过GPT的函数调用的一个简单的示例 看到通过 GPT函数调用的这种方式可以将我们本地的一些函数可以和外部的一些第三方的工具做一个更好的集成整体的这个模式就类似于委托的机制 GPT根据我们的自然语言也就是我们的 Prompt 自行去判断是不是需要调用函数如果需要调用的话然后再告诉我们由我们完成调用完成调用之后再将调用的结果返回给它整个过程是我们和GPT的程序上的密切交互