Spring Boot ChatGPT
- ChatGPT настройка и зависимости
- Spring Boot проект с минимальной конфигурацией
- Feign клиент
- RESTful сервис
Содержание
Интеграция Spring Boot с ChatGPT
ChatGPT — это языковая модель, разработанная OpenAI, которая может генерировать человеческие ответы на ввод текста. Spring Boot — это популярная среда Java, упрощающая создание веб-приложений, включая RESTful API. Интегрировав ChatGPT с Spring Boot, вы можете создать чат-бота, который может отвечать на сообщения пользователей на естественном языке.
Чтобы интегрировать Spring Boot с ChatGPT, вам нужно будет сделать следующее:
-
Настройте учетную запись API ChatGPT. Вам потребуется создать учетную запись на веб-сайте API ChatGPT ( https://beta.openai.com/signup/ ), чтобы получить ключ API, который можно использовать для доступа к языковой модели.
-
Добавьте зависимость API ChatGPT в свой проект. Вы можете добавить зависимость API ChatGPT в свой проект Spring Boot, добавив следующие строки в файл pom.xml:
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>api</artifactId>
<version>0.10.0</version>
</dependency>
-
Создайте ендпоинт RESTful API: вам потребуется создать ендпоинт RESTful API, которая может получать сообщения пользователей и генерировать ответы с помощью ChatGPT. Это можно сделать с помощью
@RestController
аннотации Spring Boot. -
Используя Feigh client сделать запрос на сторону ChatGPT сервиса и получить ответ.
-
Верните ответ пользователю: после того, как вы сгенерировали ответ с помощью ChatGPT, вы можете вернуть его как HTTP-ответ пользователю.
Пример интеграции:
Начнем разработку с pom.xml файла, при помощи которого maven организует правильную иерархию папок проекта, скачает все необходимые зависимости и сделает удобным сборку и деплой нашего приложения.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.theokanning.openai-gpt3-java</groupId>
<artifactId>api</artifactId>
<version>0.10.0</version>
</dependency>
<dependency> <groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>12.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
Тут представлен минимальный набор зависимостей для реализации нашей задачи. Далее спроектируем модели данных, которые мы будем использовать в запросах к сервису ChatGPT.
import lombok.Getter;
import lombok.experimental.SuperBuilder;
@Getter
@SuperBuilder
public abstract class PromptRequest {
protected final String prompt;
}
@Getter
@SuperBuilder
public class TextPromptRequest extends PromptRequest {
private final String model;
private double temperature;
@JsonProperty("max_tokens")
private final int maxTokens;
}
Спроектируем клиента, при помощи которого мы будем вызывать сервисы ChatGPT
@FeignClient(name = ChatGprProperties.GPT_CLIENT_NAME, url = "${openai.api-url}",
configuration = FeignConfiguration.class)
public interface ChatGptClient {
@PostMapping(path = "/completions", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
CompletionResult getCompletion(@RequestBody PromptRequest request);
}
Сконфигурируем наш клиент нужным образом
@RequiredArgsConstructor
public class FeignConfiguration {
private final ChatGprProperties chatGprProperties;
@Bean
public OkHttpClient client() {
return new OkHttpClient();
}
@Bean
public RequestInterceptor requestInterceptor() {
String apiKey = chatGprProperties.getApiKey();
String authorization = "Bearer " + apiKey;
return requestTemplate -> {
requestTemplate.header("Authorization", authorization);
};
}
}
Вы может быть заметили класс ChatGprProperties
Это наш класс, который содержит настройки для кастомизации feign client и взаимодействия с сервисами ChatGPT.
@ConfigurationProperties(prefix = "openai")
@Getter
@Setter
public class ChatGprProperties {
public static final String GPT_CLIENT_NAME = "gptApi";
private String apiKey;
private String model;
}
Данные в эти поля попадут из пропети файла application.yml
openai:
api-key: <your api key>
api-url: https://api.openai.com/v1
model: text-davinci-003
Реализуем сервисный слой для работы с ChatGPT
@Service
@RequiredArgsConstructor
public class ChatGptService {
private final ChatGptClient chatGptClient;
private final ChatGprProperties properties;
public CompletionResult getResponseFromChatGpt(final String prompt) {
val request = PromptTextRequest.builder()
.model(properties.getModel())
.maxTokens(700)
.temperature(0D)
.prompt(prompt);
return chatGptClient.getCompletion(request.build());
}
}
Теперь у нас есть все, чтобы реализовать слой работы с внешним миром, наш веб сервис на основе Rest контроллера
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class ChatGptController {
private final ChatGptService chatGptService;
@GetMapping(value = "/send", produces = MediaType.TEXT_PLAIN_VALUE)
public ResponseEntity<String> sendPrompt(@RequestParam String message) {
val response = chatGptService.getResponseFromChatGpt(message);
if (Objects.isNull(response) || CollectionUtils.isEmpty(response.getChoices())) {
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok(
response.getChoices().stream()
.map(CompletionChoice::getText)
.collect(Collectors.joining("\n"))
);
}
}
Теперь у нас все готово, чтобы мы смогли запустить наш сервис и проверить его работоспособность.
@SpringBootApplication
@EnableFeignClients
@EnableConfigurationProperties(ChatGprProperties.class)
public class ChatgptSampleApplication {
public static void main(String[] args) {
SpringApplication.run(ChatgptSampleApplication.class, args);
}
}