
🔥 LangChain 기반 RAG 시스템 구축
5편. RAG 평가 자동화 + QA 데이터셋 생성 편
(LangChain + Python + LLM·지표 기반 완전 자동화)
RAG 시스템을 만들었다고 끝이 아니다.
“실제로 잘 답하는가?”를 측정하는 정량 평가 체계가 있어야 운영이 가능하다.
이번 편에서는 다음을 전부 자동화한다.
- QA 데이터셋 생성
- 평가 파이프라인 구축
- 지표(Accuracy / Recall / F1 / Faithfulness / Relevance) 계산
- LangChain + 파이썬 기반 스크립트 예제
- 운영 중 자동 평가까지 연결하는 방법
1. RAG 성능 평가가 필요한 이유
RAG는 “검색 → 생성” 두 단계를 거친다.
그래서 문제가 생기면 원인을 찾기 어렵다.
- 검색이 잘못된 건지
- 생성 모델이 잘못 답한 건지
- 프롬프트 구조가 이상한 건지
정량 평가 지표 없이 운영하면 계속 감으로 튜닝하게 된다.
그래서 QA 데이터셋 + 자동 평가 스크립트가 필수다.
2. QA 데이터셋 생성 전략
2.1. QA 데이터셋은 어떻게 만들어야 하나?
✓ 방법 1: LLM을 활용한 자동 생성(추천)
문서에서 요약 → 질문 생성 → 정답 생성을 자동화한다.
✓ 방법 2: SME(도메인 전문가)와 공동 작업
정확도는 올라가지만 속도가 느리다.
✓ 방법 3: 기존 Q&A 기록 활용(사내 FAQ 등)
운영 중인 Q&A 기록이 있다면 최고의 데이터셋이 된다.
3. 문서 기반 QA 데이터셋 자동 생성 워크플로우
문서 → 청킹 → 요약 생성 → 질문 생성 → 정답 생성 → JSON 저장
아래는 바로 실행 가능한 코드이다.
🧩 LangChain 기반 QA 생성 코드 예시
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import json
# 1. 문서 로드
with open("docs/company_policy.txt", "r", encoding="utf-8") as f:
text = f.read()
# 2. 청킹
splitter = RecursiveCharacterTextSplitter(
chunk_size=1200,
chunk_overlap=200
)
chunks = splitter.split_text(text)
llm = ChatOpenAI(model="gpt-4o-mini")
# 3. 프롬프트
prompt = PromptTemplate.from_template("""
다음 문서를 기반으로 질문 3개와 각 질문의 정답을 JSON 배열로 출력하세요.
문서 내용:
{context}
출력 예:
[
{"question": "...", "answer": "..."},
...
]
""")
qa_dataset = []
# 4. 자동 질문/정답 생성
for chunk in chunks:
res = llm.invoke(prompt.format(context=chunk))
qa_dataset.extend(json.loads(res.content))
# 5. 저장
with open("qa_dataset.json", "w", encoding="utf-8") as f:
json.dump(qa_dataset, f, indent=2, ensure_ascii=False)
4. RAG 평가 지표 설계
RAG 평가는 두 파트로 나뉜다.
4.1. 검색 성능 평가(Recall 중심)
- Precision@k
- Recall@k
- HitRate
- MMR 점수
4.2. 생성 성능 평가
- Faithfulness(근거 일치 정도)
- Relevance(질문과 얼마나 맞는지)
- Answer Similarity(정답 유사도)
5. LangChain 기반 RAG 평가 스크립트
Python 코드: 검색 + 생성 평가 자동화
from langchain.evaluation import load_evaluator
from langchain.vectorstores import Chroma
from langchain_openai import ChatOpenAI
import json
# 1. 벡터 DB 로드
db = Chroma(persist_directory="vector_db")
retriever = db.as_retriever(search_kwargs={"k": 3})
# 2. 생성 모델
llm = ChatOpenAI(model="gpt-4o-mini")
# 3. 평가기 로드
faith_eval = load_evaluator("labeled_criteria", criteria="faithfulness")
rel_eval = load_evaluator("labeled_criteria", criteria="relevance")
qa_data = json.load(open("qa_dataset.json", encoding="utf-8"))
results = []
for item in qa_data:
q = item["question"]
a = item["answer"]
docs = retriever.get_relevant_documents(q)
context = "\n".join([d.page_content for d in docs])
# 모델 답변 생성
response = llm.invoke(f"문서 기반으로 답하세요:\n{context}\n\n질문: {q}")
generated = response.content
# 평가
faith_score = faith_eval.evaluate_strings(
prediction=generated,
reference=a,
input=context,
)
rel_score = rel_eval.evaluate_strings(
prediction=generated,
reference=a
)
results.append({
"question": q,
"answer": a,
"generated": generated,
"faithfulness": faith_score["score"],
"relevance": rel_score["score"]
})
# 결과 저장
json.dump(results, open("evaluation_result.json", "w", encoding="utf-8"), indent=2, ensure_ascii=False)
6. 평가 결과 해석
평가 결과를 보면 다음을 확인할 수 있다.
✔ Faithfulness 낮음 → 검색된 문서가 부족함
→ 검색 파라미터 튜닝 / 임베딩 재생성 필요
✔ Relevance 낮음 → 프롬프트 구조 문제
→ 질문 재작성, 체인 개선
✔ Answer Similarity 낮음 → 모델 자체 한계
→ 더 큰 모델 필요 or 프롬프트 강화
7. 운영 환경에서 “자동 평가” 연결하기
운영 환경에서는 다음처럼 자동화할 수 있다.
1) 매주 새 문서 업데이트 → 자동 QA 생성
2) 새 QA 데이터로 RAG 평가 자동 수행
3) 점수가 기준치 이하 → 알람 발송
4) 검색 파라미터 / 임베딩 품질 재점검
즉, RAG 시스템을 지속적 평가(CI/CD) 구조로 운영하게 된다.
⭐ 실전 팁 3개
① QA 데이터셋은 최소 200문항 이상 확보
그래야 평가가 흔들리지 않는다.
② 검색 평가와 생성 평가를 분리해서 분석
어디가 문제인지 정확히 알 수 있다.
③ 평가 결과는 매주 자동 리포트로 발송
운영 중 성능 저하를 즉시 발견할 수 있다.
8. 다음 편 예고
5편에서는 RAG 운영의 핵심이라 할 수 있는
QA 데이터 자동 생성 + 성능 평가 자동화 시스템을 구성했다.
다음 편에서는:
📌 6편. RAG 파이프라인 속도 최적화 & 캐싱 전략 편
으로 이어진다.
🔖 추천 태그
RAG, LangChain, QA데이터셋,
LLM평가, RAG평가, 임베딩,
정보검색, AI시스템운영, MLOps,
AIOps, AI엔지니어링, 검색최적화,
문서기반QA, RAG튜닝, RAG자동화
'AI·LLM 엔지니어링' 카테고리의 다른 글
| 〈LangChain 기반 RAG 시스템 구축〉 7편: RAG 장애 대응, 로그 분석, 관찰성(O11y) 구축 (0) | 2025.11.27 |
|---|---|
| 〈LangChain 기반 RAG 시스템 구축〉 6편: RAG 파이프라인 속도 최적화 & 캐싱 전략 편 (0) | 2025.11.27 |
| 〈LangChain 기반 RAG 시스템 구축〉 4편: 프롬프트 설계 + LLM 체인 구성 (0) | 2025.11.27 |
| 〈LangChain 기반 RAG 시스템 구축〉 3편 : RAG 성능 최적화 + 평가 지표 (0) | 2025.11.27 |
| LangChain RAG 구축 2편: 임베딩 모델 선택과 Vector DB 구축 (0) | 2025.11.27 |