Spring Boot ChatGPT

Cover Image for Spring Boot ChatGPT

    Содержание

  • ChatGPT настройка и зависимости
  • Spring Boot проект с минимальной конфигурацией
  • Feign клиент
  • RESTful сервис

Интеграция Spring Boot с ChatGPT

ChatGPT — это языковая модель, разработанная OpenAI, которая может генерировать человеческие ответы на ввод текста. Spring Boot — это популярная среда Java, упрощающая создание веб-приложений, включая RESTful API. Интегрировав ChatGPT с Spring Boot, вы можете создать чат-бота, который может отвечать на сообщения пользователей на естественном языке.

Чтобы интегрировать Spring Boot с ChatGPT, вам нужно будет сделать следующее:

  1. Настройте учетную запись API ChatGPT. Вам потребуется создать учетную запись на веб-сайте API ChatGPT ( https://beta.openai.com/signup/ ), чтобы получить ключ API, который можно использовать для доступа к языковой модели.

  2. Добавьте зависимость 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>
  1. Создайте ендпоинт RESTful API: вам потребуется создать ендпоинт RESTful API, которая может получать сообщения пользователей и генерировать ответы с помощью ChatGPT. Это можно сделать с помощью @RestControllerаннотации Spring Boot.

  2. Используя Feigh client сделать запрос на сторону ChatGPT сервиса и получить ответ.

  3. Верните ответ пользователю: после того, как вы сгенерировали ответ с помощью 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);  
  }  
  
}

Возникли вопросы по статье, не работает код, хотелось бы больше информации - свяжитесь с нами и мы поможем