본문으로 건너뛰기

RAG 알고리즘 이해하기

RAG란?​

**RAG(Retrieval-Augmented Generation)**는 AI가 답변을 생성할 때, 먼저 관련 문서를 **검색(Retrieval)**한 후 그 내용을 참고하여 **답변을 생성(Generation)**하는 기술입니다.

쉽게 말해, AI가 "오픈북 시험"을 치르는 것과 같습니다. 암기된 지식만으로 답하는 것이 아니라, 관련 자료를 찾아본 후 답변합니다.

사용자 질문
│
▼
① 검색 (Retrieval)
"질문과 관련된 문서 조각을 찾아라"
│
▼
② 컨텍스트 구성
검색된 문서 조각들을 LLM에게 전달
│
▼
③ 생성 (Generation)
LLM이 문서를 참고하여 답변 생성
│
▼
답변 (출처 포함)

PlantPulse RAG 파이프라인​

1단계: 문서 인덱싱 (사전 준비)​

문서를 AI가 검색할 수 있는 형태로 변환하는 과정입니다.

원본 문서 (PDF · DOCX · PPTX · XLSX · MD · TXT)
│
▼
┌─────────────────────────┐
│ Docling 파서 │
│ 문서 → 텍스트 + 이미지 │
│ + 테이블 구조 추출 │
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ 청킹 (Chunking) │
│ 긴 문서를 제목·문단 단위로│
│ 적절한 크기로 분할 │
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ 임베딩 (Embedding) │
│ 텍스트 → 2560차원 벡터 │
│ 의미를 숫자 배열로 변환 │
└────────┬────────┬───────┘
│ │
▼ ▼
┌────────┐ ┌────────┐
│ Qdrant │ │ Neo4j │
│ 벡터DB │ │ 그래프 │
└────────┘ └────────┘

청킹이란?​

10페이지 매뉴얼을 통째로 검색하면 비효율적입니다. 적절한 크기로 나누면 정확한 부분만 찾을 수 있습니다.

[원본 문서: 10페이지 매뉴얼]

↓ 청킹

[청크 1] 1장 개요 (제목 아래 문단들을 묶음)
[청크 2] 2장 점검 절차
[청크 3] 2장 표 · 그림 설명
...
문서나누는 방식
PDF · DOCX · PPTX · XLSX제목과 문단을 따라 묶습니다(한 조각 목표 약 2,000토큰). 표·그림·수식은 따로 뽑아, 그림에는 Aura 가 설명문을 붙입니다
MD · TXT1,200토큰 단위로 나누고, 경계에서 문맥이 끊기지 않게 100토큰을 겹칩니다
값은 엔진(LightRAG v1.5.7)의 기본값입니다

PlantPulse 설치는 청크 크기를 따로 지정하지 않으므로 엔진 기본값이 그대로 쓰입니다.

임베딩이란?​

텍스트의 의미를 숫자 배열(벡터)로 변환합니다. 의미가 비슷한 문장은 벡터 공간에서 가까이 위치합니다.

"펌프 베어링 교체 방법" → [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)​

사용자 질문이 들어오면 관련 문서 조각을 찾습니다. PlantPulse 의 RAG 엔진(LightRAG)은 벡터 검색과 지식 그래프를 함께 씁니다.

벡터 검색 (의미 기반)​

질문을 같은 임베딩 모델로 벡터화하고, 벡터 공간에서 가장 가까운 것을 찾습니다.

질문: "주입기 베어링 교체 주기는?"
│
▼ 임베딩
질문 벡터: [0.13, -0.35, 0.54, ...]
│
▼ 코사인 유사도 계산

문서 청크 A (점수 0.92): "주입기 베어링은 6개월마다 교체..." ← 선택!
문서 청크 B (점수 0.85): "펌프 축수 정비 시 베어링 점검..." ← 선택!
문서 청크 C (점수 0.31): "작업장 안전 수칙..." ← 제외

장점: "교체 주기" = "정비 간격" 같은 의미적 유사성을 이해합니다.

지식 그래프 검색 (엔티티 · 관계)​

색인할 때 뽑아 둔 엔티티(설비·부품·절차 등)와 그 사이의 관계를 따라갑니다.

