自从chatGPT爆火后,各种第三方接入的聊天机器人都上了一个档次,出于好奇我也决定自己对接他的api弄个聊天机器人玩玩
获取key
通过官方api文档可知,调用接口前必须要有一个key作为鉴权信息,那我们先获取这个key。
点击进入OpenAi官网api页面,点击左上角的Login跳入登录界面(没有账号就注册一个)。
使用java sdk调用
除了http调用,OpenAi有各种语言封装好的sdk可直接使用,这里使用的是java sdk,其他语言可以参考:https://platform.openai.com/docs/libraries/community-libraries
java sdk github地址:https://github.com/TheoKanning/openai-java
第一步:添加maven依赖
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>client</artifactId>
<version>0.9.0</version>
</dependency>
这里artifactId使用api和client都行,client包括api,最新版本可以去maven仓库找
第二步:测试用例
public static void main(String[] args) {
String token = "你申请的key";
// 构建openai api对象,由于处理时间比较长,建议设置一个合理的超时时间
OpenAiService service = new OpenAiService(token, Duration.ofSeconds(60));
CompletionRequest completionRequest = CompletionRequest.builder()
.prompt("如果有一辆车,车里面坐了小明小红小黄,请问车是谁的?")
.model("text-davinci-003")
.temperature(0.9d)
.maxTokens(150)
.stop(Arrays.asList("Human:", "AI:"))
.echo(true)
.build();
service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
}
结果:
实现对话
怎么实现上下文连贯的对话呢,很简单,就是把聊天记录都提交上去,其中需要加上对话双方的名字,双方的对话中间采用\n\n
分割,例如这里我将自己取名为Human
,将机器人取名为AI
,名称后面紧跟着冒号,冒号后面表示人物说的内容,结尾使用AI:
,表示需要机器人接着回答:
public static void main(String[] args) {
String token = "你申请的key";
// 构建openai api对象,由于处理时间比较长,建议设置一个合理的超时时间
OpenAiService service = new OpenAiService(token, Duration.ofSeconds(60));
CompletionRequest completionRequest = CompletionRequest.builder()
.prompt("Human:如果有一辆车,车里面坐了小明小红小黄,请问车是谁的?\n\nAI:")
.model("text-davinci-003")
.temperature(0.9d)
.maxTokens(150)
.stop(Arrays.asList("Human:", "AI:"))
.echo(true)
.build();
service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
}
结果:
输入:
.prompt("Human:如果有一辆车,车里面坐了小明小红小黄,请问车是谁的?\n\nAI:车属于拥有者,也就是谁把车购买来用来坐小明小红小黄。如果拥有者不是小明小红小黄中的任何一个人,那么车就属于那个拥有者。\n\nHuman:不对,车属于“如果”的\n\nAI:")
结果:
参数解析
官方对参数的解释:https://platform.openai.com/docs/api-reference/completions/create
prompt:你需要提问的问题,或者对话内容
temperature:我把他理解为回答的准确性,介于0-2之间,越大回答与问题越不想干,可以认为思想越跳越,这里建议取0.9
model:模型,模型有很多,可以都尝试一下,在上面参数解释旁边就可以选
maxTokens:可以理解为回答结果的分词数量,越小输出的答案字数越少,这里是指答案返回的字数少,而不是答案更简洁的文字输出
echo:输出是否携带上下文,设置为false则只输出最后一个问题的回答