baekjoon recommendation
2025. 06. 14.
#algorithm#recommendation#LLM

알고리즘 문제 추천에 LLM을 붙이면 “대화형”이 될 것 같았지만, 실제로는 추천만으로는 대화의 효용이 낮다는 결론에 빠르게 도달했다. 그래서 추천을 시작점으로 삼되, 사용자가 막히는 순간 바로 문제 정보 기반의 해설/풀이 가이드까지 이어지는 “학습 도우미” 경험을 목표로 서비스를 설계했다.


서비스 링크: ps-recommendation

프로젝트 개요

이 서비스는 백준(BOJ) 사용자 핸들을 입력받아 개인화된 문제를 추천하고, 사용자가 선택한 문제에 대해 힌트/해설/풀이 방향을 대화로 제공한다. 추천 모델의 결과를 단순 노출하는 수준이 아니라, **LLM이 외부 도구를 호출해 필요한 정보를 채우는 구조(MCP)**를 도입해 “정확한 문제 기반 답변”을 목표로 했다.

  • 주요 기능
    • 개인화 추천: 사용자 풀이 이력 기반 추천
    • 대화형 난이도 조절: “더 어렵게/쉽게” 요청을 누적 반영
    • 문제 정보 기반 해설: 문제 페이지를 실시간 크롤링해 맥락 주입

baekjoon_demo

프로젝트 최종 구조

서비스는 프론트/백엔드/모델(서빙)을 분리하고, LLM이 필요할 때만 추천/크롤링 도구를 호출하도록 구성했다. 모델은 오프라인 배치 서빙을 선택해 응답 속도와 운영 복잡도를 낮췄다.

rec_architecture

  • Frontend: Next.js (배포: Vercel)
  • Backend: FastAPI (AWS EC2), SQLite
  • AI/LLM: ChatGPT API + MCP(Model Context Protocol)
  • Model Serving: EASE 기반 Batch Serving

모델링 및 서빙 선택

초기에는 Two-Tower 기반의 온라인 서빙을 고려했지만, 사용자 메타 데이터가 부족한 환경에서 컨텍스트 모델의 효용이 제한적이었다. 실험 결과를 바탕으로 EASE를 선택했고, 운영을 단순화하기 위해 추천 결과를 DB에 저장해두는 Batch Serving으로 전환했다.

  • 모델 선정: EASE (실험 결과 GRU4Rec 대비 성능 우위 관측)
  • 서빙 방식: 미리 inference 결과를 저장해두고 요청 시 조회 + 조건 필터링

rec_wandb

LLM + MCP로 만든 “정확한 해설” 흐름

LLM 출력이 문제 번호만으로는 쉽게 흔들리는(환각/부정확한 설명) 문제가 있었고, 이를 해결하기 위해 “문제 정보를 가져오는 도구”를 별도로 분리했다. 결과적으로 해설 요청 시 LLM은 **문제 상세 정보(제목/설명/입출력 예시)**를 먼저 확보하고 그 위에 답변을 생성한다.

Problem Info Tool (크롤링)

  • 문제: LLM이 문제 내용을 모르는 상태에서 일반론적/부정확한 해설을 생성
  • 해결: acmicpc.net에서 실시간 크롤링 → 프롬프트에 주입(Context Injection)

rec_gpt

Recommendation Tool (추천 + 필터링)

추천 도구는 기본 추천 외에, 난이도/태그 조건을 처리하도록 분리했다.

  • 난이도 조절: “더 어렵게” 요청이 반복되면 이전 값보다 누적적으로 가중치 증가(또는 감소)
  • 태그 기반 필터링: 포함/제외 태그를 받아 DB 조회 결과를 재필터링

rec_hard

Front 구현

프론트는 채팅 UX에 집중했다. 초기에는 입력 박스를 중앙에 두고, 첫 메시지 이후에는 일반적인 채팅 UI처럼 입력 영역을 하단으로 이동시켜 흐름을 자연스럽게 만들었다. 또한 LLM 응답은 Markdown으로 렌더링해 가독성을 확보했다.

rec_front rec_front2

추천된 문제를 클릭하면 문제 하단에 모달을 띄워 해설/풀이 요청 및 원문 이동이 가능하도록 구성했다.

rec_front3 rec_front4

트러블 슈팅

“더 어렵게” 같은 애매한 요청 처리

단발성 요청만 반영하면 대화가 이어질수록 사용자의 기대와 어긋나기 쉬웠다. 그래서 “난이도 조절” 요청은 세션 컨텍스트에서 누적 관리하고, 다음 추천에 재사용하도록 설계했다. 이 방식으로 같은 요청이 반복될 때 추천 난이도가 점진적으로 변화하는 것을 확인했다.

커버리지/롱테일 이슈

EASE 기반 상위 추천은 인기 문제로 쏠리는 경향이 있었다. 특히 상위 100개 추천 내 커버리지가 제한적이어서, interaction이 적은 문제들이 추천에서 배제되는 문제가 관찰되었다. 향후에는 모델 앙상블/재랭킹 등으로 개선 여지가 있다.

회고 및 다음 단계

추천 시스템을 “추천 결과를 보여주는 앱”이 아니라, 학습 상황에서 바로 도움이 되는 대화형 도우미로 만들기 위해 구조를 재정의한 경험이었다. 특히 MCP로 “도구 호출 → 정보 확보 → 답변 생성”의 루프를 만든 것이 서비스 품질을 가장 크게 끌어올린 포인트였다.

  • 아쉬운 점: 온라인 서빙(실시간 추론)까지는 완성하지 못했고, 자동화된 데이터 파이프라인도 최소 수준에 머물렀다.
  • 개선 방향
    • 데이터 수집/재학습 자동화(Airflow 등)
    • 하이브리드 추천(EASE + 시퀀스 모델) 및 재랭킹 고도화