점수식으로 합산한 다중 신호
개인화·대중성·신간 선호를 하나의 점수로 합산해 순위를 정합니다.final_score = w₁·S_personal + w₂·S_pop + w₃·S_recency
가중치를 바꾸면 추천 성향과 결과가 달라집니다. 수식은 아래 추천 수식 체험에서 확인 가능합니다.
AI로 책을 추천하는 기능과 AI로 책을 추천하는 서비스는 별개다.
맞춤형 AI 추천 서비스의 문제는 학습이라 생각했다. 하지만 진짜 문제는 일회성 추천으로 끝나는 게 아닌, 학습할 데이터를 구축할 수 있도록 지속적으로 방문해 서비스를 이용하도록 유도하는 일이었다. 그렇기에 사용자에게 맞춰 추천하는 기능과, 게이미피케이션 콘텐츠로 추천 정확도와 재방문 동기를 높일 수 있는 요소를 따로 설계했다.
※ 외부 인용 참고치
소비자 80% 개인화 선호(Epsilon, 2017) [외부통계]
모바일 앱 30일 리텐션 6~8%(AppsFlyer, 2023) [외부통계]
한국어 임베딩 2종을 동일 환경에서 테스트
트레이드오프를 측정해 비교하고 선택 근거에 반영
*임베딩: 문장을 숫자 벡터로 바꾼 표현 / Precision@50: 상위 50개 중 적합 비율
실제 서비스에서는 0.59초의 지연보다 더 높은 품질을 우선시하는 게 유효하다고 판단했다.
KURE Embedding으로 Qdrant Top-50을 빠르게 추출. 벡터 내적만 계산해 대규모 코퍼스에서도 낮은 지연을 유지.
GTE Reranker 전용 서버에서 쿼리·문서 쌍의 전체 문맥을 비교해 Top-3으로 정밀 정렬. 적은 후보로 비용 제어.
설계 근거 — 2-stage retrieve→rerank는 속도와 정확도 트레이드오프를 레이어로 분리하는 표준 구조이다. Nogueira & Cho, Passage Re-ranking with BERT (2019) [논문]에서 정립됐고, GTE Reranker(BAAI FlagEmbedding 계열)는 production RAG 환경의 표준 컴포넌트이다. HCX 배치 리랭킹과 병행해 최종 Top-3을 결정한다.
*Cross-encoder: 질문·문서를 함께 넣어 정밀 채점 / GTE Reranker: 검색 결과를 다시 정밀 정렬하는 모델 / RAG: 검색한 내용으로 답을 생성하는 구조
추천 파이프라인, 콜드스타트(데이터 없는 신규 유저 추천 문제) 전환, 게이미피케이션 리텐션을 하나의 제품으로 묶었습니다.
개인화·대중성·신간 선호를 하나의 점수로 합산해 순위를 정합니다.final_score = w₁·S_personal + w₂·S_pop + w₃·S_recency
가중치를 바꾸면 추천 성향과 결과가 달라집니다. 수식은 아래 추천 수식 체험에서 확인 가능합니다.
NVIDIA에서 제공한 Nemotron 한국인 합성 페르소나 100만 건(CC-BY-4.0)을 시드와 시뮬 평가에 활용했습니다. 취향 데이터가 없는 신규 유저 대상으로 근거있는 추천을 제공합니다(cold 가중치 personal 0.1·pop 0.7·recency 0.2).
18개 쿼리(Q001~Q018)에 사람이 0·1·2점을 매기는 채점 기준을 만들고, 규칙 적용 전후를 비교했습니다. 어긋난 추천(오디언스 미스매치)을 찾으면 신호를 보강하고 다시 채점했습니다.
1,109명 데이터를 7:2:1로 나눠 학습한 LightFM 모델이 Top-50에서 Top-20을 추립니다. 긍정 선호 포착율 90.52%, 비선호 노출 1.45%(test) [실측]. 전체 카탈로그 Positive Hit@20은 val 46.84% · test 29.15%입니다.
북켓몬은 추천받은 책을 읽고, 독서 기록을 남기면 경험치(XP)를 제공하는 서비스입니다. 사용자는 이 경험치로 나의 독서 파트너 북켓몬을 키울 수 있습니다. 책을 추천받고 다시 방문할 이유를 게이미피케이션으로 만듭니다.
도서관정보나루(data4library.kr)와 실시간 API로 연동해 추천받은 책의 대여 가능 여부를 확인 가능합니다. 추천이 실제 대출로 이어지도록, 유동적인 서비스를 제공합니다.
기획 의도를 수치로 확정하고 설계가 실제로 통했는지 데이터로 확인한 과정.
개인화의 추상적인 기획을 실제로 구현할 수 있는 추천 시스템 설계가 필요.
final_score = w₁·S_personal + w₂·S_pop + w₃·S_recency로 다목표 최적화 추천 시스템을 설계. S_personal은 벡터·장르 선호·행동 이력을 0.5/0.3/0.2로 합산.
취향 데이터가 없는 신규 유저 대상 근거 있는 추천이 가능한 콜드스타트 로직이 필요.
신규 유저(대화<20 AND 책<3)에게 cold 가중치(personal 0.1·pop 0.7·recency 0.2)로 대중성 위주 추천. 실제 유저가 없어 NVIDIA Nemotron 한국인 합성 페르소나 100만 건(CC-BY-4.0)을 시드·시뮬 평가에 활용. 데이터가 쌓이면 warm(0.5·0.3·0.2)으로 전환.
설계가 실제로 통하는지 데이터로 검증하고, 적용 전후를 채점할 수 있는 평가 시스템이 필요.
채점용 평가 하네스로 18개 쿼리에 0/1/2 채점 기준 확립. Q001~Q018(장르·독서목적·오디언스·부정선호)의 점수를 따로 기록. 버그를 찾으면 신호 보강 후 재채점.
*ablation: 요소를 하나씩 빼보며 각 요소의 효과를 확인하는 방법
슬라이더로 개인화·인기·신간 가중치(w₁·w₂·w₃)를 조절하면 추천 순위가 재정렬됩니다. 학습한 데이터를 지속 추적하며 맞춤형 추천을 제공하기 위한 수식을 체험해 보세요.
질의에서 최종 추천까지 레이어별 역할을 분리해,
ML 모델 교체 시 무중단 롤링 업데이트가 가능한 구조를 설계했습니다.
HCX 배치 리랭킹(0~100 스코어 + 사유 생성) 외에 gte-reranker-server를 별도 서버로 분리 운영합니다. ML 모델을 교체할 때 Spring Boot 백엔드는 건드리지 않고 AI 서버만 롤링 업데이트합니다. 레이어 분리 설계의 일부입니다.
React + Vite SPA. Google/Kakao OAuth 2.0 소셜 로그인. 북켓몬 진화 연출·XP 대시보드 포함.
JWT Refresh Rotation·Redis 블랙리스트로 인증 관리. XP 엔진(SELECT FOR UPDATE 행 잠금)·소셜 매칭(Qdrant 근사 최근접 검색으로 후보 축소) 직접 구현. RDB 스키마 설계 주도.
Spring Boot(비즈니스)↔FastAPI(AI) 레이어 분리. Stage 1 bi-encoder(KURE·Qdrant) → Stage 2 cross-encoder(GTE Reranker 전용서버 + HCX 배치리랭킹) 순서로 추천 흐름. ML 모델 교체 시 AI 서버만 롤링 업데이트. APScheduler로 대출 통계 주기 갱신.
PostgreSQL(사용자·XP·도서 RDB)·Qdrant(10만 벡터 · 1,024차원 Cosine)·Redis(세션·캐시)로 역할 분리. Docker Compose · K3s · GitLab CI/CD · Cloudflare · NAS 인프라 위에서 운영.
설계가 실제로 효과 있었는지를 데이터로 확인한 기록입니다.
수치는 오프라인 평가 기준이며 실서비스 성능을 단정하지 않습니다.
| 조건 | Precision@5 | Bad Rate@5 | Δ Precision |
|---|---|---|---|
| 룰 ON (장르·오디언스·부정선호 필터 활성) | 97.78% | 2.22% | — |
| 룰 OFF (벡터+가중치만) | 84.44% | 15.56% | Δ −13.34%p |
1,109 유저 · 7:2:1 분할 · Qdrant 호출 없는 오프라인 50개 채점. 비선호 노출 1.45%(test).
LightFM val 46.84% · test 29.15%(gap 병기) [실측]
CLOVA 90.09% 대비 Δ+1.05%p. 레이턴시 +590ms를 감수하고 품질을 택함.
[실측 | 성능평가 §8.2] · MTEB 프레임워크 [논문]
llm_search_query × dense × current 조합. Bad Rate 0% · 응답 577ms.
[실측 | 성능평가 §9] · 실서비스 성능 단정 아님.
Q001~Q018 인간 채점 하네스를 설계하고 버그(오디언스 미스매치) 발견 → 신호 보강 → 정량 개선 루프를 직접 운영했습니다. 동일 방법론을 게임 도메인 LLM 벤치마크 설계에 적용할 수 있습니다.
Spring Boot(비즈니스)↔FastAPI(AI) 분리로 ML 모델 교체 시 백엔드 변경 없이 AI 서버만 롤링 업데이트합니다. SELECT FOR UPDATE 행 수준 잠금으로 XP 동시성 Lost Update를 방지하고, 진화 단계 역행 금지 불변식을 구현했습니다.
Qdrant 근사 최근접 검색(Top-K)으로 유사 사용자 후보를 좁혔습니다. RDB 스키마(사용자·XP·도서·상호작용)를 직접 설계했습니다. 도서 벡터 약 10만 건(1,024차원 Cosine) [실측 | 프로젝트 명세].
질의 입력부터 HCX 정제·Qdrant 벡터 검색·동적 가중치 재정렬·GTE Reranker를 거쳐 최종 추천이 나오기까지 전체 흐름을 확인할 수 있습니다.
독서 기록으로 XP를 쌓고 북켓몬이 진화합니다. 재방문 유인을 게이미피케이션으로 설계한 리텐션 루프입니다.
ljhljh0703-cmd.github.io/AI-Book-Curation ↗
파이프라인 아키텍처 피치 HTML.
Drive 폴더 ↗ · 컨셉 PDF · 2차 PoC 명세 · 성능평가 보고서.
오프라인 평가로 측정한 것과 측정하지 못한 것을 솔직하게 기록합니다.
룰 ablation에서 행동·개인화 신호(리뷰·서재·audience) 효과는 "프로필 제외 평가" 구조상 제한적으로 측정됐습니다. 행동 신호 효과를 검증하려면 실제 유저 로그 기반 온라인 평가가 필요합니다.
→ 온라인 A/B 테스트 인프라 구성 → 룰·가중치 실시간 검증 루프 필요LightFM candidate-eval은 Qdrant 호출 없는 오프라인 근사(50개 채점) 기준입니다. val 46.84% · test 29.15% — 두 수치를 함께 보고하며, 실서비스 추천 루프와 완전히 동일한 환경 평가는 미완입니다.
→ Qdrant 연동 온라인 평가 루프 구성 필요성능평가 §9 최적 조합(llm_search_query × dense × current) Top-5 결과는 오프라인 특정 구성 평가 기준입니다. 모든 조합·실서비스 환경에서의 성능을 단정하지 않으며, 이 캡션은 정직성 원칙에 따라 유지합니다.
→ 다양한 조합·실서비스 조건에서 추가 검증 필요현재 평가는 인간 채점 기반 질의-추천 적합성 중심입니다. RAGAS(Es et al., arXiv:2309.15217, 2023)의 faithfulness·answer_relevancy·context_recall 지표는 미측정입니다. HCX 리랭킹 단계의 hallucinate 여부를 정량화하는 데 적합하지만, 현재 미구현 상태입니다.
→ 향후 온라인 A/B 테스트와 병행해 RAGAS 기반 retrieval 품질 평가 적용 계획AI 큐레이션 서비스 북켓몬은 기획 의도를 수식으로 명시화하고 18쿼리 ablation 하네스로 효과를 실측했습니다. GTE Reranker과 임베딩 벤치, 콜드스타트 등을 차용한 근거는 데이터로 명시했습니다.