스프링 + OpenAI [3분](chatGPT) AI채팅 기능구현

민입니다.·2024년 3월 3일

스프링

목록 보기
1/1
post-thumbnail

앱 개발 과정에서 새로운 기능을 테스트하고자 백엔드 API를 준비하면서 start.spring.io에서 프로젝트를 생성하는 중, 2023년 12월 1일부터 새로 추가된 것으로 보이는 Spring AI 라이브러리를 발견했습니다. 이미 JPA의 사용 편의성, 생산성, 그리고 객체지향적인 특성 등 다양한 기능을 경험하고 JPA을 선호하는 저로서는 이 새로운 라이브러리를 바로 활용해보고 싶어 이 글을 작성하게 되었습니다.

프로젝트환경

자바17
Spring Boot 3.2.3버전
Gradle - Groovy
IDE

1. Docs부터 살펴보자

Spring AI Docs

기능 및 지원

일단 제일 보편적인 ChatGPT을 활용해서 코드을 작성해보겠습니다.

2. 준비

1. OpanAI key

ChatGPT Plus+ 유저라도 OpanAI는 별개이기에 최소 5달러 충전해서 사용해야한다.

OpanAI

2. 라이브러리 추가

기능마다 필요한 라이브러리가 다르니 문서을 참고해주세요.

repositories {
  mavenCentral()
  maven { url 'https://repo.spring.io/milestone' }
}

dependencies {
	implementation 'org.springframework.ai:spring-ai-openai-spring-boot-starter'

}

dependencyManagement {
	imports {
		mavenBom "org.springframework.ai:spring-ai-bom:${springAiVersion}"
	}
}

3. application.properties 설정

spring.ai.openai.api-key=
spring.ai.azure.openai.embedding.options.model=text-embedding-ada-002

선택 spring.ai.openai.base-url= 기본값은 api.openai.com입니다.

3. 사용하기

복잡한 추가 설정이나 다른 구성 파일이 필요 없어 바로 시작할 수 있으며, 단지 컨트롤러에 OpenAiChatClient 인스턴스를 주입하는 것만으로 OpenAI 서비스를 호출하고 응답을 처리할 수 있습니다. 이렇게 하면, 복잡한 초기 설정 과정 없이도 손쉽게 OpenAI의 기능을 활용하여 프로젝트을 빠르게 구축할 수 있습니다.

예시코드

// @RestController 어노테이션을 사용하여 Json 형태로 객체 데이터를 반환
@RestController
public class ChatGPT_Controller {
    // OpenAiChatClient 
    private final OpenAiChatClient chatClient;

    // 생성자에 @Autowired 어노테이션을 사용하여 OpenAiChatClient 객체의 의존성 주입을 요청하기
    // 스프링 컨테이너는 OpenAiChatClient 타입의 빈을 찾아 이 변수에 자동으로 할당합니다.
    @Autowired
    public ChatGPT_Controller(OpenAiChatClient chatClient) {
        this.chatClient = chatClient;
    }

    // @RequestParam을 사용하여 "message"라는 이름의 요청 파라미터를 String 타입의 message 변수에 바인딩합니다.
    // 메세지가 없을시 기본 값을 "안녕하세요"으로 설정하여, 요청에서 message 파라미터가 누락된 경우 기본값을 사용합니다.
    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "안녕하세요 ") String message) {
        // chatClient의 call 메소드를 호출하여 입력받은 메시지를 처리하고,
        // "generation"이라는 키와 함께 결과를 Map 객체로 래핑하여 반환합니다.
        // 이 Map 객체는 JSON 형식으로 클라이언트에게 응답됩니다.
        return Map.of("generation", chatClient.call(message));
    }
    
	// 비동기 스트림 처리 방식
    
    // 반환 타입: Flux<ChatResponse>를 반환합니다. 
    // Flux는 Project Reactor에서 제공하는 반응형 프로그래밍을 위한 API 중 하나로,
    // 여러 개의 데이터 아이템을 시간에 걸쳐 처리하고 반환할 때 사용합니다.
    @GetMapping("/ai/generateStream")
	public Flux<ChatResponse> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        Prompt prompt = new Prompt(new UserMessage(message));
        return chatClient.stream(prompt);
    }
}

관련 글

OpenAI + LangChain을 통해 FastAPI(rest api) 문서기반 챗봇 서버구축하기

3개의 댓글

comment-user-thumbnail
2024년 4월 6일

저는 OpenAiChatClient 인스턴스가 주입이 안되는데.. dependency추가하시고나서 바로 주입이 되었나요??

1개의 답글