어제 OPENAI API를 기반으로 유저의 질문에 맞춰 책을 추천해주는 코드를 만들었다.
https://dev-dx2d2y-log.tistory.com/126
[CS] OPEN AI API로 간단한 메시지 보내고 받아보기
자바로 OpenAI API를 보내보려한다. API키를 발급하려면 https://deepdaive.com/openai-api-key/ OpenAI API Key 발급 방법 (2025년) - DeepdAive이번 포스팅에서는 OpenAI API Key를 발급 받는 방법을 소개하겠습니다.deepdaiv
dev-dx2d2y-log.tistory.com
여기서 한 번 다룬 적이 있는데

그 때 받은 메시지
이 때는 검증로직 아무것도 없이 그냥 받은 메시지를 그대로 출력하는 코드였는데, 역시 첫 번째 인덱스는 있는 책이지만 두 번째 인덱스는 없는 책이 반환되었다. AI의 할루시네이션인 것.
이 때 로직은 유저의 메시지 → AI가 이걸 기반으로 책 추천이었는데 이대로하면 AI가 없는 책을 꾸며낼 수 있다고하여..
유저의 메시지 → AI가 이걸 기반으로 키워드 추출 → 그 키워드를 토대로 AI에게 다시 적절한 책을 추천해달라 요청 → 추천받은 책 검증
키워드는 3~5개 정도 추출하고 그걸 기반으로 책을 10권 추천받아서 검증을 돌리고, 검증되지 못한, 그러니까 AI가 꾸며낸 책들은 반환값에 포함되지 않도록 했다.
검증부분은 네이버의 책 검색 API를 사용했다. 웬만한 정보를 전부 다 여기있더라ㄷㄷ..
https://developers.naver.com/docs/serviceapi/search/book/book.md
검색 > 책 - Search API
검색 > 책 책 검색 개요 개요 검색 API와 책 검색 개요 검색 API는 네이버 검색 결과를 뉴스, 백과사전, 블로그, 쇼핑, 웹 문서, 전문정보, 지식iN, 책, 카페글 등 분야별로 볼 수 있는 API입니다. 그 외
developers.naver.com
어쨌든 이방식으로 코드를 짰는데,
문제는 AI 모델학습 범위이후 (GPT4를 쓴다면 2025년 신간소설 등을 모를 수 있다.)의 책을 추천받지 못한다는 것과, 결국 키워드를 통해서 추천되는 책도 할루시네이션일 수도 있다는 것이었다.
실제로 "야구 기초에 대한 책을 추천해줘"라고 요청을 보낸 결과 추천해둔 책이 모두 할루시네이션이라서 검증부분에서 걸러져서 유저가 아무런 책도 추천받지 못하는 결과를 얻을 수 있었다.
이걸 예방하는 방법으로는, AI에게 직접 찾아오라하지 말고, 내가 직접 후보군을 추려 AI에게 추천을 맡기는 것이다. 아마 이건 앞으로 AI관련 개발을하면서 반드시 명심해야할 사항으로 보인다. AI를 믿지 말고 내가 만든 자료를 믿어라
결국 로직을 변경하여 AI에게 키워드를 2~3개 뽑아내라 요청하고, 뽑아낸 키워드를 책 검색 API를 통해 각 5권씩 책 후보군을 추려 최대 15권의 책과 유저메시지를 다시 AI에게 보내어 최종적으로 책 3권을 추천해달라고 요청을 보냈다. 솔직히 개발 다했다고 생각했는데 로직부터 바꿔야한다는거 보고 충격먹음. 어찌저찌 2시간만에 고치긴 했다만..
public BookDTO[] SearchBooks(String[] tags){
BookDTO[] result = new BookDTO[15];
int index = 0;
for (String tag : tags) {
String url = apiUrl + tag;
BookDTOForAPISearch responsedBooks = restTemplate.getForObject(url, BookDTOForAPISearch.class);
int len;
if (responsedBooks.getItems().length <= 3) {
len = responsedBooks.getItems().length;
} else {
len = 3;
}
for (int idx = 0; idx < len; idx++) {
result[index] = responsedBooks.getItems()[idx];
index++;
if (index >= 15) {
break;
}
}
}
return result;
}
아주 간단한 문제인데 어제 여기서 가장 큰 문제가 발생했다.
이 부분은 AI에게 추천받은 키워드를 가지고 네이버 책 API에 요청을 보내 키워드 하나 당 최대 3권의 책을 가져오는 과정와서 배열에 넣고 반환하는 과정인데,
프롬프트 엔지니어링 관련 책을 추천해달라고 했는데 점프투파이썬과 로블록스 책을 추천해주는 것. 이게 무슨일인가 싶어서 추천되는 책의 출력을 찍어보니 인덱스 값이 틀려서 오류가 발생하고 있었다.
for (String tag : tags) {
String url = apiUrl + tag;
BookDTOForAPISearch responsedBooks = restTemplate.getForObject(url, BookDTOForAPISearch.class);
int len;
if (responsedBooks.getItems().length <= 3) {
len = responsedBooks.getItems().length;
} else {
len = 3;
}
for (int idx = 0; idx < len; idx++) {
result[idx] = responsedBooks.getItems()[idx];
if (result.length >= 15) {
break;
}
}
}
원래 코드는 이거였는데,
키워드 당 최대 3개의 책을 추천받기 위해 반복문을 최대 3회돌며 result 배열에 책 후보군을 모아두는 작업이다.
문제는 result[idx] 부분이었는데, 원래라면 지역변수를 하나 사용하여 최대 15까지 인덱스 값을 늘려가며 책을 result 배열에 저장해야했지만 여기서는 어째서인지 for문 반복변수 idx로 인덱싱 중이었다. 그래서 키워드를 통해 뽑은 책 추천이 result에서 0~2 인덱스에서 계속 덮어쓰기 중이었던 것.
그래서 최종적으로 추천에 들어가는 책은 AI가 뽑은 키워드 중에서 가장 나중에 뽑은 키워드가 마지막으로 덮어쓰기되어 반환되었기 때문에 상대적으로 덜 중요한 키워드를 기반으로 책 검색을 진행한 것과 같은 결과가 나오게된 것.
이걸 해결하니까 잘된다.
원래 작가검색 ("김유정의 책 몇 권 추천해 줘") 같은 질문도 이상하게 프롬프트를 만져봤는데도 좀 이상하리만치 안되었는데, 이걸 해결하니까 잘된다.
위 질문을 토대로 키워드를 뽑으면 "김유정", "한국문학", "한국소설"이 출력되는데,
오류가 있는 코드에 따르면 "김유정", "한국문학" 키워드를 통해 얻은 책은 무시되고 "한국소설"을 통해 얻은 결과값만 요청으로 전송되기 때문에 오류가 일어났던 것이고..
설명하는거 되게 어렵네 나중에 내가 이해할 수 있으려나
암튼 정리를 해보자면..
AI가 추천해준 키워드를 토대로 책 검색을 돌려서 최대 3권까지 리스트에 넣었어야했으나, 반복문에서 인덱싱이 잘못되어 책을 3권을 검색하고 그 책들을 계속 같은 위치에 덮어쓰기하고 있었다. 정도?

