💡 핵심 인사이트 RAG(Retrieval-Augmented Generation)는 "외부 지식 베이스에서 관련 정보를 검색하여 LLM(대형 언어 모델)의 입력으로 제공하고, 이를 기반으로 더 정확하고 사실적인 답변을 생성하는" 인공지능 프레임워크입니다. LLM은 (내부에) (학습된) (지식을) (사용) (하지만) (최신) (정보를) (모르거나) (환각) (Hallucination) (을) (할) (수) (있습니다) ()。(RAG는) (검색) (증강) (을) (통해) (") (이) (문서에서) (답을) (찾아줘") (→) (") (찾은) (문서를) (참고해서) (답변해줘") (방식으로) (문서를) (기반으로) (한) (정확한) (답변을) (가능하게) (합니다) ())。
Ⅰ. LLM의 한계와 RAG의 등장 배경
LLM(대형 언어 모델)은 (교육 시점) (학습된) (지식을) (기반으로) (답변) (생성) (합니다) ()。(그러나) (다음) (한계가) (있습니다) ():
[LLM의 한계]
1. 최신 정보 부재:
- LLM의 학습 시점 이후의 사건을 모름
- 예: "2024년 이후에 출시된 스마트폰은?"
2. 환각 (Hallucination):
- 학습 데이터에서 충분히 뒷받침되지 않는 내용을
그럴듯하게 생성
- "_그림을 그린 것으로 알려져 있습니다_" (실제로는 다른 작가)
3. 특정 도메인 지식 부족:
- 사내 문서, proprietary 데이터에 대한 지식 없음
- 예: "_우리 회사의 반품 정책은?" → 모름
RAG의 해결책: RAG는 (검색) (증강) (을) (통해) (이) (한계를) (극복) (합니다) ()。
[RAG 동작 흐름]
┌─────────────────────────────────────────────────────────────────┐
│ RAG 동작 흐름 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 사용자의 질문 │
│ "트랜잭션 고립화 수준의 종류와 특징을 설명해줘" │
│ │ │
│ ▼ │
│ 2. 질문 벡터화 (Embedding) │
│ ┌─────────────────────────────────────────┐ │
│ │ embed_model.encode("트랜잭션 고립화 수준...")│ │
│ │ → [0.123, -0.456, 0.789, ...] (1536차원) │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 3. 벡터 DB에서 ANN 검색 (Top-K 관련 문서) │
│ ┌─────────────────────────────────────────┐ │
│ │ "READ COMMITTED의 특징..." (score: 0.92) │ │
│ │ "REPEATABLE READ의 특징..." (score: 0.89)│ │
│ │ "트랜잭션 격리 수준 개요..." (score: 0.85) │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 4. LLM에 컨텍스트로 제공 │
│ ┌─────────────────────────────────────────┐ │
│ │ 시스템: "이 문서들을 참고해서 답변해줘" │ │
│ │ 사용자: "트랜잭션 고립화 수준..." │ │
│ │ [检索된 문서 Chunks 1, 2, 3...] │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 5. LLM이 문서를 참고하여 답변 생성 │
│ ┌─────────────────────────────────────────┐ │
│ │ "트랜잭션 고립화 수준은 4가지가 있습니다: │ │
│ │ 1. READ UNCOMMITTED..." │ │
│ │ (검색된 문서의 내용을 바탕으로 정확한 답변) │ │
│ └─────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Ⅱ. RAG 시스템 구성 요소
[RAG 시스템 아키텍처]
┌─────────────────────────────────────────────────────────────────┐
│ RAG 시스템 구성 요소 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. Document Loader │
│ - PDF, Word, HTML, Markdown 등 문서 로드 │
│ - LangChain, Unstructured API 등 │
│ │
│ 2. Text Splitter (Chunking) │
│ - 대용량 문서를 작은 Chunk로 분할 │
│ - 예: 1000 토큰 단위, 200 토큰 오버랩 │
│ - 너무 작으면 문맥 부족, 너무 크면噪声増加 │
│ │
│ 3. Embedding Model │
│ - OpenAI text-embedding-3-small │
│ - Sentence-BERT, CLIP 등 │
│ │
│ 4. Vector Store │
│ - Pinecone, Milvus, Weaviate, Qdrant, PGVector │
│ - ANN 인덱싱 (HNSW, IVF 등) │
│ │
│ 5. Retrieval (검색) │
│ - 단순 유사도 검색 (Simple Retrieval) │
│ - 하이브리드 검색 (키워드 + 벡터) │
│ - 재순위화 (Reranking) - MMER 등 │
│ │
│ 6. LLM │
│ - GPT-4, Claude, Llama, Mistral 등 │
│ │
│ 7. Prompt Template │
│ ┌─────────────────────────────────────────┐ │
│ │ "컨텍스트: {context} │ │
│ │ 질문: {question} │ │
│ │ 컨텍스트를 참고하여 정확하게 답변해줘." │ │
│ └─────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Ⅲ. RAG 파이프라인 구축
# RAG 파이프라인 구축 예시 (LangChain 기반)
from langchain.document_loaders import PDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 문서 로드
loader = PDFLoader("./database_handbook.pdf")
documents = loader.load()
# 2. Chunk 분할
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 1000 토큰 단위
chunk_overlap=200 # 200 토큰 오버랩 (문맥 유실 방지)
)
chunks = text_splitter.split_documents(documents)
# 3. Embedding + Vector Store 저장
embeddings = OpenAIEmbeddings()
vectorstore = Pinecone.from_documents(
chunks,
embeddings,
index_name="database-rag"
)
# 4. Retrieval Chain 구성
llm = ChatOpenAI(model="gpt-4")
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 모든 Retrieved 문서를 하나의 프롬프트에 통합
retriever=vectorstore.as_retriever(
search_kwargs={"k": 5} # Top-5 문서检索
)
)
# 5. 질문
result = qa_chain.run("트랜잭션 고립화 수준의 종류와 특징은?")
print(result)
Ⅳ. RAG의 평가 지표
[RAG 평가 지표]
┌─────────────────────────────────────────────────────────────────┐
│ RAGAs (RAG Assessment) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 응답 충실성 (Faithfulness) │
│ - LLM의 답변이 Retrieved 문서와 일치하는 정도 │
│ - 높을수록 환각↓ │
│ │
│ 2. 응답 관련성 (Answer Relevance) │
│ - LLM의 답변이 질문과 관련성 있는 정도 │
│ │
│ 3. 검색 관련성 (Context Precision) │
│ - Retrieved 문서들이 질문와 관련성 있는 정도 │
│ - 모든 Top-K 문서가 실제로 관련 있어야 함 │
│ │
│ 4. 컨텍스트 재현율 (Context Recall) │
│ - 실제 정답에 필요한 정보가 Retrieved 문서에 포함된 정도 │
│ │
│ 5. 컨텍스트 정밀도 (Context Precision) │
│ - Retrieved 문서 중 실제 관련 있는 문서의 비율 │
│ │
└─────────────────────────────────────────────────────────────────┘
Ⅴ. RAG의 고급 기법과 📢 비유
고급 RAG 기법:
[고급 RAG 기법]
1. Hybrid Search (하이브리드 검색)
- 키워드 검색 (BM25) + 벡터 검색 결합
- "_정확한 용어_"와 "_의미적 유사_" 모두捕獲
2. Reranking (재순위화)
- 초기 검색 후 cross-encoder로 재순위화
- 예: Cohere Rerank, monoBERT
3. Query Expansion (쿼리 확장)
- 원본 질문을 여러 버전으로 확장
- 예: "트를 → '트랜잭션', 'transaction', '거래'" 등
4. Self-Query (자기 쿼리)
- LLM이 메타데이터 필터를 스스로 결정
- 예: "2023년 이후의 문서에서..."
5. Multi-Hop RAG
- 여러 단계에 걸친 추론이 필요한 질문対応
- 예: "이 회사의 매출과 경쟁사 비교..."
RAG vs Fine-tuning:
[RAG vs Fine-tuning 선택 기준]
RAG 선택:
- 자주 변경되는 지식 (최신 정보)
- 다양한 소스의 문서
- 설명 가능성 (어떤 문서에서 답았는지 추적 가능)
- 구현이 비교적简单
Fine-tuning 선택:
- 상대적으로 정적인 지식
- 특정 스타일/용어 학습
- 빠른 추론 속도 필요
- 패턴 기반 작업
📢 섹션 요약 비유: RAG는 **"시험에서 열람형 자료를 허용하는 것에 비유"**할 수 있습니다. (순수) (LLM만) (이용하는) (것은) (") (参考) (자료) (없이) (시험을) (치는) (것) (과) (같습니다) ()。(답변을) (모두) (기억에서) (꺼내야) (하므로) (最新) (정보는) (모르고) (환각) (을) (할) (수) (있습니다) ()。(RAG는) (") (열람) (형) (자료) ((문서)) (를) (펼볼) (수) (있는) (시험) (과) (같습니다) ()。(시험자) ((LLM)) (가) (모르는) (부분이) (있으면) (资料를) (찾아서) (참고한) (후) (답변을) (작성) (합니다) ()。(이를) (통해) (より) (正確で) (_ newest_) (한) (답변을) (提供할) (수) (있습니다) ())。