SelfCheck_AI 9. RAG 기반 합격 사례 참조 및 Multi-LLM(OpenAI + Gemini) 검증 시스템 구축 (26.02.01)

Meustar·2026년 1월 31일

Project

목록 보기
12/15

🚀 오늘의 개발 목표

단순히 LLM에게 "자소서 고쳐줘"라고 요청하는 방식은 한계가 있다. 실제 합격 자소서 데이터를 참고하여 더 설득력 있는 글을 작성하고, 작성된 글을 다른 AI가 제3자의 눈으로 냉정하게 평가하는 "작성(Writer) - 검증(Validator)" 파이프라인을 구축하는 것이 오늘의 목표다.

🛠️ 주요 구현 내용

1. RAG (검색 증강 생성) 시스템 도입

사용자의 질문과 가장 유사한 '합격 자소서 데이터'를 벡터 DB에서 검색하여, AI에게 참고 자료(Context)로 제공하는 기능을 구현했다.

  • Vector DB 구축: PostgreSQL의 pgvector 확장 모듈을 사용했다. 로컬 환경 오염을 방지하기 위해 Docker Container로 DB 환경을 구성했다.
  • 데이터 자동 적재 (RagDataLoader): 서버가 시작될 때 resources/knowledge 폴더에 있는 텍스트 파일(직무 역량, 지원 동기 등 합격 사례)을 자동으로 읽어 임베딩(Embedding) 후 벡터 DB에 적재하도록 했다.
  • 효과: 이제 AI는 "그냥 잘 써줘"가 아니라, "이 합격 사례들의 문체와 논리 구조를 참고해서 써줘"라는 구체적인 지시를 수행하게 된다.

2. Multi-LLM 파이프라인 (2-Step Architecture)

하나의 AI 모델에 의존하지 않고, 역할에 따라 OpenAIGoogle Gemini를 나누어 사용하는 Multi-LLM 구조를 설계했다.

  • Step 1: Writer (작성자) - OpenAI (GPT-3.5/4)
  • RAG로 검색된 합격 사례를 바탕으로 사용자의 자소서를 구체화하고 다듬는 역할을 맡는다.
  • AiClient 컴포넌트가 이 역할을 수행하며, openAiChatModel을 주입받아 동작한다.
  • Step 2: Validator (검증관) - Google Gemini (Flash 1.5)
  • Step 1에서 작성된 자소서를 "면접관의 시선"으로 평가한다.
  • 점수(0~100점)를 매기고, 구체적인 감점 요인을 분석하여 피드백을 제공한다.
  • AiValidator 컴포넌트가 담당하며, geminiChatModel을 주입받아 동작한다.

💡 왜 2개의 AI를 쓰나요?
글을 쓴 사람(AI)이 자기 글을 검토하면 관대해질 수밖에 없습니다. 서로 다른 벤더(OpenAI vs Google)의 모델을 사용하여 교차 검증(Cross Validation)을 함으로써, 더 객관적이고 품질 높은 자소서를 완성할 수 있습니다. (그리고 Gemini Flash 모델은 무료라서 가성비도 좋습니다!)

3. 유연한 구조 설계 (Polymorphism)

Spring AI의 ChatModel 인터페이스를 활용하여, 코드의 결합도를 낮췄다.

  • AiValidator는 구체적인 클래스(GeminiChatModel)가 아닌 인터페이스(ChatModel)에 의존한다.
  • 덕분에 나중에 Gemini 대신 Claude(Anthropic)로 교체하고 싶다면, 코드 수정 없이 설정(@Qualifier)만 변경하면 바로 갈아끼울 수 있는 유연한 구조가 되었다.

📸 결과 화면

  • 서버 구동 시: RagDataLoader가 20여 개의 합격 자소서 파일을 읽어 벡터 DB에 적재 완료.
  • API 호출 시:
    1. 사용자 질문 -> RAG 검색 (유사 합격 사례 3건 도출)
    2. OpenAI -> 합격 사례 참고하여 자소서 수정 (Draft)
    3. Gemini -> 수정본 검증 및 점수 산정 (Validation)
    4. 최종 결과 반환 (JSON)
profile
유튜브 기술 영상을 보면서 잘 이해하기 위해... Lilys AI를 활용해 배경지식, 영상 전체 요약 및 핵심 내용 설명들을 블로깅 합니다. 작성한 내용들에 대해서 언제고 다시 "내가" 찾아 볼 수 있도록 기록으로 남깁니다!

0개의 댓글