RAG(Retrieval-Augmented Generation) 이란?
일반 LLM 은 사전에 학습된 데이터만으로 답을 생성하지만, RAG 는 외부 지식(PDF, 문서, DB)을 검색해서 그걸 바탕으로
더 정확하고 구체적인 답을 생성한다.
즉, RAG 는 LLM 에 외부 지식 소스를 연계하여 사전 학습된 내용뿐만 아니라 우리가 필요한 내용도 학습시켜 검색할 수 있는
기술이다.
📘 예시 상황: PDF 파일을 LLM이 이해하게 하려면?
PDF → 텍스트 추출 → (1) Text Split → (2) Embedding → (3) Vector Store 저장
→ 사용자의 질문 → (4) 유사도 검색 → (5) 관련 문단 가져옴 → (6) LLM에 프롬프트로 전달 → 답변 생성
✅ 각 단계 설명
📌 1. Text Split (텍스트 분할)
- PDF 의 긴 텍스트를 작은 조각들로 나눈다 (예: 문단 단위, N자 단위, 의미 단위)
- 나누는 이유 : 너무 긴 문장은 LLM 이 이해하기 힘들고 백터화 과정에서 조각 단위가 좋아야 검색 효율이 높아진다.
🔹 예시: ["1. 개요...", "2. 기술 설명...", "3. 결론..."] 처럼 나누어진다.
📌 2. Embedding (임베딩: 벡터화)
- 각 조각들을 임베딩 모델을 통해 고차원 수치 벡터로 바꾼다.
- 이 벡터는 문장의 의미, 맥락을 수치적으로 표현한 것이다.
- 예: "Spring Boot는..." → [0.12, -0.98, ..., 0.33] (512차원 등)
- 자주 쓰이는 임베딩 모델:
- OpenAI text-embedding-3-small
- BGE-m3, Instructor-XL, Kohya, E5, 등
📌 3. Vector Store 저장
- 이렇게 변환된 벡터들을 벡터 DB(예: FAISS, Chroma, Wwaviate 등)에 저장해 둡니다.
- 문맥 유사도 기반 검색이 가능한 형태로 보관한다.
- 유사도라는건 벡터화 시킨 데이터의 수치값들을 비교하여 가장 높은 유사도를 가진 데이터를 사용자에게 제공
📌 4. 검색(Retrieval)
- 사용자가 질문하면 그 질문도 벡터로 임베딩해서 벡터 DB에 있는 조각들과 유사도(cosine similarity)를 비교한다.
- 가장 관련있는 문단들을 찾아낸다.
📌 5. 관련 문단을 프롬프트로 구성
- 가장 관련있는 문단을 다시 텍스트로 묶어서 질문과 함께 LLM 에게 전달한다.
📄 [Retrieved Context]
"Spring Boot는 Java 기반 웹 프레임워크입니다..."
❓ [질문]
Spring Boot가 어떤 방식으로 의존성 관리를 하나요?
📌 6. LLM이 답 생성 (Generation)
- 이렇게 주어진 "문맥 + 질문"을 바탕으로 LLM이 정확한 답변을 생성한다.
- 이게 바로 RAG(Retrieval-Augmented Generation) 이다
✅ 요약 정리
단계 |
설명 |
핵심 |
1. Text Split |
문서를 조각냄 |
작은 단위로 나누기 |
2. Embedding |
텍스트 → 벡터 |
수학적 표현 |
3. Vector Store |
벡터 저장 |
검색 준비 완료 |
4. Retrieval |
질문 → 관련 조각 찾기 |
유사도 기반 검색 |
5. Prompting |
문맥 + 질문 → LLM 입력 |
LLM이 읽을 수 있게 구성 |
6. Generation |
답변 생성 |
실제 응답 나옴 |
🧠 덧붙이면: Embedding = 의미 벡터
- 사람 입장에서 "유사하다" 는 문장을 컴퓨터 입장에서는 벡터 간의 거리(수학적 거리)로 측정하게 된다.
- 예: "고양이는 귀엽다" 와 "고양이는 사랑스럽다"
→ 벡터 거리 0.12 (가깝다 = 유사하다)