본문 바로가기

AI·LLM 엔지니어링

〈LangChain 기반 RAG 시스템 구축〉 3편 : RAG 성능 최적화 + 평가 지표

반응형

 

LangChain 기반 RAG 시스템 구축

 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

 

반응형