ChatGPT入门实战课 做AI时代更具竞争力的开发者(分享完整版)

183 阅读5分钟

ChatGPT入门实战课 做AI时代更具竞争力的开发者

//xia仔k:百度网盘

一、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,
});

三、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详细字段值对应的阐明如下表格所示——
image.png
官方表示目前该审核接口仍在不时努力进步分类器的精确性,特别是仇恨、自残和暴力等内容的分类。值得留意一点是,对非英语言语的支持目前是有限的,也就是说,中文的审核支持比拟有限。

除了运用OpenAi提供的输入/输出信息审核接口,还能够开发敏感词过滤系统,将传给ChatGPT以及响应返回的数据,停止敏感词过滤。

五、模型调用

5.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"
}

5.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模型列表引见——
image.png

官方引荐运用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": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-LqdibnOuIlW8xc7Lfh2REsXo/user-6D0yIziBFiX73mCUwNwOwczJ/img-00FKmNWnDm5p21CS89UPm56T.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=KVsxjwPIsJFC0cFEjRqVPrcckGxipp5BiiUmayPmqMM%3D"
    }
  ]
}

经过图url链接,能够查看图片,若是在代码里,能够直接丢给里显现出图片。不过,我让openai给我画的是一只胖猫,图一我还能了解,但是,图二,这个猫屁股着实有些离谱了(自带🐶)......