AI VIDEO BRIEFING

RAG 챗봇 만들기: Gemini·LangChain·ChromaDB로 PDF 문서 질의응답 구축하기

500쪽 사내 문서를 업로드하면 질문에 답하는 RAG 챗봇을, 라이브러리에 의존하지 않고 청킹·임베딩·ChromaDB·Gemini 파이프라인으로 한 줄씩 직접 구현하는 방법을 정리했다.

Gemini·LangChain·ChromaDB로 PDF 질문답변 RAG 챗봇 처음부터 만들기 영상 대표 이미지

핵심 메시지

  • LLM은 사용자의 노트북에 있는 PDF 내용을 모른다. 프롬프트로 보낸 것만 알기 때문에, 사내 문서로 답하려면 검색 증강 생성(RAG)이 필요하다.
  • RAG 파이프라인은 문서 적재 → 텍스트 추출(PyPDF) → 청킹 → 임베딩 → 벡터 DB 저장(1단계), 질문 임베딩 → 유사도 검색 → 상위 청크 추출 → LLM 생성(2·3단계)으로 나뉜다.
  • 임베딩은 RAG의 핵심이다. 텍스트를 의미를 담은 고차원 벡터로 바꿔, 정확한 키워드 일치가 아니라 의미 기반 검색을 가능하게 한다.
  • 벡터 DB에는 임베딩만이 아니라 원문 텍스트와 메타데이터(페이지, 출처, 섹션)를 함께 저장해야 LLM이 근거 있는 답을 만들 수 있다.
  • 환각을 막기 위해 Gemini 생성 단계에서 temperature를 0으로 두어, 모델이 지어내지 않고 검색된 문맥에서만 답하도록 한다.

쉽게 이해하기

영상은 "매니저가 500쪽짜리 회사 정책 문서를 주며 읽을 시간이 없으니 PDF를 올리면 질문에 곧바로 답하는 챗봇을 만들어 달라"는 상황을 예로 든다. PDF를 그냥 Gemini에 올려 물어보면 될 것 같지만, 대형 언어 모델은 사용자의 기기에 저장된 문서 내용을 알지 못하고 프롬프트로 전달된 내용만 안다. 그래서 자신의 문서로 답하게 하려면 RAG(Retrieval Augmented Generation)가 필요하다.

진행자는 라이브러리에 통째로 맡기지 않고 파이프라인을 처음부터 만들며 코드 한 줄씩 설명한다. 먼저 PyPDF로 PDF 페이지에서 텍스트를 추출하는 문서 적재(document ingestion) 단계를 거친다. 예제는 학습 목적을 위해 데이터 양보다 원리 이해에 초점을 두어 한 쪽짜리 짧은 PDF를 사용한다.

다음은 청킹이다. 문서를 통째로 읽는 대신 작은 조각으로 나누는데, LLM에는 문맥 창(context window) 한계가 있고 전체 문서를 보내는 것은 느리고 비싸며 대개 불필요하기 때문이다. 예제에서는 RecursiveCharacterTextSplitter로 chunk size 1,000, chunk overlap 200을 준다. 겹침(overlap)은 이웃한 청크끼리 문맥이 끊기지 않도록 이전 청크의 일부를 공유하게 한다.

이어 임베딩 단계에서 각 청크를 의미를 담은 수치 벡터로 변환한다. 영상은 Gemini 임베딩 모델을 쓰며, 각 텍스트를 3,072차원 벡터로 표현한다고 설명한다. 의미가 비슷한 텍스트는 벡터 공간에서 서로 가깝게 배치되어, 코사인 유사도로 의미 기반 검색이 가능해진다. 생성한 임베딩은 원문 텍스트·메타데이터와 함께 ChromaDB에 저장한다.

2단계에서는 사용자의 질문을 같은 방식으로 임베딩해 ChromaDB에서 코사인 유사도로 가장 가까운 상위 청크(예: k=3)를 검색한다. 3단계에서 검색된 청크와 질문을 함께 Gemini 2.5 Flash에 전달하면, 리트리버가 찾아온 정보를 자연스러운 문장으로 답한다. 진행자는 "직원은 연 18일의 연차를 받는다"는 실제 답이 나오는 것을 보여주며, 프런트엔드·백엔드를 붙여 배포하는 후속편 가능성도 언급한다.

주요 인사이트

  • 리트리버 자체는 답을 만들지 못한다. 문서에서 관련 정보를 찾아올 뿐이고, 그것을 읽어 자연스러운 답으로 만드는 일은 Gemini 같은 LLM의 몫이다.
  • 문서 임베딩은 색인(인덱싱) 단계에서 한 번만 만들어 저장하고, 질문이 들어올 때마다 질문만 임베딩해 비교한다. 그래서 검색이 빠르고 전체 문서를 매번 다시 임베딩하지 않는다.
  • ChromaDB는 벡터를 만들지 않는다. 벡터 생성은 임베딩 단계의 일이고, ChromaDB는 저장과 효율적인 검색만 담당한다.
  • 메타데이터가 없으면 "직원은 18일 연차를 받는다"만 알 수 있지만, 페이지·출처를 함께 저장하면 "직원 핸드북 5쪽에 따르면" 같은 근거를 붙인 답을 만들 수 있다.
  • 진행자는 예전 임베딩 모델(구버전)을 쓰다 두 시간 넘게 막힌 경험을 공유하며, 오류를 직접 디버깅하는 과정에서 코드를 훨씬 깊이 이해하게 된다고 강조한다.

자주 묻는 질문

RAG가 왜 필요한가?

LLM은 사용자의 기기에 저장된 사적 문서 내용을 알지 못하고 프롬프트로 전달된 것만 안다. RAG는 자신의 문서(PDF·워드·사내 정책 등)에서 텍스트를 추출·검색해 관련 정보만 LLM에 전달함으로써, 모델이 그 문서를 근거로 답하게 해준다.

청크 크기 1,000, 겹침 200으로 3,500자 문서를 나누면 청크는 몇 개가 되나?

영상의 설명에 따르면 약 4개다. 겹침 200 때문에 1~1,000, 800~1,800, 1,600~2,600 식으로 앞 청크의 일부를 공유하며 나뉘기 때문이다.

생성 단계에서 temperature를 0으로 두는 이유는?

값이 높으면 모델이 스스로 답을 지어내(환각) 문서에 없는 내용을 만들 수 있다. temperature 0은 모델이 검색된 문맥에서만 답을 뽑아내도록 억제한다.

원문과 출처

이 글은 원본 영상의 자막을 바탕으로 한국어 독자를 위해 요약했습니다. 전체 맥락과 최신 정보는 원문에서 확인하세요.

YouTube 원본 영상 보기 ↗

관련 AI 소식