‘모르겠다’고 말할 줄 아는 RAG 앱 만들기
요약
본 글은 RAG(검색 증강 생성) 기술을 활용하여, 답변 근거가 확실한 정보만을 제공하고 모르는 질문에는 '모르겠다'고 정중하게 거절하는 웹 앱 구축 과정을 설명합니다. PDF 학습 노트를 기반으로 작동하며, 청크 분할, 임베딩, FAISS 인덱싱 등의 구체적인 기술 스택과 시스템 설계 원칙을 공유합니다.
핵심 포인트
- 검색 품질(청크 크기, 임계값)이 답변의 정확성과 거절 능력에 핵심적입니다.
- 명확한 시스템 프롬프트와 구조화된 JSON 출력이 일관성 있는 응답을 만듭니다.
- 실제 배포 과정에서 얻는 경험적 지식이 가장 큰 학습 효과를 제공합니다.
모르는 것을 알 때 '모르겠다'고 말하는 RAG 앱 구축하기
대규모 언어 모델(LLM)은 인상적이지만, 실제로 모르는 내용에 대해서도 자신감 있게 답변합니다. Valentius Kryptix에서의 인턴십 마일스톤을 위해 저는 이 문제를 해결하고자 검색 증강 생성(Retrieval-Augmented Generation, RAG) 앱을 구축했습니다. 이 앱은 제가 제공하는 문서만을 기반으로 답변하는 비서 역할을 합니다. RAG는 관련 텍스트를 먼저 찾아본 다음, 그 내용을 바탕으로 모델에게 답변하도록 요청하여, 답변이 근거가 확실하고 검증 가능하게 유지되도록 작동합니다.
내가 구축한 것
PDF 형식으로 저장된 기계 학습(machine learning) 학습 노트를 기반으로 대화할 수 있는 작은 웹 앱입니다. "랜덤 포레스트는 어떤 테스트 RMSE에 도달했나요?"라고 질문하면, 노트에서 답변을 찾고 출처 구절까지 보여줍니다. 프랑스의 수도와 같이 관련 없는 것을 물어보면, 문서에서는 해당 정보를 찾을 수 없다고 정중하게 답합니다. 여기에서 직접 사용해 볼 수 있습니다: https://rag-study-assistant-fro0.onrender.com/
작동 방식
- 청크(Chunk): PDF 텍스트를 약 800자 크기의 조각으로 나누고 약간의 중복을 두어 아이디어가 중간에 끊기지 않도록 합니다.
- 임베딩(Embed): 각 청크는 로컬에서 실행되는 소규모 오픈소스 임베딩 모델을 사용하여 벡터로 변환합니다. 따라서 유료 API가 필요하지 않습니다.
- 인덱싱(Index): 이 벡터들을 빠른 유사성 검색을 위해 FAISS에 저장합니다.
- 검색(Retrieve): 사용자의 질문도 동일한 방식으로 임베딩하고, 가장 가까운 4개의 청크를 가져옵니다.
- 생성(Generate): 이 청크들을 Groq의 API를 통해 LLM으로 전송하며, 컨텍스트만을 기반으로 답변하라는 엄격한 지침을 함께 전달합니다.
백엔드는 FastAPI로 구현되었고, 인터페이스는 단일 HTML 페이지이며, 전체 시스템은 Render에 배포되었습니다.
세 가지 주요 시사점
검색 품질이 모든 것을 결정합니다. 청크 크기, 중복 정도, 그리고 유사성 임계값(similarity threshold)이 앱이 올바르게 답변할지 아니면 모른다고 인정할지를 결정합니다. 너무 작은 청크는 컨텍스트를 잃고, 너무 큰 청크는 정답을 묻어버립니다. 이 임계값을 조정하는 것이 주제와 무관한 질문에 대해 거절 응답을 할 수 있게 만든 핵심이었습니다.
프롬프트는 제품의 일부입니다. 명확한 시스템 프롬프트(system prompt), 두 개의 퓨샷 예시(few-shot examples), 그리고 구조화된 JSON 출력(답변, "answerable" 플래그 및 출처 번호)은 응답을 일관성 있게 만들고 인용하기 쉽게 했습니다.
배포(Shipping)가 가장 많이 가르쳐줍니다. 환경 변수(environment variables)에 API 키를 보관하고, 인터페이스에서 오류를 명확하게 보여주며, 서버에서만 나타나는 문제를 디버깅하는 과정이 어떤 튜토리얼보다 저에게 더 많은 것을 가르쳐 주었습니다.
다음 단계
저는 헤딩별 청킹(chunking by headings)을 시도하고, 한 번에 여러 문서를 지원하며, 소규모 테스트 질문 세트로 답변 품질을 측정해 보고 싶습니다.
전체 기사 읽기: 첫 RAG 기반 AI 앱 구축에서 얻은 3가지 강력한 교훈
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기