본문 바로가기
Side Project

[Spring Boot] chatGPT를 활용한 AI 사이트 (4) - chatGPT API 사용하기

by jisayDeveloper 2023. 10. 13.
728x90
반응형
SMALL

chatGPT API 세팅을 끝냈으니 이제 사용해보겠습니다.

 

BoardEntity

package com.example.createscripter.entity;

import lombok.Builder;
import lombok.Generated;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;

@Getter
@NoArgsConstructor
@Entity
public class BoardEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int aid;

    @Column(length = 1000)
    private String subject;

    @Column(columnDefinition = "TEXT")
    private String result;

    @Column(columnDefinition = "TEXT")
    private String content;

    private LocalDateTime createDate;


    @Builder(toBuilder = true)
    public BoardEntity(String subject, String result, String content, LocalDateTime createDate) {
        this.subject = subject;
        this.result = result;
        this.content = content;
        this.createDate = createDate;
    }
}

BoardEntity는 GPT가 써준 내용을 저장할때 쓸 entity입니다.

BoardForm

package com.example.createscripter.form;

import lombok.Data;

import javax.validation.constraints.Size;


@Data
public class BoardForm {

    @Size(max = 200)
    private String subject;

    private String content;

    private String result;

}

BoardEntity와 같이 연동해서 사용할 DTO입니다. entity와 DTO를 함께 사용하는 이유는 여러 이유가 있지만 보안과 데이터 무결성 때문에 사용합니다.

 

Entity는 데이터 베이스의 무결성과 보안을 유지하기 위한 목적으로 사용하는데 DTO를 사용하면 필요한 정보만 전송하고 

민감한 정보를 필터링 할 수 있으므로 더 안전한 데이터 전송이 가능합니다.

 

BoardRepository

package com.example.createscripter.repository;

import com.example.createscripter.entity.BoardEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<BoardEntity, Integer> {

}

Controller

package com.example.createscripter.controller;

import com.example.createscripter.form.BoardForm;
import com.example.createscripter.service.ChatGPTService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;

@Controller
@Slf4j
@RequiredArgsConstructor
public class ChatGPTRestController {

    private final ChatGPTService chatGPTService;

    //gpt
    @GetMapping("/searchChatGPT")
    public String searchChatGPT(HttpSession session) {
        if (session.getAttribute("SNSmember") == null) {
            return "loginPage";
        }
        return "gpt/gpt";
    }

    @PostMapping("/searchChatGPT")
    public String searchChatGPT(@RequestParam("query") String query, Model model) {

        log.info("searchChatGPT Started query: " + query);


        String result = chatGPTService.processSearch(query);


        model.addAttribute("query", query);
        model.addAttribute("result", result);

        return "gpt/gpt";
    }

    @PostMapping("/save")
    public String saveResult(@ModelAttribute BoardForm boardForm, Model model) {

        chatGPTService.create(boardForm.getSubject(), boardForm.getContent(), boardForm.getResult());

        return "redirect:/index";
    }

}

기본적으로 로그인 하지 않으면 이용할 수 없게 했습니다.

 

클라이언트가 어떤 글을 써달라고 할지 조건을 넣고 POST요청을 보내면 GPT가 결과를 리턴하고 model에 담아 view단으로 출력됩니다.

 


ChatGPTService

package com.example.createscripter.service;

import com.example.createscripter.entity.BoardEntity;
import com.example.createscripter.model.ChatGPTRequest;
import com.example.createscripter.model.ChatGPTResponse;
import com.example.createscripter.repository.BoardRepository;
import com.google.gson.Gson;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

@Service
@Slf4j
@RequiredArgsConstructor
@Transactional
public class ChatGPTService {

    @Value("${OPEN_AI_URL}")
    private String OPEN_AI_URL;
    @Value("${OPEN_AI_KEY}")
    private String OPEN_AI_KEY;

    private final BoardRepository boardRepository;

    //GPT API 생성
    public String processSearch(String query) {

        // ChatGPTRequest 객체를 생성하고 설정
        ChatGPTRequest chatGPTRequest = new ChatGPTRequest();
        chatGPTRequest.setPrompt("Please make a self-introduction letter that corresponds to the question including my information. My information is" + query);
        chatGPTRequest.setMaxTokens(100);

        // HTTP 요청을 위한 URL 및 헤더 설정
        String url = OPEN_AI_URL;
        HttpPost post = new HttpPost(url);
        post.addHeader("Content-Type", "application/json");
        post.addHeader("Authorization", "Bearer " + OPEN_AI_KEY);

        // Gson을 사용하여 요청 본문 생성
        Gson gson = new Gson();

        String body = gson.toJson(chatGPTRequest);
        log.info("body : " + body);

        try {
            // HTTP 요청 엔티티 설정
            final StringEntity entity = new StringEntity(body, "UTF-8");
            post.setEntity(entity);

            try (CloseableHttpClient httpClient = HttpClients.custom().build();
                 CloseableHttpResponse response = httpClient.execute(post)) {

                // 응답 데이터 처리
                String responseBody = EntityUtils.toString(response.getEntity());

                log.info("responseBody = " + responseBody);

                // 응답 데이터를 ChatGPTResponse 객체로 파싱하고 첫 번째 선택 항목의 텍스트 반환
                ChatGPTResponse chatGPTResponse = gson.fromJson(responseBody, ChatGPTResponse.class);
                return chatGPTResponse.getChoices().get(0).getText();

            } catch (Exception e) {
                return "faileddd";
            }
        } catch (Exception e) {
            return "failed2";
        }
    }


    public void create(String subject, String content, String result) {
        BoardEntity boardEntity = BoardEntity.builder()
                .subject(subject)
                .content(content)
                .result(result)
                .createDate(LocalDateTime.now())
                .build();
        this.boardRepository.save(boardEntity);
    }
}

processSearch 메서드는 OpenAI GPT API를 호출하여 텍스트 생성 요청을 보내고, 응답을 처리하여 생성된 텍스트를 반환하는 역할을 합니다. 이 메서드는 주어진 query를 사용하여 자기소개 텍스트를 생성하기 위한 요청을 보냅니다. 이때, OpenAI API에 필요한 URL 및 헤더 정보를 설정하고, Gson을 사용하여 요청 본문을 생성합니다. 그리고 HTTP 클라이언트를 사용하여 API에 요청을 보내고 응답을 처리합니다. 마지막으로, 생성된 텍스트를 반환하거나 오류 메시지를 반환합니다.

 

create 메서드는 제목, 내용, GPT결과 및 현재 날짜를 설정한 후 데이터 베이스에 저장하는 역할을 합니다.

 

728x90
반응형
LIST