본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 10. 31. · 21 Views
RAG 패턴 완벽 가이드 검색증강생성
RAG(Retrieval-Augmented Generation)는 외부 지식을 검색하여 LLM의 응답 품질을 향상시키는 패턴입니다. 벡터 데이터베이스와 임베딩을 활용해 관련 문서를 찾고, 이를 컨텍스트로 제공하여 더 정확하고 최신의 답변을 생성합니다.
들어가며
이 글에서는 RAG 패턴 완벽 가이드 검색증강생성에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- 기본_RAG_파이프라인
- 문서_임베딩_생성
- Chroma_벡터_DB_구축
- LangChain_RAG_구현
- 문서_청킹_전략
- 하이브리드_검색
- 리랭킹으로_정확도_향상
- 메타데이터_필터링
- 스트리밍_RAG_응답
- RAG_평가_메트릭
1. 기본 RAG 파이프라인
개요
RAG의 핵심은 Query → 임베딩 → 유사 문서 검색 → LLM 생성 4단계입니다. 사용자 질문을 벡터로 변환하고 유사한 문서를 찾아 LLM에 전달합니다.
코드 예제
def simple_rag(query, docs, model):
# 1. Query 임베딩
query_vec = embed(query)
# 2. 유사 문서 검색
relevant = search_similar(query_vec, docs, top_k=3)
# 3. 컨텍스트 생성
context = "\n".join(relevant)
# 4. LLM 응답 생성
return model.generate(f"Context: {context}\nQ: {query}")
설명
질문을 임베딩하고, 가장 관련성 높은 문서를 찾아 LLM에게 컨텍스트로 제공하여 답변의 정확도를 높입니다.
2. 문서 임베딩 생성
개요
문서를 벡터로 변환하여 검색 가능한 형태로 만듭니다. OpenAI의 임베딩 모델을 사용하면 의미적 유사도를 계산할 수 있습니다.
코드 예제
from openai import OpenAI
client = OpenAI()
def create_embeddings(texts):
response = client.embeddings.create(
model="text-embedding-3-small",
input=texts
)
return [item.embedding for item in response.data]
vectors = create_embeddings(["RAG란 무엇인가?", "벡터 검색 방법"])
설명
텍스트를 벡터로 변환하여 의미적 유사도 계산이 가능하게 만듭니다. 이 벡터들은 벡터 DB에 저장됩니다.
3. Chroma 벡터 DB 구축
개요
Chroma는 간단하게 사용할 수 있는 벡터 데이터베이스입니다. 문서를 저장하고 유사도 검색을 수행할 수 있습니다.
코드 예제
import chromadb
client = chromadb.Client()
collection = client.create_collection("docs")
collection.add(
documents=["RAG는 검색증강생성입니다", "벡터DB는 임베딩을 저장합니다"],
ids=["doc1", "doc2"]
)
results = collection.query(query_texts=["RAG란?"], n_results=2)
설명
문서를 컬렉션에 추가하고, 질문과 유사한 문서를 자동으로 검색합니다. Chroma가 임베딩과 검색을 자동 처리합니다.
4. LangChain RAG 구현
개요
LangChain은 RAG 구현을 간소화합니다. 문서 로더, 벡터 스토어, 체인을 연결하여 완전한 RAG 시스템을 구축합니다.
코드 예제
from langchain.chains import RetrievalQA
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
vectorstore = Chroma.from_documents(documents, embeddings)
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(),
retriever=vectorstore.as_retriever()
)
answer = qa_chain.run("RAG의 장점은?")
설명
벡터 스토어와 LLM을 연결하여 자동으로 관련 문서를 검색하고 답변을 생성하는 체인을 만듭니다.
5. 문서 청킹 전략
개요
긴 문서는 작은 청크로 나누어야 검색 정확도가 높아집니다. 오버랩을 두면 문맥 손실을 방지할 수 있습니다.
코드 예제
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = splitter.split_text(long_document)
print(f"총 {len(chunks)}개의 청크 생성")
설명
문서를 500자 단위로 나누되, 50자씩 겹치게 하여 문맥이 끊기지 않도록 합니다. 청크 크기는 사용 사례에 따라 조정합니다.
6. 하이브리드 검색
개요
키워드 검색(BM25)과 벡터 검색을 결합하면 검색 품질이 향상됩니다. 각 방식의 장점을 모두 활용할 수 있습니다.
코드 예제
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever
bm25 = BM25Retriever.from_documents(docs)
vector = vectorstore.as_retriever()
ensemble = EnsembleRetriever(
retrievers=[bm25, vector],
weights=[0.4, 0.6]
)
results = ensemble.get_relevant_documents("RAG 검색")
설명
BM25(키워드)와 벡터 검색 결과를 가중치로 결합하여 더 정확한 문서를 찾습니다. 벡터 검색에 60% 가중치를 부여했습니다.
7. 리랭킹으로 정확도 향상
개요
초기 검색 결과를 재정렬하여 가장 관련성 높은 문서만 LLM에 전달합니다. 응답 품질과 비용을 동시에 개선합니다.
코드 예제
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CohereRerank
compressor = CohereRerank(top_n=3)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vectorstore.as_retriever(search_kwargs={"k": 10})
)
docs = compression_retriever.get_relevant_documents("RAG 성능 개선")
설명
10개 문서를 검색한 후 Cohere Rerank로 상위 3개만 선택합니다. LLM에 더 관련성 높은 컨텍스트만 제공합니다.
8. 메타데이터 필터링
개요
날짜, 카테고리, 저자 등 메타데이터로 검색 범위를 좁혀 정확도를 높입니다. 특정 조건의 문서만 검색할 수 있습니다.
코드 예제
collection.add(
documents=["2024년 RAG 트렌드"],
metadatas=[{"year": 2024, "category": "AI"}],
ids=["doc1"]
)
results = collection.query(
query_texts=["RAG 트렌드"],
where={"year": 2024}
)
설명
메타데이터에 year와 category를 추가하고, 2024년 문서만 검색하도록 필터를 적용합니다. 검색 범위를 제한하여 정확도를 높입니다.
9. 스트리밍 RAG 응답
개요
긴 답변을 한 번에 기다리지 않고 실시간으로 받을 수 있습니다. 사용자 경험을 크게 개선합니다.
코드 예제
from langchain.callbacks import StreamingStdOutCallbackHandler
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()]),
retriever=vectorstore.as_retriever()
)
qa_chain.run("RAG의 미래는?")
설명
스트리밍 콜백을 설정하면 LLM이 생성하는 답변을 실시간으로 출력합니다. 웹 애플리케이션에서 타이핑 효과를 구현할 때 유용합니다.
10. RAG 평가 메트릭
개요
RAG 시스템의 품질을 측정하려면 검색 정확도와 생성 품질을 모두 평가해야 합니다. Faithfulness와 Answer Relevancy가 핵심 지표입니다.
코드 예제
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy
result = evaluate(
dataset=test_dataset,
metrics=[faithfulness, answer_relevancy]
)
print(f"Faithfulness: {result['faithfulness']}")
print(f"Relevancy: {result['answer_relevancy']}")
설명
Faithfulness는 답변이 검색된 문서에 근거하는지, Answer Relevancy는 질문과 얼마나 관련있는지 측정합니다. 두 지표 모두 높아야 좋은 RAG 시스템입니다.
마치며
이번 글에서는 RAG 패턴 완벽 가이드 검색증강생성에 대해 알아보았습니다. 총 10가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#Python #RAG #VectorDB #Embeddings #LLM
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.