[Spring AI] Spring AI JSON으로 응답 하기(Spring boot Chat GPT JSON 응답 하기)

JO Yeongmu·2024년 5월 16일
0

Spring-AI

목록 보기
2/2
post-thumbnail

프롤로그

openAI 키를 발급 받으세요.
-> 참고 블로그 https://wikidocs.net/196075

spring ai 의존성을 추가해주세요.

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

application.properties를 작성해주세요.

spring.ai.openai.api-key=${OPENAI_API_KEY}

프롬프트 작성 📗

{stateOrCountry} 의 수도의 이름만 말해줄래? {format}

format 은 ChatClient 에 넘길 때 사용 할 것 입니다.

Request 작성 ⚙️

public record GetCapitalRequest(String stateOrCountry) {
}

바인딩 데이터 생성 ⚙️

import com.fasterxml.jackson.annotation.JsonPropertyDescription;

public record GetCapitalWithInfoResponse(@JsonPropertyDescription("수도의 이름") String city,
                                         @JsonPropertyDescription("수도의 인구") Integer population,
                                         @JsonPropertyDescription("수도의 위치") String region,
                                         @JsonPropertyDescription("수도의 언어") String language,
                                         @JsonPropertyDescription("수도의 통화") String currency) {
}

Service 작성 ⚙️

  • 인터페이스 작성
package com.example.springai.service;


import com.example.springai.model.*;

public interface OpenAIService {

    GetCapitalWithInfoResponse getCapitalWithInfo(GetCapitalRequest getCapitalRequest);
}

  • 구현
@Service
public class OpenAIServiceImpl implements OpenAIService{

    private final ChatClient chatClient;

    public OpenAIServiceImpl(ChatClient chatClient) {
        this.chatClient = chatClient;
    }

    @Value("classpath:templates/get-capital-with-info.st")
    private Resource getCapitalPromptWithInfo;

    @Override
    public GetCapitalWithInfoResponse getCapitalWithInfo(GetCapitalRequest getCapitalRequest) {
        BeanOutputParser<GetCapitalWithInfoResponse> parser = new BeanOutputParser<>(GetCapitalWithInfoResponse.class);
        String format = parser.getFormat();
        
        PromptTemplate promptTemplate = new PromptTemplate(getCapitalPromptWithInfo);
        Prompt prompt = promptTemplate.create(Map.of("stateOrCountry", getCapitalRequest.stateOrCountry(),
                "format", format));
                
        ChatResponse response = chatClient.call(prompt);

        return parser.parse(response.getResult().getOutput().getContent());
    }

Controller 작성 ⚙️

@RestController
public class QuestionController {

    private final OpenAIService openAIService;

    public QuestionController(OpenAIService openAIService) {
        this.openAIService = openAIService;
    }

    /**
     * 나라 수도 정보
     */
    @PostMapping("/capital-with-info")
    public GetCapitalWithInfoResponse getCapitalWithInfo(@RequestBody GetCapitalRequest getCapitalRequest) {
        return this.openAIService.getCapitalWithInfo(getCapitalRequest);
    }
}

결과 🎉

성공적으로 JSON으로 응답 되었습니다 ㅎㅎ

profile
도전해 보는 것이 성장의 첫걸음입니다 :)

0개의 댓글

관련 채용 정보