📒 PlanWith 회고 ( 2 ) - OpenAI API

2025. 3. 6. 12:54개발/📒 PlanWith

 

 

 

PlanWith에서 AI를 활용한 계획 추천 및 일정/할일 자동 기입 기능은

OpenAI API를 이용해서 구현했다!

 

1.  기능 상세 구현 계획

 

 

 

2.  OpenAI API Document

 

2-1.  OpenAI API Key 발급

OpenAI 회원가입 후 API Key 발급받기

https://platform.openai.com/api-keys

 

2-2.  OpenAI API Endpoint 활용

https://platform.openai.com/docs/api-reference/chat/create

API 문서 우다다 읽으면서 기능 개발에 필요한 엔드포인트를 찾았다

주로 이 EndPoint를 사용했다

 

 

3.  챗봇 기능 구현

 

3-1.  application.yaml에 OpenAI API 관련 설정 추가

openai:
  model: gpt-4
  api:
    key: OpenAI에서 발급 받은 key
    url: https://api.openai.com/v1/chat/completions

 

3-2.  챗봇 flow 결정

1.  사용자가 챗봇에 의도, 카테고리, 텍스트 입력
2.  사용자 입력 내용 레디스에 저장
3.  OpenAI API 통해서 텍스트 목적 분류 - 계획 추천, 일정 기입, 투두 기입, 예외
      : 예외 - 예외 처리 진행
      : 계획 추천, 일정 기입, 투두 기입일 경우, 레디스에 저장된 사용자 입력 이용해서 ChatGPT 응답 받아내기
4.  ChatGPT가 응답한 내용(JSON 형태) 객체로 변환
5.  DB에 저장

 

왜 레디스에 넣다 뺐다 하냐?

예외 처리와 정확한 카테고리(계획 추천, 일정 기입, 투두 기입)에 맞는 답변을 받기 위해

ChatGPT를 통한 의도 분석이 필요했다

그러면 하나의 입력에 대해서 ChatGPT에 총 두번 요청(1. 의도 분석 2. JSON 답변 요청)을 하게 된다

이때 첫번째 요청에서 받아냈던 사용자의 입력이 두번째 요청에도 필요하므로 

사용자의 입력을 잠시 넣을 공간이 필요했고 이를 레디스에다가 저장하는 방식을 택했다

아무래도 MySQL에 직접 접근하기 보다는 Redis에 넣었다 빼는 것이 훨씬 빠르겠다고 판단했답

 

3-3.  코드 회고

 

OpenAPI 사용

OpenAPI 처음 사용해봤는데 생각보다 간단했움

@Override
    public ChatGPTRespDTO postMessage(List<ChatGPTMessageDTO> message, TokenReqDTO token) {

        // ChatGPT 응답 형식 맞춰서 생성
        ChatGPTReqDTO request = ChatGPTReqDTO.builder()
                .model(model)
                .messages(message)
                .build();

        // ChatGPT 응답 생성 요청
        ChatGPTRespDTO response = openAiRestTemplate.postForObject(apiURL, request, ChatGPTRespDTO.class);

//        System.out.println("content: "+response.getChoices().get(0).getMessage().getContent());

        // ChatGPT 응답 반환
        return response;
    }

요로코롬 요청을 위한 DTO 형식에 맞게 작성해주고

postForObject()로 형식에 맞게 요청 보내면 된다

그리고 필요한 부분 긁어내면 된당

 

형식 같은 거는 API 공식 문서를 통해서 확인할 수 이따!

 

Redis

Redis도 생각보다 간단했움

 

dependency랑

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}

 

application.yml이랑

spring:
  redis:
    host: localhost
    port: 6379

 

RedisConfig class 작성해주구

@RequiredArgsConstructor
@Configuration
public class RedisConfig {
    @Value("${spring.data.redis.host}")
    public String host;
    @Value("${spring.data.redis.port}")
    public int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        config.setHostName(host);
        config.setPort(port);
        return new LettuceConnectionFactory(config);
    }

    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

 

저장, 조회, 삭제 열씨미 해주면 됨...

인터넷에 검색하면 금방 나온당

 

 

 4.  추후 개선 사항

-  ChatGPT에 던져주는 프롬프트 개선 -> ChatGPT의 답변 개선
-  Open API 사용 -> 챗봇에 동시에 요청이 들어갔을 때 답변 지연되는 경우 어떻게 처리할지 계획

 

 

 

'개발 > 📒 PlanWith' 카테고리의 다른 글

📒 PlanWith 회고 ( 1 )  (0) 2025.03.04