RAG 알고리즘 이해하기
RAG란?
**RAG(Retrieval-Augmented Generation)**는 AI가 답변을 생성할 때, 먼저 관련 문서를 **검색(Retrieval)**한 후 그 내용을 참고하여 **답변을 생성(Generation)**하는 기술입니다.
쉽게 말해, AI가 "오픈북 시험"을 치르는 것과 같습니다. 암기된 지식만으로 답하는 것이 아니라, 관련 자료를 찾아본 후 답변합니다.
사용자 질문
│
▼
① 검색 (Retrieval)
"질문과 관련된 문서 조각을 찾아라"
│
▼
② 컨텍스트 구성
검색된 문서 조각들을 LLM에게 전달
│
▼
③ 생성 (Generation)
LLM이 문서를 참고하여 답변 생성
│
▼
답변 (출처 포함)
PlantPulse RAG 파이프라인
1단계: 문서 인덱싱 (사전 준비)
문서를 AI가 검색할 수 있는 형태로 변환하는 과정입니다.
원본 문서 (PDF, DOCX, 이미지)
│
▼
┌─────────────────────────┐
│ Docling 파서 │
│ 문서 → 텍스트 + 이미지 │
│ + 테이블 구조 추출 │
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ 청킹 (Chunking) │
│ 긴 문서를 512토큰 단위로 │
│ 적절한 크기로 분할 │
│ (50토큰 오버랩) │
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ 임베딩 (Embedding) │
│ 텍스트 → 2560차원 벡터 │
│ 의미를 숫자 배열로 변환 │
└────────┬────────┬───────┘
│ │
▼ ▼
┌────────┐ ┌────────┐
│ Qdrant │ │ Neo4j │
│ 벡터DB │ │ 그래프 │
└────────┘ └────────┘
청킹이란?
10페이지 매뉴얼을 통째로 검색하면 비효율적입니다. 적절한 크기로 나누면 정확한 부분만 찾을 수 있습니다.
[원본 문서: 10페이지 매뉴얼]
↓ 청킹
[청크 1] 1장 개요 부분 (512토큰)
[청크 2] 1장 뒷부분 ~ 2장 앞부분 (512토큰, 50토큰 오버랩)
[청크 3] 2장 중반부 (512토큰, 50토큰 오버랩)
...
오버랩(Overlap): 청크 경계에서 문맥이 끊기지 않도록 앞 청크의 마지막 50토큰을 다음 청크에 포함합니다.
임베딩이란?
텍스트의 의미를 숫자 배열(벡터)로 변환합니다. 의미가 비슷한 문장은 벡터 공간에서 가까이 위치합니다.
"펌프 베어링 교체 방법" → [0.12, -0.34, 0.56, ..., 0.78] (2560차원)
"펌프 축수 정비 절차" → [0.11, -0.33, 0.55, ..., 0.77] ← 비슷한 벡터!
"오늘 날씨가 좋다" → [0.89, 0.23, -0.67, ..., 0.12] ← 다른 벡터
2단계: 검색 (Retrieval)
사용자 질문이 들어오면 관련 문서 청크를 찾습니다.
Dense 검색 (의미 기반)
질문을 같은 임베딩 모델로 벡터화하고, 벡터 공간에서 가장 가까운 문서 청크를 찾습니다.
질문: "주입기 베어링 교체 주기는?"
│
▼ 임베딩
질문 벡터: [0.13, -0.35, 0.54, ...]
│
▼ 코사인 유사도 계산
문서 청크 A (점수 0.92): "주입기 베어링은 6개월마다 교체..." ← 선택!
문서 청크 B (점수 0.85): "펌프 축수 정비 시 베어링 점검..." ← 선택!
문서 청크 C (점수 0.31): "작업장 안전 수칙..." ← 제외
장점: "교체 주기" = "정비 간격" 같은 의미적 유사성을 이해합니다.
Sparse 검색 (키워드 기반)
정확한 단어 매칭으로 검색합니다. BM25 알고리즘 기반입니다.
질문: "TAG_DJ_M_01_1_1093 허용 온도"
│
▼ 키워드 추출
["TAG_DJ_M_01_1_1093", "허용", "온도"]
│
▼ 키워드 매칭
문서 청크 A: "TAG_DJ_M_01_1_1093의 허용 온도 범위는..." ← 정확히 매칭!
장점: 설비 ID, 모델명 등 고유 식별자를 정확히 찾습니다.
하이브리드 검색 (PlantPulse 기본 모드)
Dense + Sparse를 결합하여 의미 검색의 이해력과 키워드 검색의 정확성을 동시에 확보합니다.
최종 점수 = Dense 점수 × α + Sparse 점수 × (1-α)
PlantPulse RAG는 하이브리드 모드를 기본으로 사용합니다. 기술 문서에는 전문 용어와 설비 ID가 많아 키워드 매칭이 중요하기 때문입니다.
3단계: 리랭킹 (Reranking)
초기 검색 결과(Top 10)를 리랭커 모델이 정밀 재평가하여 최종 Top 5를 선정합니다.
초기 검색 결과 (Top 10)
│
▼
┌─────────────────────────────┐
│ Reranker (rerank-multilingual-v3.0) │
│ │
│ 질문과 각 문서 청크를 │
│ 쌍으로 비교하여 │
│ 관련도를 정밀 평가 │
└──────────────┬──────────────┘
│
▼
최종 결과 (Top 5) — 가장 관련도 높은 문서만 전달
리랭커는 검색보다 더 정교한 모델을 사용하여 질문-문서 관련도를 평가합니다. 검색 단계에서 놓친 미묘한 관련성을 잡아냅니다.
4단계: 답변 생성 (Generation)
검색된 문서 청크를 LLM에게 컨텍스트로 전달하여 답변을 생성합니다.
[시스템 프롬프트]
아래 문서를 참고하여 질문에 답하세요.
[검색된 문서]
문서 1: "주입기 베어링은 6개월마다 교체하며..."
문서 2: "교체 시 SKF 6205-2RS 규격을 사용..."
[사용자 질문]
주입기 베어링 교체 주기와 규격을 알려줘.
↓ LLM 생성
[답변]
주입기 베어링 교체 주기는 6개월이며, SKF 6205-2RS 규격을 사용합니다.
(출처: 정비 매뉴얼 3장)
4가지 검색 모드 비교
| 모드 | 동작 방식 | 적합한 상황 |
|---|---|---|
| hybrid | Dense + Sparse 결합 | 일반적인 문서 검색 (기본값, 권장) |
| naive | Dense 전용 (시맨틱) | 개념적 질문 ("OEE란 무엇인가?") |
| local | 문서 내부 상세 검색 | 특정 문서의 세부 내용 확인 |
| global | 문서 간 관계 탐색 (KG) | 여러 문서에 걸친 종합 정보 |
지식 그래프 RAG (Graph RAG)
PlantPulse RAG는 벡터 검색 외에 Neo4j 지식 그래프를 활용한 검색도 지원합니다.
문서 인덱싱 시:
텍스트 → 엔티티 추출 → 관계 추출 → Neo4j 그래프 저장
검색 시 (global 모드):
질문 → 관련 엔티티 → 그래프 탐색 → 연결된 문서 청크
장점: "주입기와 관련된 모든 정비 매뉴얼" 같은 관계 기반 검색이 가능합니다.