이렇게 좀 무거운 질문을 보내도


뭐 이런식으로 책을 추천해준다.

이렇게 메시지를 보내도


이렇게 추천을 해준다.



이것도 추천받았네
작가추천도 잘 해주는 편이다.
GET요청 하나 보낼 때마다 내 돈이 깎이는데 손이 너무 떨려요
이제 남은부분은
결제한 API 토큰이 만료되면 나에게 메일을 쏘도록하고,
로그작성도 좀 하고
정도?
대략적인 백엔드 기능은 끝났다. 이틀걸렸다.
이제 프론트도 해보고 싶은데.. JS부터 해야하나;;
암튼 백엔드 보강 좀하고 코드 리팩토링부터 좀 하고 해야할 듯하다.
어제는 우선 구현부터해보자라는 생각으로 그냥 막 개발해서 DTO도 꼬이고 클래스들도 좀 꼬이고 했는데, 이거 리팩토링부터 좀 하고 JavaDoc도 좀 쓰고해야겠다.
'CS > 백엔드' 카테고리의 다른 글
| [BckEnd] 스프링없이 순수JDK로 간단한 개발해보기 (0) | 2026.01.04 |
|---|---|
| CSRF 공격이란 무엇인가? (0) | 2025.11.25 |
| [CS] OPEN AI API로 간단한 메시지 보내고 받아보기 (0) | 2025.11.19 |
| WebSocketConfig로 사전 세팅하기 (0) | 2025.11.04 |
| HttpSession을 통한 세션로그인 구현해보기 (0) | 2025.11.03 |
