LLM 인용 검증은 자동 생성 문서에 달린 인용을 하나씩 열어, 그 출처만 읽어도 문장의 내용이 확인되는지를 자연어 추론(NLI) 모델로 판정하는 작업이다. 위키 문서의 조직성을 크게 끌어올린 STORM도 이 항목의 점수만은 오르지 않았다. ALCE 벤치마크의 표준 프롬프트 조건에서는, 인용이 달린 문장의 절반 정도만 그 인용으로 확인된다.
편집자 열 명이 매긴 STORM 평가표 — 검증가능성만 그대로였다

자동 생성된 보고서를 읽다 보면 각주를 하나씩 눌러 보게 된다. 링크는 잘 열리는데, 그 문서에 정말 그 말이 적혀 있는지는 또 다른 문제다. 인용이 붙어 있다는 것과 그 인용이 문장을 확인해 준다는 것은 다른 말이다.
이 차이를 사람 손으로 직접 재 본 연구가 있다. LLM이 주제어 하나만 받아 끝까지 쓴 위키 문서를 위키피디아 편집자 열 명이 채점했다. 평가 대상은 스탠퍼드의 STORM이고, 비교 대상은 아웃라인을 먼저 세우는 검색 증강 생성 방식(oRAG)이다. 문서 20쌍을 준비해 한 쌍을 두 명이 나눠 읽었다.
채점 방식은 단순하다. 다섯 축을 각각 1~7점으로 매기고, 4점 이상을 준 평가를 ‘양호’로 셌다. 아래 표가 그 결과다.
| 평가 항목 | oRAG 평균 | STORM 평균 | oRAG 양호 | STORM 양호 | p |
|---|---|---|---|---|---|
| 흥미도 (Interest) | 3.63 | 4.03 | 57.5% | 70.0% | 0.077 |
| 조직성 (Organization) | 3.25 | 4.00 | 45.0% | 70.0% | 0.005 |
| 관련성 (Relevance) | 3.93 | 4.15 | 62.5% | 65.0% | 0.347 |
| 범위 (Coverage) | 3.58 | 4.00 | 57.5% | 67.5% | 0.084 |
| 검증가능성 (Verifiability) | 3.85 | 3.80 | 67.5% | 67.5% | 0.843 |
표를 위에서 아래로 훑으면 STORM이 이긴 표처럼 보인다. 조직성은 양호 비율이 45.0%에서 70.0%로 뛰었다. p값도 0.005로 작다. 쌍별 선호를 따로 물은 결과도 같은 방향을 가리킨다. 판정 40건(20쌍×평가자 2명) 중 STORM이 26건, oRAG가 14건을 가져갔다.
문제는 맨 아래 줄이다. 검증가능성은 문장에 달린 인용이 그 문장을 확인해 주는지 보는 항목이다. 이 축은 평균이 3.85에서 3.80으로 오히려 조금 내려갔다. 양호 비율은 67.5%에서 67.5%로, 소수점까지 같다. p값은 0.843이다.
STORM은 글을 쓰기 전 단계를 대화 시뮬레이션으로 바꾼 시스템이다. 그런 장치를 얹고도 검증가능성 한 줄만은 움직이지 않았다. 이 글에서는 그 줄을 재는 방법을 확인한다. 인용이 붙어 있다는 것과 그 문장이 그 출처만으로 확인된다는 것은 서로 다른 말이다.
둘을 가르는 기준을 세운 벤치마크가 무엇인지 먼저 본다. 그 기준으로 잰 지금의 성적표가 어떤 값인지도 이어서 확인한다. 다만 그 전에, 이 표에서 평가된 STORM이 사전조사 단계에서 무엇을 했는지 짧게 짚는다.
STORM이 한 일 — 사전조사를 대화로 만들었다
STORM이 개선한 것은 본문이 아니라 그 앞의 사전조사(pre-writing) 단계다. 사전조사는 무엇을 쓸지 정하기 전에 무엇을 물어야 할지를 정하는 작업이다. 주제어 하나만 받아 위키급 장문을 쓸 때는 이 앞단이 크게 작용한다. 쓸 거리를 충분히 모으지 못하면 문장을 아무리 다듬어도 채울 내용이 없다.
사전조사는 세 동작으로 이뤄진다. 첫째, 비슷한 주제의 기존 위키 문서 목차를 훑어 서로 다른 관점(perspective)을 여럿 찾는다. 둘째, 관점마다 ‘작가 페르소나’를 세워 질문을 던지게 하고, 검색으로 근거를 확보한 ‘전문가 페르소나’가 답하게 한다. 셋째, 시뮬레이션한 대화의 질문·답 로그를 아웃라인으로 정리한다. 본문은 맨 마지막에 쓴다. 그 아웃라인을 따라가며 인용을 달아 쓰는 순서다.
자동 지표도 이 순서를 가리킨다. 셋 모두 사람이 쓴 참조 위키 문서와의 겹침을 재는 값이다. FreshWiki 평가에서 ROUGE-1은 44.26(oRAG)에서 45.82로 올랐다. 엔티티 재현율은 12.57에서 14.10으로 올라갔다. 셋 가운데 가장 크게 움직인 것은 헤딩 소프트 재현율로, 73.59에서 86.26이 됐다. 앞의 둘은 생성한 본문에서 재고, 헤딩 소프트 재현율은 아웃라인 단계의 목차를 참조 문서의 헤딩과 견주어 잰다.
어느 단계가 이 상승을 만들었는지도 확인할 수 있다. 아웃라인 조직 단계만 빼고 다시 돌리면 ROUGE-1이 26.77까지 내려간다. 점수를 끌어올린 것은 더 나은 문장이 아니라 앞단의 조사와 조직이었다.
파이프라인 자체는 자매편 LLM 위키 — AI가 쓰고 가꾸는 지식층은 실제로 어떻게 작동하는가에서 단계별로 확인했으니 여기서는 이 정도로 둔다. 이 글이 다루는 것은 파이프라인이 아니라 평가다. 그러니 앞의 표로 돌아가, 이번에는 축을 p값 순으로 다시 세워 본다.
조직성만 통계적으로 유의하게 올랐다 — 다섯 축을 p값 순으로 다시 세우기
다섯 축을 p값이 작은 순으로 늘어놓기 전에, 그 p값이 무엇인지부터 짚는다. p값은 두 방식 사이에 실제로는 차이가 없다고 가정했을 때, 관찰된 것만큼 크거나 더 큰 차이가 우연히 나올 확률이다. 값이 작을수록 그 차이를 우연으로 설명하기 어렵다. 어디까지를 작다고 볼지는 관행을 따라 0.05로 둔다.
그 문턱 아래로 내려간 항목은 조직성 하나뿐이다(p=0.005). 흥미도 0.077과 범위 0.084는 문턱 근처에서 멈췄고, 관련성은 0.347이다. 검증가능성의 0.843은 다섯 축 가운데 문턱에서 가장 멀다. 두 방식의 검증가능성 차이는 우연으로 설명해도 무리가 없다는 뜻이다.
양호 비율의 절대 변화로 세워도 순서는 비슷하다. 조직성이 +25%p로 가장 크다. 흥미도 +12.5%p, 범위 +10%p, 관련성 +2.5%p가 뒤를 잇는다. 검증가능성은 0%p다. 이 다섯 값을 막대 길이로 옮긴 것이 아래 그래프다.
그림 1에서 조직성 막대만 길게 뻗고, 검증가능성 자리에는 막대가 아예 없다. 이 대비가 STORM 평가의 요지다. 관점을 여럿 불러 아웃라인을 짜는 장치는 문서를 잘 조직해 준다. 그러나 문장에 달린 인용이 그 문장을 실제로 확인해 주는지에는 손을 대지 않는다. 조직과 인용 신뢰성은 한 표에 나란히 놓여 있어도 서로 다른 축에서 움직인다.
여기서 우리가 조심할 것이 하나 있다. 같은 표 안에 척도가 두 종류 섞여 있다는 점이다. STORM 초록에 적힌 "+25%"가 어느 척도의 값인지부터 짚어야 한다.
표에는 평균 점수(1~7)와 4점 이상을 준 평가의 비율, 즉 양호 비율이 함께 있다. "+25%"는 평균이 25% 올랐다는 뜻이 아니다. 조직성 양호 비율이 45.0%에서 70.0%로 절대 25%p 움직였다는 뜻이다. 같은 항목의 평균은 3.25에서 4.00으로 0.75점 올랐다. 두 숫자는 같은 변화를 다른 척도로 잰 것이니, 어느 쪽인지 확인하지 않고 크기만 견주면 어긋난다.
이 표로 할 수 있는 말은 여기까지다. 조직은 좋아졌고, 검증가능성은 그대로다. 움직이지 않은 그 축을 더 들여다보려면 사람이 매긴 인상 점수와는 다른 잣대가 필요하다. 그 잣대를 세운 벤치마크를 다음 절에서 본다.
ALCE는 인용 품질을 링크 존재가 아니라 함의(entailment)로 다시 정의했다
그러면 인용의 신뢰성은 무엇으로 재는가. 프린스턴 연구팀이 만든 ALCE 벤치마크가 그 잣대를 세웠다. ALCE는 인용 품질을 "출처 링크가 붙어 있는가"로 재지 않는다. 대신 "그 출처가 문장을 함의(entailment)하는가"로 다시 정의했다.
함의는 자연어 추론(NLI)에서 쓰는 말이다. 글 두 조각을 앞뒤로 놓고 관계를 따진다. 앞의 글이 참이면 뒤의 문장도 참이라고 말할 수 있을 때, 그 관계를 함의라고 한다. 앞의 글만으로는 뒤 문장의 참·거짓을 알 수 없으면 중립이다. 앞의 글이 뒤 문장과 어긋나면 모순이다. 인용 검증에 옮겨 놓으면 앞의 글이 인용된 출처 구절이고, 뒤의 문장이 자동 생성 문서의 문장이다.
판정 경로는 단순하다. 문장 하나와 그 문장에 달린 인용 구절(passage)을 쌍으로 묶어 NLI 모델에 넣는다. 모델이 함의라고 답하면 그 인용은 문장을 확인해 준 것이다. 중립이나 모순이라고 답하면 확인해 주지 못한 것이다. 이 판정을 사람이 아니라 모델이 자동으로 한다. 그래서 사람 평가와 달리 같은 기준을 기계적으로 반복할 수 있다.
그림 2의 두 갈래를 무엇을 단위로 세느냐에 따라 지표가 둘로 갈린다. 하나는 *인용 재현율(citation recall)*이고, 다른 하나는 *인용 정밀도(citation precision)*다. 이름은 비슷하지만 세는 대상이 다르니 한 번에 하나씩 본다.
인용 재현율은 문장을 분모로 센다. 한 문장에 달린 인용을 모두 합쳤을 때 그 문장이 함의되면, 그 문장은 확인된 것으로 센다. 이렇게 확인된 문장 수를 전체 문장 수로 나눈 값이 인용 재현율이다. 문서의 문장 가운데 몇 개나 근거를 갖췄는지를 보는 값인 셈이다.
인용 정밀도는 인용을 분모로 센다. 문서에 달린 인용을 하나씩 떼어 보면서, 그 인용이 문장을 확인하는 데 실제로 기여했는지를 따진다. 기여한 인용 수를 전체 인용 수로 나눈 값이 인용 정밀도다. 정의상 관련 없는 출처를 덧붙일수록 이 값은 내려간다.
분모가 문장과 인용으로 갈리기 때문에 두 값은 따로 움직인다. 한쪽이 높다고 다른 쪽이 따라 오르지 않는다. 한 문장에 관련 없는 출처를 여러 개 덧붙이는 경우를 떠올려 보자. 그 문장은 여전히 확인되니 재현율은 그대로인데, 기여하지 못한 인용만 늘어 정밀도는 내려간다. 이 어긋남은 뒤에 나올 토이 예시에서 직접 세어 본다.
ALCE가 ELI5로 잰 성적표를 보자. ELI5는 "왜 그런가"를 길게 풀어 설명해야 하는 장문 질의응답 과제다. 답이 한 문장으로 끝나지 않고 여러 근거에 걸쳐 있어 인용 판정이 특히 까다롭다.
그림 3의 선을 왼쪽부터 따라가 보자. LLaMA-13B에 passage 3개를 준 조건은 인용 재현율 3.1에 그친다. LLaMA-2-Chat-70B(5-psg)가 38.3, GPT-4(5-psg)가 44.0이다. GPT-4에 passage를 20개까지 준 조건은 48.5다. 이 선에서 가장 높은 지점은 표준 프롬프트를 쓴 ChatGPT VANILLA(5-psg)의 51.1이다.
이 선에서 가장 높은 값인 51.1은, 인용이 달린 문장 둘 중 하나만 그 출처로 확인된다는 뜻이다. 나머지 절반은 각주가 붙어 있어도 그 출처만 읽어서는 문장의 내용이 확인되지 않는다. 모델을 키워도 이 선은 잘 넘어가지 않는다.
정밀도 쪽도 비슷한 자리에 머문다. ChatGPT VANILLA가 50.0, GPT-4(5-psg)가 50.1, GPT-4(20-psg)가 53.4다. 근거 문서를 20개까지 늘려 줘도 절반 문턱을 조금 넘기는 수준이다.
여기서 자동 판정 자체를 한 번 의심해 볼 만하다. ALCE는 사람 평가용으로 따로 뽑은 하위 표본을 사람에게도 판정하게 해 맞춰 봤다. 이 대조에 쓴 숫자는 전체가 아니라 그 하위 표본에서 잰 값이다. 앞서 본 51.1·50.0과 그대로 견주면 안 된다.
ChatGPT VANILLA 조건에서 사람은 재현율 50.8·정밀도 52.4를 매겼다. 같은 하위 표본 위에서 자동 판정은 52.8·50.4를 냈다. 두 판정이 크게 어긋나지는 않는다. 얼마나 일치했는지도 논문이 함께 보고한다.
과제 성격을 바꾸면 숫자가 달라진다. 같은 ChatGPT를 짧은 사실 질의 과제인 ASQA에 돌리면 인용 재현율 73.6·정밀도 72.5가 나온다. ELI5에서 50 안팎에 머문 것과 20점 넘게 벌어진다. 설명이 길고 여러 겹으로 얽힐수록 인용 하나가 문장 전체를 함의하기 어렵다. 그런데 자동 생성 문서의 성적표에는 이 축과 나란히 놓이기 쉬운 다른 숫자가 하나 더 있다.
인용 번호가 붙어 있다는 사실만으로 그 문장을 믿지 말 것. ELI5 성적표에서 표준(VANILLA) 프롬프트 조건의 인용 재현율이 51.1이다. 각주가 촘촘한 문서가 더 믿음직해 보이는 것은 개수가 주는 인상일 뿐이고, 인용 개수와 확인 여부는 별개로 움직인다.
Co-STORM 선호도 70%·78%가 잰 것은 근거성이 아니라 전반적 경험이다
STORM을 만든 팀은 후속 작업으로 Co-STORM을 내놓았다. 이 연구에는 자주 인용되는 선호도 숫자가 있다. 숫자를 보기 전에 표본 규모를 먼저 확인하는 편이 좋다. 사용자 20명을 모은 연구이고, 비교 조건별 유효 응답은 각각 10명과 9명이었다. 그 표본에서 검색엔진과 비교한 응답자의 70%, RAG(검색 증강 생성) 챗봇과 비교한 응답자의 78%가 Co-STORM 쪽을 골랐다.
이 숫자가 재는 것은 전반적 경험(overall experience)이다. 정확성도 근거성도 아니다. 축별 평점을 뜯어 보면 격차가 어디서 왔는지 드러난다. 검색엔진과 비교했을 때 뜻밖의 발견(serendipity)이 2.70에서 3.90으로 올라 차이가 가장 컸다(p=0.030). 관련성은 3.90에서 4.00으로 사실상 움직이지 않았다(p=0.758).
사람들이 좋다고 답한 지점은 "몰랐던 것을 알려 준다"였다. "출처가 그 문장을 확인해 준다"는 애초에 물어본 항목이 아니다. 선호도 숫자를 근거성 숫자처럼 옮겨 읽으면 이 구분이 사라진다. 그러면 사용자가 만족했다는 사실이 인용을 믿을 만하다는 증거로 바뀌어 버린다.
같은 착시는 GraphRAG 편에서도 한 번 짚었다. LLM을 심판으로 세워 잰 승률이 사람 평가보다 후했다. "더 좋다"를 재는 열과 "더 맞다"를 재는 열은 다르고, 대개 뒤쪽 열이 비어 있다. 다음 절에서는 그 빈 열에 무엇을 넣어야 하는지, 즉 인용을 실제로 검사하는 절차를 정리한다.
무엇을 재야 문서를 믿을 수 있나 — NLI로 세는 인용 재현율과 정밀도
처방은 앞에서 이미 나왔다. 인용이 달렸는지 세는 대신, 문장과 인용 구절을 쌍으로 묶어 함의 여부를 판정한다. 그 판정 결과에서 인용 재현율과 인용 정밀도를 계산한다. 판정이 불리언 배열로 들어온다고 하면, 두 지표를 세는 코드는 몇 줄로 끝난다. 아래 예시에서는 문장 넷과 거기 달린 인용 일곱 건을 놓고 두 값이 어떻게 갈라지는지 본다.
# 토이 예시 — 문장 4개에 달린 인용의 NLI 함의 판정 결과
# supports_all : 그 문장의 인용을 다 합치면 문장을 함의하는가
# per_citation : 인용 하나하나가 확인에 기여하는가
sentences = [
{"supports_all": True, "per_citation": [True, True]},
{"supports_all": True, "per_citation": [True, False]},
{"supports_all": False, "per_citation": [False]},
{"supports_all": False, "per_citation": [False, False]},
]
hit_sent = sum(s["supports_all"] for s in sentences)
flags = [f for s in sentences for f in s["per_citation"]]
recall = hit_sent / len(sentences)
precision = sum(flags) / len(flags)
print(f"citation recall = {recall:.3f} ({hit_sent}/{len(sentences)} 문장)")
print(f"citation precision = {precision:.3f} ({sum(flags)}/{len(flags)} 인용)")citation recall = 0.500 (2/4 문장)
citation precision = 0.429 (3/7 인용)문장 넷 중 둘만 인용 묶음으로 확인돼 재현율이 0.5다. 그런데 인용 일곱 건 중 셋만 기여해 정밀도는 0.429로 더 낮다. 앞에서 말한 분모 차이가 이렇게 갈라진 두 값으로 나타난다. 토이 값이라 크기 자체엔 의미가 없지만, 분모가 문장과 인용으로 갈린다는 점은 실제 파이프라인에서도 같다. 두 값 중 하나만 보고된 인용 품질 수치를 만나면, 빠진 쪽부터 의심하는 게 안전하다.
판정에 쓸 NLI 모델을 새로 학습시킬 필요는 없다. ALCE가 쓴 것은 TRUE 계열의 T5-11B 모델(t5_xxl_true_nli_mixture)로, 오픈소스로 공개돼 있어 자체 파이프라인에 바로 붙일 수 있다. 문장과 인용 구절을 쌍으로 넣고 함의 여부만 받아 오면, 인용 존재 체크를 인용 확인 체크로 바꾸는 최소 부품이 갖춰진다.
이 두 지표를 갖추면 위험이 어디로 옮겨 갔는지도 함께 보인다. 예전에는 자동 생성 문서의 위험이 문장 하나에 박힌 고립된 사실 오류였다. 지금은 다르다. 문장이 매끄럽고 각주도 빠짐없이 붙어 있는데 주장과 근거의 연결만 헐거운 텍스트가 위험하다. 딥리서치 에이전트의 감사 가능성(auditability)을 다루는 최근 논의도 같은 진단을 내놓는다. 그 논문 초록이 이 진단을 한 문장으로 적어 두었다.
the dominant risk shifts from isolated factual errors to scientifically styled outputs whose claim-evidence links are weak, missing, or misleading.
From Fluent to Verifiable: Claim-Level Auditability for Deep Research Agents, 초록한국어로 옮기면 이런 말이다. 주된 위험이 고립된 사실 오류에서, 과학적인 겉모습을 갖췄지만 주장과 근거의 연결이 약하거나 없거나 오도하는 산출물로 옮겨 간다. 앞에서 정의한 두 지표가 검사하는 것이 바로 그 연결이다.
이제 도입의 표를 다시 읽어 보자. 조직성 45.0%→70.0%가 먼저 눈에 들어온다. 그러나 무엇을 재야 하는지 알려 준 칸은 아무 일도 일어나지 않은 맨 아래 줄이었다. 검증가능성 3.85→3.80, p=0.843이다.
문서를 만들어 내는 일은 이미 싸졌다. 이제 병목은 만드는 쪽이 아니라 확인하는 쪽, 즉 감사(audit)에 있다. 이 확인 작업에는 이미 이름 붙은 지표가 두 개 있다. 문장과 인용 구절을 짝지어 함의를 판정한 다음, 문장을 분모로 세면 인용 재현율이 나오고 인용을 분모로 세면 인용 정밀도가 나온다.
ALCE가 이 짝짓기를 지표로 만든 뒤로 인용 검증은 각주를 세는 일에서 벗어났다. 출처가 문장을 확인해 주는지 열어 보는 일이 그 자리를 대신한다. 그래서 STORM이 쓴 위키 문서와 딥리서치 에이전트가 낸 보고서를 같은 두 값 위에 나란히 놓고 읽는다.
더 읽기
- Shao·Jiang·Khattab·Lam 외 (Stanford), "Assisting in Writing Wikipedia-like Articles From Scratch with Large Language Models" (STORM, NAACL 2024) — https://arxiv.org/abs/2402.14207
- Gao·Yen·Chen 외 (Princeton), "Enabling Large Language Models to Generate Text with Citations" (ALCE, EMNLP 2023) — https://arxiv.org/abs/2305.14627
- Jiang·Shao·Semnani·Lam 외, "Into the Unknown Unknowns: Engaged Human Learning through Participation in Language Model Agent Conversations" (Co-STORM, EMNLP 2024) — https://arxiv.org/abs/2408.15232
- "From Fluent to Verifiable: Claim-Level Auditability for Deep Research Agents" — https://arxiv.org/abs/2602.13855