단순히 LLM에게 "자소서 고쳐줘"라고 요청하는 방식은 한계가 있다. 실제 합격 자소서 데이터를 참고하여 더 설득력 있는 글을 작성하고, 작성된 글을 다른 AI가 제3자의 눈으로 냉정하게 평가하는 "작성(Writer) - 검증(Validator)" 파이프라인을 구축하는 것이 오늘의 목표다.
사용자의 질문과 가장 유사한 '합격 자소서 데이터'를 벡터 DB에서 검색하여, AI에게 참고 자료(Context)로 제공하는 기능을 구현했다.
pgvector 확장 모듈을 사용했다. 로컬 환경 오염을 방지하기 위해 Docker Container로 DB 환경을 구성했다.RagDataLoader): 서버가 시작될 때 resources/knowledge 폴더에 있는 텍스트 파일(직무 역량, 지원 동기 등 합격 사례)을 자동으로 읽어 임베딩(Embedding) 후 벡터 DB에 적재하도록 했다.하나의 AI 모델에 의존하지 않고, 역할에 따라 OpenAI와 Google Gemini를 나누어 사용하는 Multi-LLM 구조를 설계했다.
AiClient 컴포넌트가 이 역할을 수행하며, openAiChatModel을 주입받아 동작한다.AiValidator 컴포넌트가 담당하며, geminiChatModel을 주입받아 동작한다.💡 왜 2개의 AI를 쓰나요?
글을 쓴 사람(AI)이 자기 글을 검토하면 관대해질 수밖에 없습니다. 서로 다른 벤더(OpenAI vs Google)의 모델을 사용하여 교차 검증(Cross Validation)을 함으로써, 더 객관적이고 품질 높은 자소서를 완성할 수 있습니다. (그리고 Gemini Flash 모델은 무료라서 가성비도 좋습니다!)
Spring AI의 ChatModel 인터페이스를 활용하여, 코드의 결합도를 낮췄다.
AiValidator는 구체적인 클래스(GeminiChatModel)가 아닌 인터페이스(ChatModel)에 의존한다.@Qualifier)만 변경하면 바로 갈아끼울 수 있는 유연한 구조가 되었다.RagDataLoader가 20여 개의 합격 자소서 파일을 읽어 벡터 DB에 적재 완료.