总结/朱季谦
趁着这周末空闲时间,在研读完OpenAi官网文档的根底上,及时总结了这篇**《ChatGPT API接口编程根底与运用技巧》**。
本文大部分内容是环绕编程方面,包括ChatGPT模型接口、图画生成接口、灵敏数据阻拦等,只有一小部分内容环绕怎么经过temperature调参优化运用提示技巧。
一、OpenAi Api调用库
OpenAi敞开了一系列模型接口API,包括ChatGPT、图画生成、音频、文件、灵敏数据阻拦等。
若要集成这些模型接口调用到我们开发的体系里,能够经过多种编程语言的HTTP恳求与openai API交互。现在OpenAi API支撑多种编程语言调用,各类编程语言对应的接口调用库都能在OpenAi官网找到官方推荐的开源库。
我在本文里首要介绍Java、Go、Python、Node.js这四种,其余详细依靠办法和运用,感兴趣的童鞋可自行去官网进一步研讨。
1.1、Java
官方推荐的是Theo Kanning开源的openai-java 。我用来集成到SpringBoot项目的依靠库,正好也是用了这款openai-java。
1.1.1、首先,需求在Maven引入以下依靠——
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>service</artifactId>
<version>0.11.1</version>
</dependency>
1.1.2、装置完结后,能够参阅以下的代码事例,经过绑定密钥来调用chatGPT模型——
@GetMapping("/ai")
public void sendMsg() throws InterruptedException {
System.out.println("开始发问题~");
//GPT_TOKEN即你的代码密钥
OpenAiService service = new OpenAiService(GPT_TOKEN,Duration.ofSeconds(10000));
CompletionRequest completionRequest = CompletionRequest.builder()
//运用的模型
.model("text-davinci-003")
//输入提示语
.prompt("你是一个作业帮手,请帮忙规划一份活动策划书")
//该值越大每次回来的成果越随机,即类似度越小,可选参数,默认值为 1,取值 0-2
.temperature(0.5)
//回来成果最大分词数
.maxTokens(2048)
//与temperature类似
.topP(1D)
.build();
service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
Thread.sleep(6000);
}
需求留意的是,若是布置在有”魔法署理”的Linux云服务商,代码需求相应做一下调整,否则是无法访问到ChatGPT的,只会呈现以下反常提示:
java.net.ConnectException:Failed to connect to api.openai.com/2a03:2880:f10c:283:face:b00c:0:25de:443]
当日我在这个问题上就踩了一个坑。
解决的办法很简单,只需求做以下调整——
public void send1Msg() throws InterruptedException {
System.out.println("开始发问题~");
//需求额外设置一个能访问chatGPT的魔法访问署理
ObjectMapper mapper = defaultObjectMapper();
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8889));
OkHttpClient client = defaultClient(GPT_TOKEN,Duration.ofSeconds(10000))
.newBuilder()
.proxy(proxy)
.build();
Retrofit retrofit = defaultRetrofit(client, mapper);
OpenAiApi api = retrofit.create(OpenAiApi.class);
//将设置的署理传给OpenAiService即可
OpenAiService service = new OpenAiService(api);
CompletionRequest completionRequest = CompletionRequest.builder()
.model("text-davinci-003")
.prompt("你是一个作业帮手,情帮忙规划一份活动策划书,规划一份活动策划书")
.temperature(0.5)
.maxTokens(2048)
.topP(1D)
.build();
service.createCompletion(completionRequest).getChoices().forEach(System.out::println);
Thread.sleep(6000);
}
1.2、Go
官方推荐的是sashabaranov开源的go-gpt3 。
1.2.1、需求先装置以下依靠包——
go get github.com/sashabaranov/go-openai
1.2.2、该开源项目供给的参阅事例如下——
package main
import (
"context"
"fmt"
openai "github.com/sashabaranov/go-openai"
)
func main() {
client := openai.NewClient("your token")
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT3Dot5Turbo,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleUser,
Content: "Hello!",
},
},
},
)
if err != nil {
fmt.Printf("ChatCompletion error: %v\n", err)
return
}
fmt.Println(resp.Choices[0].Message.Content)
}
1.3、Python
先下载Python版别的open库——
$ pip install openai
装置完结后,能够参阅以下的代码事例,经过绑定密钥来调用chatGPT模型——
import os
import openai
# Load your API key from an environment variable or secret management service
openai.api_key = os.getenv("OPENAI_API_KEY")
response = openai.Completion.create(model="text-davinci-003", prompt="Say this is a test", temperature=0, max_tokens=7)
1.4、Node
先下载Node版别的openai库——
$ npm install openai
装置完结后,能够参阅以下的代码事例,经过绑定密钥来调用chatGPT模型——
const { Configuration, OpenAIApi } = require("openai");
const configuration = new Configuration({
apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
const response = await openai.createCompletion({
model: "text-davinci-003",
prompt: "Say this is a test",
temperature: 0,
max_tokens: 7,
});
二、密钥认证
OpenAi API是需求运用API密钥进行认证访问。密钥获取办法,需求登录platform.openai.com/account/api…
接着点击【Create new secret key】生成一个新的密钥,需求留意一点是,该密钥生成时就得保存下来,否则往后是无法再进行检查的,例如,我的密钥库里先前已有一条密钥,但现在无法再去确认这条密钥是什么了。
趁便提一点是,chatGPT是有免费额度的,调用API会消耗掉这些额度,我们能够在点击左面菜单【Usage】检查——
在调用OpenAi的API恳求时,需求在HTTP恳求报头中包括该API密钥,例如——
Authorization: Bearer OPENAI_API_KEY
三、GPT恳求设置
官方供给了一个curl经过密钥调用API的恳求事例,需求将事例里的$OPENAI_API_KEY替换为自己的API密钥,在开启了署理的服务器上运行,能够根据该事例测验服务器是否能正常调用到ChatGPT——
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "这是一个测验恳求!"}],
"temperature": 0.7
}'
我在自己的服务器上运行了,回来成果如下——
这个恳求表明,查询gpt-3.5-turbo模型完结文本处理,提示语为”这是一个测验恳求!”,呼应成果如下——
{
"id": "chatcmpl-75U8z1PVwDb0pA0EPhOMZVC1q7q11",
"object": "chat.completion",
"created": 1681541869,
"model": "gpt-3.5-turbo",
"usage": {
"prompt_tokens": 14,
"completion_tokens": 46,
"total_tokens": 60
},
"choices": [{
"message": {
"role": "assistant",
"content": "您好,这是一个回复测验恳求的信息。请问您有什么需求测验的详细内容或问题吗?我会尽力帮助您解决问题。"
},
"finish_reason": "stop",
"index": 0
}]
}
Request body各字段阐明——
四、开发中增加灵敏信息审阅层
首先得提一下2023年4月11日网信发布的一份《生成式人工智能服务管理办法(征求意见稿)》,里面第四条清晰表明,生成式人工智能算法或服务应当遵守法律法规的要求,尊重社会公德、公序良俗。这就意味着,未来在运用这类Ai接口进行输入/输出时,有必要针对内容进行违规内容信息的过滤。
其实OpenAi有针对这块内容审阅供给了敞开的API接口,能够免费运用。
若想在谈天API的输出中增加一个灵敏信息阻拦层,就能够在输入/输出信息时,调用该接口。例如,存在这样一份API接口调用事例——
curl https://api.openai.com/v1/moderations \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{"input": "测验一句话"}'
呼应回来内容如下——
{
"id": "modr-75k0nHCOc0SR88t9xCNBHctPDMO8d",
"model": "text-moderation-004",
"results": [{
"flagged": false,
"categories": {
"sexual": false,
"hate": false,
"violence": false,
"self-harm": false,
"sexual/minors": false,
"hate/threatening": false,
"violence/graphic": false
},
"category_scores": {
"sexual": 0.00012780998076777905,
"hate": 0.00013749735080637038,
"violence": 1.4757171129531343e-07,
"self-harm": 5.410008441231184e-09,
"sexual/minors": 1.5541245375061408e-06,
"hate/threatening": 6.1530336381565576e-09,
"violence/graphic": 2.9580141003293647e-08
}
}]
}
- flagged:假如模型将内容归于违反OpenAI的运用战略,则设置为true,否则为false。
- categories:包括每个类别二进制运用战略违反标志的字典。关于每个字段值,假如模型将相应类别标记为违规矩该值为true,否则为false。
- category_scores:包括模型输出的每个类别原始分数的字典,表明模型是否相信输入了违反OpenAI对类别的战略。该值介于0和1之间,其中值越大表明置信度越高。留意一点是,分数不应被解释为概率。
categories和category_scores详细字段值对应的阐明如下表格所示——
官方表明现在该审阅接口仍在不断努力提高分类器的准确性,特别是仇恨、自残和暴力等内容的分类。值得留意一点是,对非英语语言的支撑现在是有限的,也就是说,中文的审阅支撑比较有限。
除了运用OpenAi供给的输入/输出信息审阅接口,还能够开发灵敏词过滤体系,将传给ChatGPT以及呼应回来的数据,进行灵敏词过滤。
四、模型调用
4.1、模型列表
OpenAi供给了多种模型,能够经过执行以下查询指令,查询出API支撑的模型类型——
curl https://api.openai.com/v1/models -H "Authorization: Bearer $OPENAI_API_KEY"
呈现出来的成果如下,应该稀有十个模型,我用的最多是gpt-3.5-turbo,这是现在比较规范的型号版别——
{
"data": [
{
"id": "text-davinci-003",
"object": "model",
"created": 1669599635,
"owned_by": "openai-internal",
"permission": [...],
"root": "text-davinci-003",
"parent": null
},
{
"id": "gpt-3.5-turbo",
"object": "model",
"created": 1677610602,
"owned_by": "openai",
"permission": [...],
"root": "gpt-3.5-turbo",
"parent": null
},
.....
],
"object": "list"
}
4.2、查询指定GPT模型概况
能够根据以上模型类表接口,查询出详细模型实例的概况,包括模型的基本信息、所有者及权限等——
curl https://api.openai.com/v1/models/gpt-3.5-turbo \
-H "Authorization: Bearer $OPENAI_API_KEY"
查询出gpt-3.5-turbo的模型概况如下——
{
"id": "gpt-3.5-turbo",
"object": "model",
"created": 1677610602,
"owned_by": "openai",
"permission": [
{
"id": "modelperm-BmdmcAa1aQwToDxri3DFbZw9",
"object": "model_permission",
"created": 1681343255,
"allow_create_engine": false,
"allow_sampling": true,
"allow_logprobs": true,
"allow_search_indices": false,
"allow_view": true,
"allow_fine_tuning": false,
"organization": "*",
"group": null,
"is_blocking": false
}
],
"root": "gpt-3.5-turbo",
"parent": null
}
GPT-3.5模型能够理解和生成自然语言或代码,在GPT-3.5版别傍边,最有能力和最具本钱收益的模型是GPT-3.5-turbo,它是根据原有的3.5版别模型进行的迭代优化,能够更好地完结传统使命。现在最新模型是GPT-4,具有更先进的常识和推理能力,但还没有敞开免费API接口。
以下是GPT-3.5模型列表介绍——
官方推荐运用GPT-3.5-turbo而不是其他GPT-3.5模型,由于它的本钱更低。gpt-3.5-turbo的性能与text-davinci-003类似,但每个token的价格是它的10%,官方推荐在大多数情况下运用gpt-3.5-turbo。
五、图画生成调用
给定一个提示和/或一个输入图画,模型会生成一个新的图画,例如,我想让它画一只胖猫——
curl https://api.openai.com/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"prompt": "画一只心爱的大胖猫",
"n": 2,
"size": "1024x1024"
}'
然后,它确实给我画了两张图——
{
"created": 1681547551,
"data": [
{
"url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-LqdibnOuIlW8xc7Lfh2REsXo/user-6D0yIziBFiX73mCUwNwOwczJ/img-jKdFuRLINlkCeFL1QCWFZtId.png?st=2023-04-15T07%3A32%3A31Z&se=2023-04-15T09%3A32%3A31Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-04-15T08%3A28%3A22Z&ske=2023-04-16T08%3A28%3A22Z&sks=b&skv=2021-08-06&sig=Rbe8x3ZdEcoScQOXrkxGAe1G8rGOrO%2B4wzmzZwotP68%3D"
},
{
"url": "?st=2023-04-15T07%3A32%3A31Z&se=2023-04-15T09%3A32%3A31Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-04-15T08%3A28%3A22Z&ske=2023-04-16T08%3A28%3A22Z&sks=b&skv=2021-08-06&sig=KVsxjwPIsJFC0cFEjRqVPrcckGxipp5BiiUmayPmqMM%3D"
}
]
}
经过图url链接,能够检查图片,若是在代码里,能够直接丢给里显示出图片。不过,我让openai给我画的是一只胖猫,图一我还能理解,但是,图二,这个猫屁股着实有些离谱了(自带)……
体会下来,感觉与midjourney仍是有较大差异的,只能说,勉强能用吧。
图画生成接口参数如下——
六、ChatGPT运用技巧和留意事项
6.1、调整temperature参数
我在前文调用API的参数傍边,有提及一个temperature参数,翻译过来叫温度。该参数用于指定生成文本时的随机性和多样性,默认值为1,介于 0 和 2 之间,较高的温度值值(如 0.8)会导致GPT输出内容更随机,而较低的温度值(如 0.2)会使其愈加能够猜测和具备确认性。
打一个比方,ChatGPT中的温度值就艺人演戏——
较低的温度值能够看作是“依照剧本表演”,艺人是什么水平,就表演什么姿态。温度值低生成的文本比较保存和确认,合适需求准确性和连贯性的使命,比如内容摘要、机器翻译等。
较高的温度值能够看成“即兴表演”,生成的文本或许愈加随机和多样性,当然,也或许愈加糟糕,这种情况比较合适用来创作和探索性使命,比如生成对话、创意写作等。
当然,这个temperature参数并非全能的,在某些文本内容傍边,或许简直感触不到太多差别。
若温度值设置为0,那么,模型将总会回来相同或十分类似的内容,当温度高于0时,每次提交相同的提示会导致生成不同内容。官方表明,温度值在0~1之间,基本上能够控制模型生成比较满意的答案。
例如,当用户问询“怎么形容一只胖猫?”时,谈天机器人或许会生成以下不同的回答:
-
温度值为0.5时:“这是一只肥嘟嘟的猫。”
-
温度值为1.0时:“这只猫十分胖,它的身体肥厚且圆润,看上去就像一个小球一样。它的肚子很大,当它走路时会晃来晃去,脸上也有一圈又圆又滑的脂肪。总归,这是一只十分十分胖的猫。”
-
温度值为1.5时:“这只猫的身段简直像是一个小沙发,它的腹部肥厚得简直抬不起来,四肢也变得特别短。当它走路时,身体会晃动,如同随时都或许翻倒。它的脸宽大而且圆润,双颊上还有一圈厚厚的赘肉,看上去适当心爱。总归,这是一只极端肥壮的猫。”
在发问傍边,运用这个参数的办法很简单,只需求在提示语后边跟上“Use a temperature of 0.5”即可——
6.2、传递给API的数据是否会被存储
用户比较关心一个问题是,我们传给ChatGPT的数据是否会被存储。官方表明,自2023年3月1日起,将保存您的API数据30天,但不再运用经过API发送的数据来改进模型。这就意味着,请勿传输涉及个人隐私或许安全相关的信息,避免数据走漏。