SpringBoot 集成 ChatGPT,实战附源码

1 前言

在本文中,我们将探索在 Spring Boot 应用程序中调用 OpenAI ChatGPT API 的过程。我们的目标是开发一个 Spring Boot 应用程序,能够利用 OpenAI ChatGPT API 生成对给定提示的响应。

您可能熟悉 ChatGPT 中的术语"提示"。在 ChatGPT 或类似语言模型的上下文中,提示是指用户提供的用于生成响应的输入或初始文本。它是您输入到模型中以获得相关输出的文本或查询。

提示本质上是作为语言模型理解和生成连贯响应的指令或起点。提示的质量和清晰度会显著影响模型提供准确且相关的信息或响应的能力。

2 什么是 ChatGPT?

我向 ChatGPT 提出了这个问题,看看它会产生什么反应。

ChatGPT 是一种生成式人工智能,允许用户输入提示并接收类似人类的图像、文本或视频形式的输出,所有这些都是由人工智能生成的。

ChatGPT 目前使用 GPT-3.5 模型,通过微调过程改进算法。然而,增强版本 ChatGPT Plus 包含了 GPT-4 模型。此升级版本拥有更快的响应时间,支持互联网插件,并展示了处理图像描述、图像标题生成等复杂任务的改进功能。

OpenAI 将 GPT-4 描述为比其前身 GPT-3.5 先进十倍。这一进步使模型能够表现出更好的上下文理解和细微差别,从而导致更精确和连贯的响应。

3 OpenAI ChatGPT API

