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 |
---|