
RAG 정밀도 개선 입문 — 평가 방법론과 흔히 발생하는 실수
요약
RAG 시스템의 정밀도를 개선하기 위해 막연한 추측 대신 체계적인 평가 방법론을 도입하는 방법을 설명합니다. 베이스라인 설정, 검색과 생성 지표의 분리, 그리고 지속적인 평가 세트 업데이트를 통한 개선 사이클 구축을 강조합니다.
핵심 포인트
- 정확한 개선을 위해 검색(Retrieval)과 생성(Generation) 지표를 분리하여 기록해야 함
- 대표 쿼리 세트를 구축하여 변경 전후의 지표 차이를 비교하는 것이 핵심
- 완벽한 정답 문장보다는 정보 포함 여부를 확인하는 체크리스트 방식의 평가가 효율적
- 검색 재현율(Recall)이 낮으면 프롬프트 수정만으로는 품질 개선에 한계가 있음
RAG를 실무에서 사용하기 시작하면, "답변이 빗나감", "근거 없는 단언이 섞임", "고유명사를 놓침"과 같은 불만이 발생한다.
청크(Chunk) 크기나 모델을 갑자기 변경하더라도, 무엇이 잘못되었는지 모르는 상태라면 개선 작업이 막연한 추측에 의존하기 쉽다.
이 기사에서는 RAG의 정밀도 개선을 평가부터 시작하는 사고방식과 초보자가 빠지기 쉬운 실수 패턴을 정리한다.
| 관점 | 내용 |
|---|---|
| 가장 먼저 할 일 | 대표 쿼리 세트(20~50건)를 준비하여 현재의 베이스라인(Baseline)을 기록한다 |
| ... | |
| 포인트: 체감상 "왠지 나쁘다"라고 말하기보다, 어느 단계에서 실패하고 있는지를 라벨링(Labeling)한 평가 세트가 있으면 다음 단계의 조치가 명확해진다. |
RAG의 정밀도는 데이터 수집·청킹(Chunking)·임베딩(Embedding)·검색(Retrieval)·리랭킹(Reranking)·프롬프트(Prompt)·LLM 설정 등, 여러 노드(Node)의 곱으로 결정된다.
하나만 바꾸고 "좋아진 것 같다"라고 판단하면, 다른 쿼리에서는 악화되는 케이스를 놓치기 쉽다.
전형적인 함정은 다음 세 가지다.
| 함정 | 발생하는 현상 | 대책 방향 |
|---|---|---|
| 전체 스코어만 확인 | 검색은 개선되었으나 생성(Generation)이 악화되는 등 상쇄됨 | 검색 지표와 생성 지표를 별도로 기록한다 |
| ... | ||
| 평가 세트는 한 번 만들고 끝내는 것이 아니라, 새로운 실패 사례가 나올 때마다 1건씩 추가해 나가는 운영 방식이 현실적이다. |
| 카테고리 | 예시 | 추가하는 이유 |
|---|---|---|
| 사실 확인 | "〇〇의 기본값은?" | 검색의 재현율(Recall)을 확인하기 위해 |
| ... | ||
| 초보자의 경우, 다음 2단계만으로도 충분한 경우가 많다. |
검색 골드(Search Gold): 이 질문에는 "청크 ID(또는 해당 단락)"가 정답이라고 1건 이상 지정 -
답변 골드(Answer Gold): 기대하는 답변의 요점을 3줄 이내로 작성 (완전 일치는 요구하지 않음) -
완벽한 정답 문장을 준비하기보다, **"이 정보가 포함되어 있으면 합격"**이라는 체크리스트 형식이 운영하기 더 쉽다.
스프레드시트나 CSV로 다음 열을 구성하면 개선 사이클을 돌릴 수 있다.
query_id | 질문문 | 기대 청크 | 취득 청크(Top5) | 검색 OK? | 답변 요점 | 생성 OK? | 메모
"검색 OK?", "생성 OK?"는 Yes/No/부분(Partial)으로 충분하다. 우선은 수동 라벨링으로 진행하고, 건수가 늘어나면 LLM-as-a-Judge나 RAGAS 등의 자동 평가를 검토한다.
검색 단계에서는 올바른 근거가 후보에 포함되어 있는가가 주전장이다.
| 지표 | 의미 | 초보자를 위한 해석 |
|---|---|---|
| Recall@K | 정답 청크가 Top-K에 포함되는 비율 | "정답이 들어있는 책이 상위 K권 안에 들어있을 확률" |
| ... | ||
| 수치의 절대값보다 **변경 전후의 차이(Difference)**를 본다. 예를 들어 Recall@5가 0.55 → 0.72로 올라갔다면, 청크 크기 변경이나 하이브리드 검색(Hybrid Search) 추가의 효과를 읽어낼 수 있다. |
| 실패 패턴 | 증상 | 우선 시도할 대책 |
|---|---|---|
| 청크가 너무 큼 | 관련 단락 주변의 노이즈가 많음 | 크기를 줄이고 오버랩(Overlap)을 적용한다 |
| ... | ||
| 검색의 재현율(Recall)이 낮은 상태에서 생성 프롬프트만 다듬어도, LLM에 전달되는 재료가 부족하기 때문에 효과는 제한적이다. |
검색이 어느 정도 잘 되더라도, 답변 품질은 별개의 문제다.
| 지표 | 의미 | 확인 포인트 |
|---|---|---|
| Faithfulness (충실성) | 답변이 취득한 청크에 기반하고 있는가 | 근거 없는 단언이 없는가 |
| ... | ||
| 수동 평가에서는 다음 세 가지 선택지가 실무적이다. |
합격: 근거에 따라 질문에 답변하고 있음 -
부분 합격: 요점은 맞지만 누락되거나 장황함 -
불합격: 할루시네이션(Hallucination), 질문과 무관함, 근거와 모순
| 실패 패턴 | 증상 | 우선 시도할 대책 |
|---|---|---|
| 컨텍스트 과다 | 길지만 빗나간 답변 | Top-K를 줄이거나 리랭킹(Reranking)을 강화한다 |
| ... | ||
| 평가 세트가 완성되면, 다음 루프를 1주일 단위로 돌리는 것이 현실적이다. |
1. 베이스라인 측정 (검색·생성을 별도 스코어로 기록)
↓
2. 실패 쿼리를 "검색", "생성", "둘 다"로 분류
...
한 번에 여러 파라미터를 바꾸지 않는 것이 철칙이다. 청크 크기와 임베딩 모델, 프롬프트를 동시에 바꾸면 무엇이 효과가 있었는지 알 수 없게 된다.
| 우선순위 | 대상 | 이유 |
|---|---|---|
| 높음 | 데이터 수집 및 전처리 품질 | 데이터 구조 깨짐이나 노이즈는 후속 단계에서 수정할 수 없음 |
| ... |
- 평가용 쿼리를 카테고리별로 20건 이상 준비했다
- 각 쿼리에 대해 「기대되는 청크 (Expected Chunk)」 또는 「기대되는 답변 요점」을 작성했다
- 검색 (Recall@K 등)과 생성 (충실성·관련성)을 별도의 열로 기록하고 있다
- 베이스라인 (Baseline)을 1회 측정하고 수치를 저장했다
- 실패한 쿼리에 대해 검색/생성/둘 다에 라벨을 붙였다
- 한 번의 변경은 1개의 파라미터(Parameter)로 제한하고 있다
- 프롬프트에 「근거가 없는 경우에는 모른다고 답할 것」을 명시했다
- 운영 환경의 로그에서 익명화된 샘플을 정기적으로 평가 세트에 추가하는 운영 방식을 결정했다
패턴 1: 데모용 5개 질문만으로 「정확도 90%」라고 보고한다 → 대책: 카테고리가 분산된 평가 세트와 변경 전후의 차이(Difference) 표를 반드시 남긴다.
패턴 2: 검색 성능이 낮은데 프롬프트만 100번 시도한다 → 대책: 먼저 Recall@K를 측정하고, 누락되는 정보가 많다면 청킹 (Chunking)이나 하이브리드 검색 (Hybrid Search)부터 손을 댄다.
패턴 3: 자동 평가 점수만 믿고 있다가 실제 운영 환경에서 무너진다 → 대책: LLM-as-a-Judge는 참고 지표일 뿐이다. 최종적으로는 수동 샘플 검사와 운영 피드백을 통해 보정한다.
패턴 4: 정답 데이터의 업데이트를 잊는다 → 대책: 문서 개정 시 평가 세트의 기대값도 함께 업데이트하는 규칙을 정한다.
패턴 5: 개선과 동시에 기능 추가 (에이전트화 등)를 진행한다 → 대책: RAG 단독의 베이스라인이 안정된 후에 다음 기능을 추가한다.
- RAGAS — Evaluation framework for RAG
- LangChain — Evaluation
- LlamaIndex — Evaluation
- Pinecone — RAG evaluation
- OpenAI — Cookbook: How to evaluate LLMs
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기