1. 概述

在这个教程中,我们将学习如何在Spring Boot应用中调用OpenAI的ChatGPT API。我们将创建一个Spring Boot应用,用于根据提示调用OpenAI ChatGPT API生成响应。

2. OpenAI ChatGPT API

2.1. API参数与认证

在开始教程之前,让我们了解一下本教程中将使用的OpenAI ChatGPT API。我们将使用聊天完成API 来生成对提示的响应。

  • 模型 - 这是发送请求的目标模型版本。有多个模型可供选择,如gpt-3.5-turbo。我们将使用公开可用的最新版本。
  • 消息 - 消息是对模型的提示。每个消息需要两个字段:rolecontentrole 字段指定了消息的发送者,请求时为“user”,响应时为“assistant”。content 字段是实际的消息内容。

为了与API进行身份验证,我们需要生成一个OpenAI API密钥。在调用API时,我们将设置此密钥到Authorization头。

示例的cURL格式请求如下:

$ 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": "Hello!"}]
  }'

此外,API还接受一些可选参数以调整响应:

  • n - 如果希望生成更多响应,可以指定。默认值为1。
  • temperature - 控制响应的随机性。默认值为1(最随机)。
  • max_tokens - 用于限制响应的最大令牌数。默认值为无穷大,表示响应将尽可能长。通常,设置一个合理的值可避免生成过长的响应并节省费用。

2.2. API响应

API响应将是一个JSON对象,包含一些元数据和一个choices字段。choices字段将是一个对象数组,每个对象都有一个text字段,包含对提示的响应。

choices数组中的对象数量将等于请求中的可选n参数。如果没有指定nchoices数组将只包含一个对象。

下面是一个示例响应:

{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "\n\nHello there, how may I assist you today?"
    },
    "finish_reason": "stop"
  }],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21
  }
}

响应中的usage字段将包含提示和响应中使用的令牌数,用于计算API调用的成本。

3. 代码示例

我们将创建一个Spring Boot应用,使用OpenAI ChatGPT API。为此,我们将创建一个处理HTTP请求的Spring Boot REST API,接收提示作为请求参数,将其传递给OpenAI ChatGPT API,并将响应作为响应体返回。

3.1. 依赖项

首先,创建一个Spring Boot项目,需要spring-boot-starter-web依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3.2. DTOs

接下来,创建对应OpenAI ChatGPT API请求参数的DTO:

public class ChatRequest {

    private String model;
    private List<Message> messages;
    private int n;
    private double temperature;

    public ChatRequest(String model, String prompt) {
        this.model = model;
        
        this.messages = new ArrayList<>();
        this.messages.add(new Message("user", prompt));
    }

    // getters and setters
}

同样,定义Message类:

public class Message {

    private String role;
    private String content;

    // constructor, getters and setters
}

为响应创建另一个DTO:

public class ChatResponse {

    private List<Choice> choices;

    // constructors, getters and setters
    
    public static class Choice {

        private int index;
        private Message message;

        // constructors, getters and setters
    }
}

3.3. 控制器

接下来,创建一个控制器,接受提示作为请求参数,并将响应作为响应体返回:

@RestController
public class ChatController {
    
    @Qualifier("openaiRestTemplate")
    @Autowired
    private RestTemplate restTemplate;
    
    @Value("${openai.model}")
    private String model;
    
    @Value("${openai.api.url}")
    private String apiUrl;
    
    @GetMapping("/chat")
    public String chat(@RequestParam String prompt) {
        // create a request
        ChatRequest request = new ChatRequest(model, prompt);
        
        // call the API
        ChatResponse response = restTemplate.postForObject(apiUrl, request, ChatResponse.class);
        
        if (response == null || response.getChoices() == null || response.getChoices().isEmpty()) {
            return "No response";
        }
        
        // return the first response
        return response.getChoices().get(0).getMessage().getContent();
    }
}

代码关键部分:

  • 使用@Qualifier注解注入一个RestTemplate bean,我们将在下一节中创建。
  • 使用RestTemplate bean,通过postForObject()方法调用OpenAI ChatGPT API,该方法接受URL、请求对象和响应类作为参数。
  • 最后,读取响应的choices列表并返回第一条回复。

3.4. RestTemplate

接下来,定义一个自定义RestTemplate bean,它将使用OpenAI API密钥进行身份验证:

@Configuration
public class OpenAIRestTemplateConfig {

    @Value("${openai.api.key}")
    private String openaiApiKey;

    @Bean
    @Qualifier("openaiRestTemplate")
    public RestTemplate openaiRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getInterceptors().add((request, body, execution) -> {
            request.getHeaders().add("Authorization", "Bearer " + openaiApiKey);
            return execution.execute(request, body);
        });
        return restTemplate;
    }
}

在这里,我们在基础RestTemplate上添加了一个拦截器,并添加了Authorization头。

3.5. 配置

最后,在application.properties文件中提供API的配置:

openai.model=gpt-3.5-turbo
openai.api.url=https://api.openai.com/v1/chat/completions
openai.api.key=your-api-key

4. 运行应用

现在我们可以运行应用并在浏览器中测试它:

如图所示,应用根据提示生成了响应。请注意,由于模型生成,响应可能会有所不同。

5. 总结

在这篇教程中,我们探索了如何使用OpenAI ChatGPT API生成对提示的响应。我们创建了一个Spring Boot应用,该应用调用API来生成对提示的响应。

本教程的代码示例可在GitHub上找到。