RAG 품질 개선 실무

인용 마커를 강제하는 프롬프트 — grounded generation

2026. 07. 08.
AIRAGGrounded GenerationPrompt

앞 편에서 상류 소음을 잘라내 컨텍스트 품질을 올렸다. 하지만 아무리 컨텍스트가 좋아도 이런 답이 나올 수 있다.

컨텍스트: [실적 발표문. "매출 2조" 만 있음]

답: "A사 3분기 매출은 2조 원으로, 반도체 부문 호조와
     환율 효과가 겹친 결과로 보인다."
     ↑↑↑ "반도체 호조"·"환율 효과"는 컨텍스트에 없음

컨텍스트를 무시하고 LLM이 자기 사전지식으로 답을 채운 경우다. 이걸 막는 게 이번 편의 주제 — grounded generation 이다.


Grounded generation의 정의

Grounded generation은 크게 두 가지를 요구한다.

1) 답에 등장하는 모든 사실 진술은 컨텍스트에 근거가 있어야 한다
2) 근거가 없으면 그 진술을 하지 않거나, "정보 없음"을 명시한다

RAG의 이상적인 답은 이거다. 그런데 그냥 프롬프트에

"주어진 컨텍스트를 참고해서 답하라."

라고 쓰면 grounded가 되지 않는다. LLM은 컨텍스트를 참고하되, 자기가 아는 것도 자연스럽게 섞는다. 특히 도메인이 익숙할수록 이 경향이 강해진다.

Grounded를 강제하려면 프롬프트를 훨씬 세밀하게 써야 한다. 세 가지 패턴이 실무에서 반복해서 쓰인다.

1) Citation-aware prompting  → 답에 인용 마커를 강제
2) Chain-of-Verification     → 답을 검증하는 단계를 뒤에 붙임
3) Self-consistency          → 여러 번 생성하고 다수결

1. Citation-aware prompting

가장 실용적인 패턴. 답의 각 문장 뒤에 어느 컨텍스트를 인용했는지 마커로 붙이게 강제한다.

컨텍스트를 다음처럼 번호를 붙여서 준다.

[1] A사 3분기 매출 2조 원 발표.
[2] 3분기 영업이익 3천억 원.
[3] 반도체 사업부문 매출 1조 2천억 원.

답 규칙:
- 답의 모든 문장은 반드시 [n] 마커로 인용을 명시한다.
- 인용할 수 없는 문장은 답에 포함시키지 않는다.
- 컨텍스트에 없는 사실은 "확인되지 않음"이라고만 답한다.

Q. A사 3분기 매출은?
A. A사 3분기 매출은 2조 원이다. [1]

이 패턴이 유효한 이유는 두 가지다.

1) LLM이 답을 만들면서 "이 진술의 근거가 뭐지?"를 스스로 확인한다.
   근거 없는 문장은 마커를 붙일 수 없어서 자연스레 걸러진다.

2) 판정자가 자동 검증할 대상이 명확해진다.
   "답 안의 [n] 마커가 실제 [n] 컨텍스트로 뒷받침되는가"만 보면 된다.
   판정 로직이 훨씬 명확해진다.

인용 마커 강제는 프로젝트에서 뉴스 판단 프롬프트에 도입한 첫 grounded 기법이었다. 도입 전후 실측은 아래에서.


2. Chain-of-Verification (CoVe)

Meta AI가 2023년에 정리한 패턴. 답을 만든 뒤 답을 검증하는 단계를 같은 LLM으로 하나 더 태운다.

step 1) 초기 답을 만든다
step 2) 답 안의 사실 진술을 문장 단위로 분해한다
step 3) 각 문장을 컨텍스트에 대해 재검증하는 질문을 만든다
step 4) 그 질문에 컨텍스트만으로 답한다
step 5) 검증 결과에 따라 최종 답을 수정한다

예:

초기 답: "A사 3분기 매출은 2조 원으로, 반도체 호조가 원인이다."

분해:    ① "A사 3분기 매출은 2조 원"
        ② "반도체 호조가 원인"

검증:    ① 컨텍스트 [1] "A사 3분기 매출 2조 원 발표" → OK
        ② 컨텍스트에 "반도체 호조"의 인과 진술 없음 → FAIL

수정 답: "A사 3분기 매출은 2조 원이다. [1] (원인은 컨텍스트에서
        확인되지 않음)"

