Day8. OpenAI API: 단순 문자열로 Return

2ㅣ2ㅣ·2024년 10월 31일

Project

목록 보기
7/13

개요

구현하고자 하는 기능 설명

  • 사용자가 일기를 작성하면 챗봇은 일기에 대한 응답을 준다.
  • 챗봇의 응답은 프롬프팅에 기반하여 노래 추천이나 작사를 한다.
  • 이 포스팅에서는 임의로 노래 추천 Response만 가지고 왔다.

해당 기능에서 SpringBoot의 역할은 React와 FastAPI의 중간다리로 요청과 응답을 전달해주는 것이다.
기본 웹의 JSON 리턴 값을 생각한 나머지 FastAPI에서 보내주는, 정확히는 OpenAI API의 리턴이 일반적인 JSON 리턴값처럼 조작할 수 없다는 사실을 간과했다.
OpenAI API의 응답은 단순 문자열(String) 형태로 온다.

As-Is

  • 사용자에게 노래 정보를 알려주는 UI가 있기 때문에, SpringBoot는 챗봇이 추천해준 Song에 대한 정보가 필요했다.
  • result를 리스트로 받으면 되겠다고 간단하게 생각했다.

ResponseBody

{
	"isSuccess" : true,
	"code" : 200,
	"message" : "요청에 성공하셨습니다",
	"result" : { 
			"chat_id" : 1,
			"created_at" : "2024-10-26 3:40:23",
			"chatResponse" : "챗봇 응답입니다.",
			"song_info" : {
					"song_id": 1,
					"album_title" : "Whiplash - The 5th Mini Album",
					"artist" : "aespa",
					"songTitle" : "whiplash",
					"genre" : "댄스, R&B/Soul, 록/메탈"
			}
	},
}

To-Be

  • 하나의 String타입으로 응답값이 오기 때문에, 단일 문자열만 받도록 변경했다.

ResponseBody

{
	"isSuccess" : true,
	"code" : 200,
	"message" : "요청에 성공하셨습니다",
	"result" : { 
			"chatResponse" : "챗봇 응답입니다."
	},
}

그렇다면 Song 정보는 어떻게 받아야 할까?

방법1 . 프롬프팅으로 song_info를 응답에 포함하는 방법
chatResponse를 다음과 같은 형태로 받는 것이다.
어쨌든 하나의 문자열로 받으니 가능할 것 같다.

챗봇 응답입니다. 노래 정보: {"song_id": 1, "album_title": "Whiplash - The 5th Mini Album", "artist": "aespa", "songTitle": "whiplash", "genre": "댄스, R&B/Soul, 록/메탈"}

방법2. song_info만 추출하는 별도의 API 구현
별도의 API로 분리해버리면 chat 도메인에서는 chat에 대한 응답만, song 도메인에서는 song에 대한 정보만 처리할 수 있으니 깔끔하다고 생각한다.
응답을 요청할 때 API를 2개 사용해 네트워크 처리는 증가할 수 있지만, 미미한 수준이라고 판단했다.

선택된 방법: 방법2 - 별도 API 구현

우리 프로젝트에서 song_info를 어떻게 활용할 것인지 고려해보았을 때 방법2가 더 적합하다고 판단된다.
방법1처럼 song_info를 추출한다고 해도 어쨌든 별도의 도메인에 song에 대한 정보를 저장해야 하기 때문에 코드량은 비슷할 뿐더러, 확장성이나 유지보수측에서도 방법2가 더 효율적이라고 생각된다.

0개의 댓글