클래스업 - 사전 상담 기능

2025.10 – 2025.12
Backend / AI / RAG
클래스업 사전 상담
클래스업 사전 상담
클래스업 사전 상담

About Project

  • 서비스: 클래스업 (학원 SaaS)
  • 팀 구성: 2명 (FE 1, BE 1)
  • 담당: 백엔드 전반 (API · DB · RAG · OpenAI 연동)
  • 기간: 2025.10 ~ 2025.12

Objective

학원 상담 전에 학생·학부모 정보를 수집하고, RAG 기반으로 학원 내부 수업·교재 데이터를 검색해 상담 요약과 추천 결과를 생성하는 백엔드 기능.

Tools & Technologies

Express.js, TypeScript, MySQL, Sequelize, MongoDB, MongoDB Vector Search, OpenAI API, Swagger

Challenge

문제 상황

기존 상담 프로세스에서는 상담 전에 학생의 성적, 희망 과목, 학부모 의견 등을 체계적으로 파악하기 어려웠고, 상담 품질도 담당자마다 달라질 수 있었습니다. 또한 상담 후 정식 등록으로 이어질 경우, 이미 입력한 정보를 다시 활용하기 어려운 비효율이 있었습니다.

이를 해결하기 위해 사전 상담 단계에서 학생·학부모 정보를 구조화해 수집하고, 상담 전에 핵심 내용을 자동 요약하며, 학원 내부에 등록된 실제 수업·교재 정보까지 연결해 상담 지원이 가능한 기능을 구현했습니다.

서비스 흐름

  1. 학부모/학생이 사전 상담 링크를 통해 상담지를 작성합니다.
  2. 백엔드에서 학생 정보, 성적, 상담 응답을 저장합니다.
  3. 상담 내용을 바탕으로 RAG 검색을 수행해 학원 내부 수업·교재 후보를 조회합니다.
  4. OpenAI API를 통해 다음 정보를 생성합니다.
    • 학생 요약
    • 학부모 의견 요약
    • 추천 수업
    • 추천 교재
    • 상담 메모 초안
  5. 관리자 화면에서 결과를 확인하고 실제 상담에 활용합니다.
  6. 이후 정식 등록 단계와도 연계할 수 있도록 구조를 설계했습니다.

핵심 기술적 판단

1. 사전 상담 단계를 위한 temp_user 구조 설계

사전 상담 단계의 사용자는 아직 정식 등록 전 상태이기 때문에, 기존 회원 테이블에 바로 귀속시키기에는 정보가 불완전했습니다. 반면 상담 이후 실제 등록으로 이어질 수 있으므로, 일회성 데이터처럼 버리기에도 아쉬움이 있었습니다.

이를 해결하기 위해 정식 회원과 분리된 temp_user 구조를 두고, 사전 상담 단계의 성적·상담지·추천 결과를 이 임시 엔터티에 연결했습니다.

이 구조를 통해 다음과 같은 장점을 확보했습니다.

  • 상담 단계와 등록 단계를 자연스럽게 분리
  • 아직 회원이 아닌 사용자도 안정적으로 관리
  • 등록 시 임시 데이터를 정식 프로세스로 연계할 수 있는 확장성 확보

단순 입력 저장용 테이블이 아니라, 사전 상담에서 정식 등록까지 이어지는 흐름을 고려해 도메인 구조를 설계했습니다.

어려웠던 점과 해결

1. 교재 / 수업 추천이 제대로 작동하지 않던 문제

초기에는 MySQL의 ngram full-text parser를 사용해 상담 정보와 유사한 학원 측 수업·교재 정보를 검색하고, 이를 LLM에 전달해 추천하는 방식을 시도했습니다. 하지만 이 방식은 유사 단어가 많이 포함된 문서, 즉 정보량이 많은 문서가 계속 우선 노출되는 문제가 있었습니다. 그 결과 학생의 실제 상황과 맞는 수업보다 단순히 텍스트 양이 많은 문서가 반복적으로 추천되는 한계가 있었습니다.