Citation-aware가 "답을 만드는 동안" grounded를 강제한다면, CoVe는 "답을 만든 뒤" 검증한다. 두 개는 배타적이지 않고 겹쳐서 쓸 수 있다.

CoVe의 단점은 비용이다. LLM 호출이 최소 2번(초기 답 + 검증)이고, 검증 질문을 문장 수만큼 만들면 더 늘어난다. 실무에선 판정 실패 케이스만 CoVe로 재생성하는 식으로 트리거를 건다.


3. Self-consistency

앞 시리즈(rag-eval/02) 에서 판정을 N회 median으로 안정화했다. Self-consistency는 그것의 생성 버전이다.

같은 (컨텍스트, 질문)으로 답을 N번 생성한다.
답들 사이에서 "일관되게 등장하는 진술"만 최종 답에 포함시킨다.

예:

답 1: "매출 2조. 반도체 호조."
답 2: "매출 2조. 반도체 부문 실적 견조."
답 3: "매출 2조. 원인은 확인되지 않음."
답 4: "매출 2조. 반도체 사업 호조."
답 5: "매출 2조 원 발표."

일관 진술: "매출 2조"                     ← 5회 모두 등장
불일치:   "반도체 호조" 관련 진술          ← 4회 등장하지만 표현 다름
                                          → 컨텍스트에 없어서 못 씀
                                          → 최종 답에서 제외

Self-consistency는 특히 답에 등장하는 숫자가 매번 달라지는 경우 효과적이다. 매출이 어떤 답에서는 2조, 어떤 답에서는 1.98조로 나온다면 그 자체가 신호 — 컨텍스트에서 숫자를 확실히 뽑지 못한다는 뜻이다.


실측: halluc 3 → 0

프로젝트에서 위 세 패턴 중 citation-aware prompting을 먼저 도입했다. CoVe와 self-consistency는 비용 이유로 아직 트리거 기반으로만 쓴다.

같은 evaluation set 15종목 기준 실측:

                  도입 前     도입 後
faithfulness      0.919       0.942
hallucination     3건         0건
답 평균 길이      312자       267자

환각 3건이 0건이 됐다. 셋 다 컨텍스트에 없는 인과 진술 ("~때문에", "~로 인해")이었다. 인용 마커를 강제하니까 이런 진술이 자연스레 빠졌다.

답 평균 길이가 짧아진 것도 부수 효과다. LLM이 근거 없는 문장을 못 붙이니까 답이 담백해졌다. Verbosity bias(rag-eval/02) 관점에서도 유리한 방향이다.


프롬프트 실제 스니펫

프로젝트에서 쓰는 citation-required 프롬프트의 핵심 부분만 요약.

너는 뉴스 컨텍스트를 근거로 종목 이벤트를 요약하는 분석가다.

컨텍스트는 [1] [2] ... 형식으로 번호가 붙어 있다.
답의 규칙은 다음과 같다.

1. 답의 모든 문장은 마지막에 [n] 인용 마커를 붙여야 한다.
2. 여러 컨텍스트를 참조한 문장은 [1,3]처럼 나열한다.
3. 컨텍스트에 없는 사실(인과, 예측, 비교)은 답에 포함하지 않는다.
   포함하려면 "확인되지 않음"을 명시한다.
4. 정도 부사(소폭·크게·급격히)를 쓰려면 컨텍스트에 그 표현이
   있어야 한다.
5. 답의 마지막에 사용한 컨텍스트 번호 목록을 "used: [n, m]" 형식으로
   출력한다.

4)rag-eval/03에서 사례로 나왔던 "소폭 개선" 케이스의 대응이다. cross-model judge가 잡아낸 케이스가 프롬프트 조항을 만드는 실제 근거가 됐다.


시리즈 마무리

두 편으로 RAG 품질 개선의 두 축을 정리했다.

01: 상류 데이터 클리닝 (source denoising)
02: 생성 프롬프트 (grounded generation)

두 편의 조합이 프로젝트에서 실측한 결과다.

faithfulness       0.919 (baseline)
   → 0.937 (상류 컷)
   → 0.942 (인용 강제)

hallucination      3건 → 1건 (상류 컷) → 0건 (인용 강제)

두 축이 서로 다른 곳을 담당한다. 상류 컷은 "컨텍스트를 깨끗하게 만든다", 인용 강제는 "그 컨텍스트만 쓰게 만든다". 둘 다 필요하다.

이 시리즈 이후 남은 개선 축은 retriever fine-tune이다. 이건 rag-retriever/04 에서 이어서 다룬다.