클래스업 - 사전 상담 기능



About Project
Objective
학원 상담 전에 학생·학부모 정보를 수집하고, RAG 기반으로 학원 내부 수업·교재 데이터를 검색해 상담 요약과 추천 결과를 생성하는 백엔드 기능.
Tools & Technologies
Express.js, TypeScript, MySQL, Sequelize, MongoDB, MongoDB Vector Search, OpenAI API, Swagger
Challenge
기존 상담 프로세스에서는 상담 전에 학생의 성적, 희망 과목, 학부모 의견 등을 체계적으로 파악하기 어려웠고, 상담 품질도 담당자마다 달라질 수 있었습니다. 또한 상담 후 정식 등록으로 이어질 경우, 이미 입력한 정보를 다시 활용하기 어려운 비효율이 있었습니다.
이를 해결하기 위해 사전 상담 단계에서 학생·학부모 정보를 구조화해 수집하고, 상담 전에 핵심 내용을 자동 요약하며, 학원 내부에 등록된 실제 수업·교재 정보까지 연결해 상담 지원이 가능한 기능을 구현했습니다.
사전 상담 단계의 사용자는 아직 정식 등록 전 상태이기 때문에, 기존 회원 테이블에 바로 귀속시키기에는 정보가 불완전했습니다. 반면 상담 이후 실제 등록으로 이어질 수 있으므로, 일회성 데이터처럼 버리기에도 아쉬움이 있었습니다.
이를 해결하기 위해 정식 회원과 분리된 temp_user 구조를 두고, 사전 상담 단계의 성적·상담지·추천 결과를 이 임시 엔터티에 연결했습니다.
이 구조를 통해 다음과 같은 장점을 확보했습니다.
단순 입력 저장용 테이블이 아니라, 사전 상담에서 정식 등록까지 이어지는 흐름을 고려해 도메인 구조를 설계했습니다.
초기에는 MySQL의 ngram full-text parser를 사용해 상담 정보와 유사한 학원 측 수업·교재 정보를 검색하고, 이를 LLM에 전달해 추천하는 방식을 시도했습니다. 하지만 이 방식은 유사 단어가 많이 포함된 문서, 즉 정보량이 많은 문서가 계속 우선 노출되는 문제가 있었습니다. 그 결과 학생의 실제 상황과 맞는 수업보다 단순히 텍스트 양이 많은 문서가 반복적으로 추천되는 한계가 있었습니다.
이를 해결하기 위해 기존에 사용하던 MongoDB의 Vector Search 기능을 활용해 RAG 구조로 개선했습니다. 학생 상담 정보와 학원 측이 등록한 수업·교재 정보를 벡터 검색으로 연결하고, 검색된 결과를 OpenAI API의 컨텍스트로 전달해 추천을 생성하도록 구성했습니다.
이 개선을 통해:
검색 품질이 AI 추천 결과에 직접적인 영향을 준다는 점을 경험했고, 단순 LLM 호출보다 검색 계층 설계가 서비스 품질에 더 중요할 수 있다는 점을 배웠습니다.
초기에는 LLM이 추천 결과를 자유 서술형으로 반환하도록 구성했는데, 응답 형식이 매번 달라 관리자 화면에서 후처리하기 어려웠습니다. 어떤 응답은 수업 추천만 길게 나오고, 어떤 응답은 교재 정보가 빠지거나 구조가 불안정해 실제 기능으로 사용하기에 한계가 있었습니다.
이를 해결하기 위해 프롬프트를 개선해 출력 항목을 명확히 구분하고, 가능한 한 고정된 섹션 구조로 응답하도록 유도했습니다.
출력 항목은 다음과 같이 정리했습니다.
또한 서버 측에서 응답 유효성을 검증하고,
가 가능하도록 개선했습니다.
이를 통해:
단순히 LLM을 붙이는 데서 끝나지 않고, 실제 서비스에서 활용 가능한 형태로 응답을 안정화했습니다.
tb_temp_user를 중심으로 정식 등록 전 상담 데이터를 관리tb_temp_user_score로 분리해 다과목·다시험 기록을 유연하게 저장tb_temp_user_intake, AI 기반 요약·추천 결과는 tb_temp_user_intake_summary로 분리해 저장이 프로젝트를 통해 단순 기능 구현을 넘어, 실제 서비스 흐름 안에서 데이터 구조, 검색 품질, AI 응답 안정성까지 함께 설계하는 백엔드 개발의 중요성을 배웠습니다.
Related Projects