이를 해결하기 위해 기존에 사용하던 MongoDB의 Vector Search 기능을 활용해 RAG 구조로 개선했습니다. 학생 상담 정보와 학원 측이 등록한 수업·교재 정보를 벡터 검색으로 연결하고, 검색된 결과를 OpenAI API의 컨텍스트로 전달해 추천을 생성하도록 구성했습니다.

이 개선을 통해:

  • 단순 키워드 매칭보다 문맥 기반 검색이 가능해졌고
  • 학생의 희망 과목, 부족한 과목, 목표 전형 등을 더 자연스럽게 반영할 수 있었으며
  • 추천 정확도를 체감할 수 있을 정도로 높일 수 있었습니다

검색 품질이 AI 추천 결과에 직접적인 영향을 준다는 점을 경험했고, 단순 LLM 호출보다 검색 계층 설계가 서비스 품질에 더 중요할 수 있다는 점을 배웠습니다.

2. LLM 응답 형식이 일정하지 않았던 문제

초기에는 LLM이 추천 결과를 자유 서술형으로 반환하도록 구성했는데, 응답 형식이 매번 달라 관리자 화면에서 후처리하기 어려웠습니다. 어떤 응답은 수업 추천만 길게 나오고, 어떤 응답은 교재 정보가 빠지거나 구조가 불안정해 실제 기능으로 사용하기에 한계가 있었습니다.

이를 해결하기 위해 프롬프트를 개선해 출력 항목을 명확히 구분하고, 가능한 한 고정된 섹션 구조로 응답하도록 유도했습니다.

출력 항목은 다음과 같이 정리했습니다.

  • 학생 요약
  • 학부모 의견 요약
  • 추천 수업
  • 추천 교재
  • 상담 메모 초안

또한 서버 측에서 응답 유효성을 검증하고,

  • 필수 항목 누락 여부 확인
  • 누락 시 재시도
  • 실패 시 fallback 처리

가 가능하도록 개선했습니다.

이를 통해:

  • 관리자 화면에서 후처리 가능한 구조 확보
  • 응답 품질 편차 감소
  • AI 결과를 실제 서비스 기능으로 안정적으로 연결 가능

단순히 LLM을 붙이는 데서 끝나지 않고, 실제 서비스에서 활용 가능한 형태로 응답을 안정화했습니다.

구현 포인트

  • 학생 상담 정보와 학원 내부 수업·교재 데이터를 연결하는 RAG 파이프라인 구현
  • 학원 내부 데이터만 추천 근거로 사용하도록 구성해 운영 가능성과 정합성 확보
  • 상담 원문, 성적, 추천 결과를 분리 저장해 이후 활용성과 확장성 고려
  • Swagger를 사용해 프론트엔드와 API 명세를 공유하고 협업 효율 향상

ERD 핵심 설계 포인트

  • tb_temp_user를 중심으로 정식 등록 전 상담 데이터를 관리
  • 성적 정보는 tb_temp_user_score로 분리해 다과목·다시험 기록을 유연하게 저장
  • 상담 원문은 tb_temp_user_intake, AI 기반 요약·추천 결과는 tb_temp_user_intake_summary로 분리해 저장
  • 이후 정식 등록 프로세스와 연결할 수 있도록 확장성 있는 구조를 고려

성과 및 배운 점

  • 상담 전 수집 정보를 구조화해 상담 준비 흐름을 표준화할 수 있었습니다
  • 단순 키워드 검색의 한계를 벡터 검색 기반 RAG로 개선하며 검색 품질을 높였습니다
  • LLM 결과를 자유 생성에 맡기지 않고, 응답 구조 고정과 서버 검증을 통해 실제 서비스에 사용할 수 있는 형태로 안정화했습니다
  • 백엔드 개발자로서 DB 모델링, API 설계, 검색 구조 개선, AI 연동을 하나의 기능 안에서 통합적으로 설계해본 경험이었습니다

한 줄 회고

이 프로젝트를 통해 단순 기능 구현을 넘어, 실제 서비스 흐름 안에서 데이터 구조, 검색 품질, AI 응답 안정성까지 함께 설계하는 백엔드 개발의 중요성을 배웠습니다.

© 2026 Lagoon Portfolio. All rights reserved.