질문: "주입기 베어링 교체 주기는?"
│
▼ 질문에서 키워드 추출
세부 키워드: ["주입기", "베어링"] → 엔티티 쪽 (local)
상위 키워드: ["정비 주기", "교체"] → 관계 쪽 (global)
│
▼ 그래프 탐색
주입기 ─(구성품)─▶ 베어링 ─(정비)─▶ 6개월 교체 절차
│
▼ 연결된 문서 조각을 모음

장점: 한 문서에 다 적혀 있지 않은 내용도, 여러 문서에 흩어진 관계를 이어 찾습니다.

「키워드 검색(BM25)」은 따로 없습니다

예전 문서는 기본 모드를 「Dense + Sparse(BM25) 결합」으로 설명했지만, 사용 중인 엔진에는 BM25 같은 희소(키워드) 색인이 없습니다. 설비 ID 처럼 정확히 맞춰야 하는 이름은 엔티티로 뽑혀 그래프에 들어가는 것으로 잡힙니다.

하이브리드 검색 (PlantPulse 기본 모드)​

hybrid 는 local(엔티티 중심) + global(관계 중심) 을 합친 것으로, RAG 관문과 채팅 도구의 기본 모드입니다. 설비·부품 이름(엔티티)과 「무엇이 무엇에 영향을 주나」(관계)를 함께 봅니다.


3단계: 리랭킹 (Reranking)​

이 판에서는 리랭커를 쓰지 않습니다

리랭커 모델(aura-reranker-0.6b)은 스택에 떠 있지만, 2026.09 판의 문서 검색 엔진에는 연결돼 있지 않습니다(검증 전이라 꺼 둔 상태). 검색 결과는 위 2단계의 순위 그대로 답변 생성으로 넘어갑니다.

리랭커를 켜면 초기 검색 결과를 질문–문서 쌍으로 다시 비교해 관련도 순으로 다시 세웁니다. 검색 단계에서 놓친 미묘한 관련성을 잡는 단계입니다.


4단계: 답변 생성 (Generation)​

검색된 문서 청크를 LLM에게 컨텍스트로 전달하여 답변을 생성합니다.

[시스템 프롬프트]
아래 문서를 참고하여 질문에 답하세요.

[검색된 문서]
문서 1: "주입기 베어링은 6개월마다 교체하며..."
문서 2: "교체 시 SKF 6205-2RS 규격을 사용..."

[사용자 질문]
주입기 베어링 교체 주기와 규격을 알려줘.

↓ LLM 생성

[답변]
주입기 베어링 교체 주기는 6개월이며, SKF 6205-2RS 규격을 사용합니다.
(출처: 정비 매뉴얼 3장)

4가지 검색 모드 비교​

모드동작 방식적합한 상황
hybridlocal + global (그래프의 엔티티와 관계를 함께)일반적인 문서 검색 (기본값, 권장)
naive문서 조각의 벡터 유사도만 — 그래프 안 씀개념적 질문 ("OEE란 무엇인가?")
local질문에 나온 엔티티 중심특정 설비·부품의 세부 내용 확인
global엔티티 사이 관계 중심여러 문서에 걸친 종합 정보

엔진에는 이 밖의 모드(mix 등)도 있지만 PlantPulse 의 RAG 관문은 위 넷만 받습니다.


지식 그래프 RAG (Graph RAG)​

PlantPulse RAG는 벡터 검색 외에 Neo4j 지식 그래프를 활용한 검색도 지원합니다.

문서 인덱싱 시:
텍스트 → 엔티티 추출 → 관계 추출 → Neo4j 그래프 저장

검색 시 (local · global · hybrid 모드):
질문 → 관련 엔티티·관계 → 그래프 탐색 → 연결된 문서 청크

장점: "주입기와 관련된 모든 정비 매뉴얼" 같은 관계 기반 검색이 가능합니다.

엔티티 추출은 LLM 이 합니다 — 색인이 오래 걸리는 이유

문서 조각마다 Aura 가 엔티티와 관계를 뽑습니다. 조각 하나에 수 분이 걸릴 수 있고, 한 조각이 시간 안에 못 끝나면 그 문서 전체가 실패로 남습니다 → 문제 해결