알고리즘 문제 추천에 LLM을 붙이면 “대화형”이 될 것 같았지만, 실제로는 추천만으로는 대화의 효용이 낮다는 결론에 빠르게 도달했다. 그래서 추천을 시작점으로 삼되, 사용자가 막히는 순간 바로 문제 정보 기반의 해설/풀이 가이드까지 이어지는 “학습 도우미” 경험을 목표로 서비스를 설계했다.
서비스 링크: ps-recommendation
프로젝트 개요
이 서비스는 백준(BOJ) 사용자 핸들을 입력받아 개인화된 문제를 추천하고, 사용자가 선택한 문제에 대해 힌트/해설/풀이 방향을 대화로 제공한다. 추천 모델의 결과를 단순 노출하는 수준이 아니라, **LLM이 외부 도구를 호출해 필요한 정보를 채우는 구조(MCP)**를 도입해 “정확한 문제 기반 답변”을 목표로 했다.
- 주요 기능
- 개인화 추천: 사용자 풀이 이력 기반 추천
- 대화형 난이도 조절: “더 어렵게/쉽게” 요청을 누적 반영
- 문제 정보 기반 해설: 문제 페이지를 실시간 크롤링해 맥락 주입

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

- 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 결과를 저장해두고 요청 시 조회 + 조건 필터링

LLM + MCP로 만든 “정확한 해설” 흐름
LLM 출력이 문제 번호만으로는 쉽게 흔들리는(환각/부정확한 설명) 문제가 있었고, 이를 해결하기 위해 “문제 정보를 가져오는 도구”를 별도로 분리했다. 결과적으로 해설 요청 시 LLM은 **문제 상세 정보(제목/설명/입출력 예시)**를 먼저 확보하고 그 위에 답변을 생성한다.
Problem Info Tool (크롤링)
- 문제: LLM이 문제 내용을 모르는 상태에서 일반론적/부정확한 해설을 생성
- 해결:
acmicpc.net에서 실시간 크롤링 → 프롬프트에 주입(Context Injection)

Recommendation Tool (추천 + 필터링)
추천 도구는 기본 추천 외에, 난이도/태그 조건을 처리하도록 분리했다.
- 난이도 조절: “더 어렵게” 요청이 반복되면 이전 값보다 누적적으로 가중치 증가(또는 감소)
- 태그 기반 필터링: 포함/제외 태그를 받아 DB 조회 결과를 재필터링

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

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

트러블 슈팅
“더 어렵게” 같은 애매한 요청 처리
단발성 요청만 반영하면 대화가 이어질수록 사용자의 기대와 어긋나기 쉬웠다. 그래서 “난이도 조절” 요청은 세션 컨텍스트에서 누적 관리하고, 다음 추천에 재사용하도록 설계했다. 이 방식으로 같은 요청이 반복될 때 추천 난이도가 점진적으로 변화하는 것을 확인했다.
커버리지/롱테일 이슈
EASE 기반 상위 추천은 인기 문제로 쏠리는 경향이 있었다. 특히 상위 100개 추천 내 커버리지가 제한적이어서, interaction이 적은 문제들이 추천에서 배제되는 문제가 관찰되었다. 향후에는 모델 앙상블/재랭킹 등으로 개선 여지가 있다.
회고 및 다음 단계
추천 시스템을 “추천 결과를 보여주는 앱”이 아니라, 학습 상황에서 바로 도움이 되는 대화형 도우미로 만들기 위해 구조를 재정의한 경험이었다. 특히 MCP로 “도구 호출 → 정보 확보 → 답변 생성”의 루프를 만든 것이 서비스 품질을 가장 크게 끌어올린 포인트였다.
- 아쉬운 점: 온라인 서빙(실시간 추론)까지는 완성하지 못했고, 자동화된 데이터 파이프라인도 최소 수준에 머물렀다.
- 개선 방향
- 데이터 수집/재학습 자동화(Airflow 등)
- 하이브리드 추천(EASE + 시퀀스 모델) 및 재랭킹 고도화