
LangChain 기반 RAG 시스템 구축
3편. RAG 성능 최적화 + 평가 지표 편
1편에서 데이터 준비,
2편에서 임베딩·벡터DB까지 구축했다면,
이제 중요한 것은 “정확하게 검색하고, 안정적으로 답하게 만드는 것”이다.
사내 문서 기반 RAG 시스템은 다음 문제가 항상 발생한다:
- 잘못된 문서가 검색됨
- 답변에 문서 내용이 누락됨
- 문맥이 끊겨서 사용성이 떨어짐
- 같은 질문인데 매번 답변 품질이 달라짐
이번 편에서는 이를 해결하기 위한
✔ 검색 최적화
✔ Reranker 적용
✔ 평가 지표 정의
✔ 자동 평가 파이프라인
까지 실무 기준으로 모두 정리한다.
1. RAG 성능 최적화를 이해하기
RAG 품질을 높이려면 아래 “3대 블록”을 튜닝해야 한다.
(1) Retriever 성능
(2) Context 구성 전략
(3) LLM 답변 안정성
이 중에서 Retriever 성능이 60~70%를 결정한다.
2. 검색 품질 최적화 (Retriever 강화)
① Top-K 튜닝
Top-K 값을 높이면 recall은 올라가지만 noise가 많아진다.
추천값: k = 3 ~ 8
② Hybrid Search(하이브리드 검색)
가장 성능이 안정적으로 나오는 방식.
BM25(문자 기반 정확도 높음)
+
Vector Search(의미 기반 검색)
LangChain 예시:
retriever = vector_store.as_retriever(search_kwargs={"k": 5})
bm25 = BM25Retriever.from_documents(records)
hybrid = EnsembleRetriever(
retrievers=[bm25, retriever],
weights=[0.4, 0.6]
)
🔎 사내 업무 문서 검색에서는 거의 무조건 Hybrid가 더 정확하다.
③ Reranker 적용(가장 효과 큼)
1차 검색 결과를 Reranker가 다시 정렬한다.
추천 모델:
- bge-reranker-large
- Cohere reranker
- jina-reranker-v2
실제 적용 예시:
from rerankers import Reranker
rr = Reranker("bge-reranker-large", device="cuda")
reranked = rr.rank(
query="해외출장 규정 알려줘",
documents=[doc.page_content for doc in raw_docs]
)
final_docs = [raw_docs[i] for i in reranked.indices]
💡 Reranker 추가만으로 정확도가 체감될 정도로 오른다.
3. Context 구성 최적화
검색된 문서를 그대로 LLM에 넘기면 안 된다.
다음 기준으로 필터링/압축이 필요하다.
① Context 압축(Summarization)
검색 문서가 길면 답변이 흐트러질 수 있다.
LangChain:
from langchain.chains import StuffDocumentsChain
combine_docs = StuffDocumentsChain(
llm=llm,
document_prompt=prompt_for_document,
document_variable_name="docs",
)
② Context 순서 정렬
문서의 출처, 날짜, 제목 순으로 정렬하면 LLM 혼란을 줄인다.
③ Metadata 기반 우선순위
문서 유형이 섞여 있을수록 중요하다.
예:
정책 문서 > 부서별 안내문 > 일반 게시글
filtered = vector_store.similarity_search(
query=q,
filter={"doc_type": "정책"}
)
4. LLM 답변 안정화
정확한 답변을 위해 System Prompt 설계가 중요하다.
기본 템플릿 예시
당신은 회사 내부 문서 기반으로 답변하는 AI Assistant입니다.
검색된 문서 내용만 바탕으로 답변해야 합니다.
추측하거나 문서를 벗어난 내용을 말하지 마세요.
반드시 문서의 근거를 포함해 답변하세요.
답변 포맷 규칙
[답변]
...
[출처 문서]
- 문서명, 페이지 또는 섹션 정보
이렇게 하면 Hallucination이 크게 줄어든다.
5. RAG 평가 지표 정리
RAG를 평가하는 주요 지표는 크게 두 가지다.
① Retrieval 평가 지표
지표 의미
| Recall@K | K개 안에 정답 문서가 포함되는 비율 |
| Precision@K | 검색된 문서 중 실제로 필요한 문서의 비율 |
| nDCG | 검색 결과 순서의 품질 |
| MMR | 다양성과 관련된 지표 |
② Generation 평가 지표
지표 의미
| Faithfulness | 답변이 문서 근거 기반인지 |
| Groundedness | 문서를 정확히 반영했는지 |
| Coherence | 답변이 자연스럽고 논리적인지 |
| Conciseness | 불필요한 내용 없이 간결하게 답하는지 |
6. RAG 평가 자동화 도구 비교
🔎 RAGAS(LangChain 공식)
- 생성·검색 평가 둘 다 가능
- 자동 QA 페어 생성 좋음
🔎 DeepEval
- Hallucination 평가 강력
- 다양한 지표 커버
🔎 LlamaIndex Eval
- 실사용 기준 로그 기반 평가 가능
7. LangChain RAG 평가 코드 예시
샘플 QA 페어 생성
from langchain.smith import RunEvalConfig, run_on_dataset
from langchain.evaluation import load_evaluator
eval = load_evaluator("faithfulness")
results = run_on_dataset(
client=llm,
dataset=qa_dataset,
evaluation=RunEvalConfig(evaluators=[eval])
)
RAGAS 평가 예시
from ragas.metrics import faithfulness, answer_relevancy
from ragas import evaluate
score = evaluate(
llm=llm,
dataset=eval_dataset,
metrics=[faithfulness, answer_relevancy]
)
print(score)
8. RAG 실무에서의 문제 해결 사례
문제 1. 검색이 너무 넓게 잡힘
→ Top-K 줄이고 Reranker 적용
문제 2. 특정 부서 문서 위주로 검색됨
→ Metadata 기반 필터링
문제 3. 답변이 너무 길거나 불필요한 말 포함
→ Prompt에 “요약 우선” 규칙 추가
9. 실전 팁 3개
💡 팁 1 — 검색 품질이 안 좋으면 임베딩 탓이 아니다
대부분 chunk 분할 전략이나 metadata 구조 문제다.
임베딩 교체는 최후 수단.
💡 팁 2 — 실제 사용자 로그 기반으로 평가 세트를 만들면 정확도 폭발적으로 향상
내부 직원 질문 로그(검색어)를 기반으로 QA 페어 만들면
서비스 품질이 현장에서 “확” 좋아진다.
💡 팁 3 — Reranker 적용이 가장 비용 대비 효과가 좋다
GPU 1개로 운영 가능, 검색 품질은 20~40% 향상.
10. 다음 편 예고
📘 4편. 프롬프트 설계 + LLM 체인 구성 편
- Retrieval → Prompt → Generation 흐름 전체
- LangChain PromptTemplate 사용법
- 문서 요약, FAQ 생성, 정책 검색 템플릿
- vLLM + FastAPI + LangChain 실전 코드
🔖 추천 태그
#RAG #LangChain #RAG평가 #RAGAS #DeepEval
#Retrieval #Reranker #nDCG #정보검색 #AI검색
#LLM #사내AI #엔터프라이즈AI #AI도입 #vLLM
'AI·LLM 엔지니어링' 카테고리의 다른 글
| 〈LangChain 기반 RAG 시스템 구축〉 5편: RAG 평가 자동화 + QA 데이터셋 생성 (0) | 2025.11.27 |
|---|---|
| 〈LangChain 기반 RAG 시스템 구축〉 4편: 프롬프트 설계 + LLM 체인 구성 (0) | 2025.11.27 |
| LangChain RAG 구축 2편: 임베딩 모델 선택과 Vector DB 구축 (0) | 2025.11.27 |
| LangChain RAG 구축 1편: 문서 수집·파싱·전처리 파이프라인 (0) | 2025.11.27 |
| 로컬 LLM 서버 구축 가이드: vLLM, GGUF, FastAPI로 사내 AI API 만들기 (0) | 2025.11.27 |