我们将调用create chat completion API (POST https://api.openai.com/v1/chat/completions )来生成对提示的响应。让我们探索一下 OpenAI ChatGTP API。

我们需要发送什么请求来调用 OpenAI API?

访问"create chat completion API " 链接后,可以看到有关端点、请求和响应的以下信息。

端点:POST https://api.openai.com/v1/chat/completions

转到 Playgroud 并输入任何消息,例如"什么是 Spring Boot?"

现在点击"查看代码"。您将看到提示符" What is spring boot?"的 curl 命令。"。

复制命令并导入到postman客户端中。

这是我们传递的请求,用于从 OpenAI 完成 API 获取响应。

检查 API 的基本请求参数:

  1. Model: 该参数指定请求将发送到的模型的版本。存在各种模型版本,为此,我们将使用 gpt-3.5-turbo 模型,这是最新的公开版本。
  2. Messages: 该参数作为模型的提示。每条消息都包含两个基本字段:"role"和"content"。"role"字段指定消息发送者,在请求中表示为"用户",在响应中表示为"助理"。"content"字段包含实际的消息内容。

ModelMessage 是 API 请求中必须包含的参数。

其他可选参数包括:

  1. n: 默认值为1,表示为每个输入消息生成的响应数。
  2. temperature: 默认值为1,范围为0到2。该参数调节响应的随机性。较高的值会增加随机性,而较低的值会增强焦点和确定性。
  3. max_tokens: 默认情况下没有限制,但该参数允许您指定在响应中生成的最大令牌数量。事实证明,它在管理非常大的响应和控制成本方面非常有用。

在 Postman 中发出上述请求时,除非将 OpenAI API 密钥作为不记名令牌传递,否则将发生身份验证失败。必须包含 OpenAI API 密钥作为不记名令牌来验证 OpenAI ChatGPT 完成 API。

4 创建 OpenAI API 密钥

在此注册并创建您自己的 OpenAI API 密钥。

4.1 设置 Spring Boot 应用

现在让我们设置 Spring Boot 应用程序...

我们需要在 pom.xml 中添加以下依赖项

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

在 dtos 包下创建 ChatBotRequest、ChatBotResponse 和 Message DTO:

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChatBotRequest {

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

--------------------

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChatBotResponse {

    private List<Choice> choices;

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class Choice {
        private int index;
        private Message message;
    }
}

--------------------

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {

    private String role;
    private String content;

}

在application.properties文件中添加以下配置:

bash 复制代码
openai.chatgtp.model=gpt-3.5-turbo
openai.chatgtp.api.key=REPLACE_WITH_YOUR_API_KEY
openai.chatgtp.api.url=https://api.openai.com/v1/chat/completions

openai.chatgtp.max-completions=1
openai.chatgtp.temperature=0
openai.chatgtp.max_tokens=100

4.2 RestTemplate配置

在配置包下创建一个类OpenAIChatGtpConfig:

java 复制代码
@Configuration
public class OpenAIChatGtpConfig {

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

    @Bean
    public RestTemplate restTemplate() {

        RestTemplate restTemplate = new RestTemplate();

        restTemplate.getInterceptors().add((request, body, execution) -> {
            request.getHeaders().add("Authorization", "Bearer " + openaiApiKey);
            return execution.execute(request, body);
        });
        
        return restTemplate;
    }
}
  • @Value("${openai.chatgtp.api.key}"):此注释用于从应用程序的属性文件注入值。在本例中,它从属性文件中检索 OpenAI 的 API 密钥。
  • restTemplate.getInterceptors().add(...):配置拦截器RestTemplate。该拦截器被添加到拦截器列表中,负责在发送 HTTP 请求之前对其进行修改。
  • 拦截器 ( (request, body, execution) -> { ... }) 将"Authorization"标头添加到 HTTP 请求中。标头包含格式为"Bearer {apiKey}"的 OpenAI API 密钥。

总之,此配置类设置了一个RestTemplate带有拦截器的 bean,该拦截器将 OpenAI API 密钥添加到"Authorization"标头,确保由此发出的后续 HTTP 请求经过RestTemplate身份验证。

4.3 API控制器

现在,我们可以继续创建 REST 控制器,负责利用之前配置的RestTemplate来发出 API 请求并处理相应的 API 响应。

在controllers包下创建一个类ChatBotController:

java 复制代码
@RestController
public class ChatBotController {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${openai.chatgtp.model}")
    private String model;

    @Value("${openai.chatgtp.max-completions}")
    private int maxCompletions;

    @Value("${openai.chatgtp.temperature}")
    private double temperature;

    @Value("${openai.chatgtp.max_tokens}")
    private int maxTokens;

    @Value("${openai.chatgtp.api.url}")
    private String apiUrl;

    @PostMapping("/chat")
    public BotResponse chat(@RequestParam("prompt") String prompt) {

        BotRequest request = new BotRequest(model,
                List.of(new Message("user", prompt)),
                maxCompletions,
                temperature,
                maxTokens);

        BotResponse response = restTemplate.postForObject(apiUrl, request, BotResponse.class);
        return response;
    }
}

现在我们已经完成了编码。让我们测试一下应用程序...


使用 OpenAI ChatGPT Completion API 我们可以实现什么?

以下是使用 OpenAI Completion API 和 ChatGPT 等模型可以实现的一些功能:

  • 自然语言生成: 您可以出于各种目的生成类似人类的文本,例如内容创建、创意写作等。
  • 文本摘要: 您可以使用该模型来总结长文本或文章,将信息压缩为更短、更容易理解的形式。
  • 语言翻译: 将文本从一种语言翻译成另一种语言。
  • 文本完成: 您可以使用 ChatGPT 来完成句子或段落,这对于填充文本的缺失部分非常有用。
  • 问答: 您可以向模型提出问题,它可以根据给出的上下文提供答案。
  • 对话代理: 开发聊天机器人、虚拟助理或其他对话式人工智能应用程序,以提供客户支持、信息检索或与用户互动。
  • 代码生成: 生成代码片段或通过提供代码示例、解释和解决方案来协助编程任务。
  • 数据输入和表格填写: 使用模型自动填写表格或完成数据输入任务。
  • 创意写作: 生成诗歌、故事或其他创意内容。
  • 语言理解: 分析和理解用户查询或消息中的意图和情绪。
  • 模拟角色: 在虚构角色之间创建对话和互动,以讲故事或开发游戏。
  • 教育援助: 为学生的问题提供解释和答案或帮助完成家庭作业。
  • 内容推荐: 根据用户的偏好和查询向他们推荐内容、产品或服务。
  • 起草电子邮件或文档: 协助撰写电子邮件、报告或其他书面文档。
  • 模拟用户行为: 生成用户评论、评论或反馈以用于测试和培训目的。

这些只是使用 OpenAI Completion API 和 ChatGPT 等模型可以实现的一些示例。这些模型的多功能性使其对于各个行业的广泛应用都很有价值,包括教育、医疗保健、客户服务、内容生成等。请记住,生成的文本的质量可能会根据特定用例和提供给模型的输入数据而有所不同。

5 项目源码

https://github.com/363153421/chatgpt-springboot-integration

相关推荐
QuZero21 小时前
JDK7 ConcurrentHashMap principle
java·哈希算法
腾讯云云开发21 小时前
用 OpenClaw + CloudBase 自动化开发网站:30分钟从安装到上线
后端·ai编程
独断万古他化1 天前
【Java 实战项目】多用户网页版聊天室:消息传输模块 —— 基于 WebSocket 实现实时通信
java·spring boot·后端·websocket·ajax·mybatis
舒一笑1 天前
🚀 我用一行命令,把 OSS 私有文件变成“可直接下载的公网链接”(很多人不会)
后端
yyt3630458411 天前
spring单例bean线程安全问题讨论
java·spring
小兔崽子去哪了1 天前
Docker 安装 PostgreSQL
数据库·后端·postgresql
Sweet锦1 天前
SpringBoot 3.5 集成 InfluxDB 1.8
spring boot·时序数据库
野犬寒鸦1 天前
Redis热点key问题解析与实战解决方案(附大厂实际方案讲解)
服务器·数据库·redis·后端·缓存·bootstrap
我是大猴子1 天前
事务失效的几种情况以及是为什么(详解)
java·开发语言
snakeshe10101 天前
深入理解 Java 注解:从原理到实战
后端