모든 이야기

Self-RAG: 검색 결과가 있다는 것과 답에 근거가 있다는 것은 다르다

문서에 근거한 답변이라고 해서 문서가 그 답을 실제로 뒷받침하는 것은 아니다. 검색 결과의 링크가 붙어 있고 문장도 매끄럽지만, 출처를 열어 보면 핵심 주장과 연결되지 않는 경우가 있다. Self-RAG가 다루는 문제는 이 간극이다. 무엇을 검색할지뿐 아니라 검색이 필요한지, 가져온 문서가 관련 있는지, 생성한 문장이 그 문서로 지지되는지를 구분해 모델이 학습하도록 한다.

언제나 검색하는 도우미의 불편함

검색 증강 생성은 외부 문서를 입력에 추가하는 방식이다. 내부 지식만으로 답하는 모델보다 최신 정보나 드문 사실을 다루는 데 도움을 줄 수 있다. 하지만 모든 요청이 검색을 필요로 하지는 않는다. 문장의 표현을 다듬는 요청에 문서를 여러 개 붙이면 비용만 늘거나 불필요한 내용이 끼어들 수 있다.

Self-RAG는 생성 도중 필요한 시점에 검색을 선택하게 한다. 응답을 문장 같은 구간으로 나누어 만들면서, 다음 구간에 검색이 유용한지 특별한 토큰으로 표시한다. 검색을 건너뛰고 일반적인 생성으로 이어갈 수도 있고, 필요한 순간 외부 검색기를 호출할 수도 있다. Self-RAG 원문

내가 만든 예를 들면 '다음 문장을 자연스럽게 고쳐 줘'는 외부 지식을 거의 요구하지 않는다. 반면 '이 라이브러리의 특정 버전에서 어떤 옵션이 추가됐나'는 문서를 찾아야 할 이유가 강하다. 같은 모델이 두 요청을 받아도 검색 정책은 달라질 수 있다. 무엇이 필요한지를 분류하는 단계가 검색의 앞에 생기는 것이다.

이름에 Self가 들어 있지만 검색기까지 모델 내부에 사라지는 것은 아니다. 실제 문서 인덱스와 검색 모듈이 필요하다. 모델은 검색 여부와 결과의 활용을 학습하고, 외부 시스템은 실제 문단을 찾아 준다. 없는 문서가 자기 평가만으로 생기지는 않는다.

'관련 있다'와 '지지한다'를 분리하기

원문의 reflection token은 여러 질문을 나눈다. Retrieve는 검색 필요 여부, IsRel은 문서의 관련성, IsSup은 생성 내용이 문서로 뒷받침되는 정도, IsUse는 응답의 유용성을 평가한다. 지원 정도에는 완전한 지지, 부분 지지, 지지 없음과 같은 선택지가 있다.

이 분리가 좋은 이유는 두 평가가 쉽게 혼동되기 때문이다. 예를 들어 문서에는 '설정 A는 속도를 높일 수 있다'고 적혀 있는데 모델이 'A는 메모리도 줄이고 모든 환경에서 두 배 빠르다'고 답했다고 하자. 문서는 주제에 관련되지만, 추가된 두 주장은 지지하지 않는다. 검색 점수가 높다는 사실만으로 문장 수준의 근거가 충분하다고 판단할 수 없다.

또한 근거가 있는 문장도 질문에는 도움이 안 될 수 있다. 사용자가 설치 방법을 물었는데 정확한 개발 연혁을 길게 설명하면 사실성은 높아도 유용성이 낮다. 평가 항목을 분리하면 정확히 무엇이 부족한지 더 잘 드러난다. 공식 프로젝트의 토큰 설명

나는 이 구조를 RAG 시스템의 목표를 더 세밀하게 표현하는 방법으로 읽는다. '좋은 답' 하나의 점수로 압축하기 전에 관련성, 지지, 유용성을 따로 보게 만든다. 이들이 항상 같은 방향으로 움직이지 않는다는 사실이 중요하다. 엄격하게 근거를 요구하면 답이 짧아지거나 일부 내용을 생략할 수 있고, 풍부한 답을 허용하면 근거 없는 확장이 들어갈 여지도 생긴다.

자기 평가를 어떻게 배웠는가

모델에게 확인하라고 말하는 것만으로 이 기능이 생기는 것은 아니다. 원문은 먼저 GPT-4로 평가 토큰의 지도 데이터를 만들고, 그 신호를 critic 모델에 학습시킨다. critic은 더 큰 학습 데이터에 문서와 평가 토큰을 붙인다. generator는 이 보강된 데이터에서 자연어 답변과 특별한 토큰을 함께 예측하도록 학습한다.

학습이 끝난 뒤 추론에서는 generator가 자신의 평가 토큰도 생성한다. 매번 별도의 critic을 호출해야만 평가할 수 있는 구성으로 설명해서는 안 된다. critic은 학습 자료를 만드는 역할을 하고, generator는 답과 평가 형식을 함께 배운다. 원문 학습 절차

이때 '스스로 평가한다'는 표현을 외부 검증과 같다고 받아들이면 곤란하다. 평가 토큰도 결국 모델의 예측이다. 학습 때 사용한 평가 데이터의 오류나 편향을 배울 수 있고, 낯선 문서와 질문에서 판단이 빗나갈 수 있다. 문장이 문서로 지지된다는 판정 역시 현실의 참임을 증명하지 않는다. 문서 자체가 틀릴 가능성이 남기 때문이다.

그래도 이런 예측을 학습 대상에 포함한다는 선택은 의미가 있다. 최종 문장만 학습하는 모델보다, 어떤 문서를 사용했고 어떤 근거 판단을 하도록 훈련됐는지 명시적인 접점을 제공한다. 그 접점의 신뢰도를 다시 측정할 수 있다.

답변 후보를 고르는 데도 평가를 쓴다

검색 후 여러 문단이 들어오면, Self-RAG는 문단별로 이어질 응답 구간과 평가를 만들 수 있다. 추론 과정에서는 생성 점수와 바람직한 평가 토큰의 확률을 이용해 후보를 순위화한다. 원문은 구간 단위의 beam search로 여러 이어 쓰기 후보를 유지하는 방식을 설명한다.

이 덕분에 '어떤 평가를 더 중시할 것인가'를 추론 때 조정할 수 있다. 근거 지지에 더 무게를 주거나, 검색을 실행하는 기준을 바꾸는 식이다. 모델을 다시 학습하지 않고도 응답의 성격을 일부 조절할 수 있는 것이 논문의 중요한 지점이다. 프로젝트의 추론 제어 설명

하지만 토큰의 확률을 사용한다고 해서 그것이 그대로 잘 보정된 실제 정확도 확률이 되는 것은 아니다. IsSup을 자신 있게 생성한 후보가 진짜로 더 잘 지지되는지 별도 평가가 필요하다. 내가 적용한다면 사람이 확인한 문서와 문장 쌍에서 토큰 판단이 얼마나 맞는지 먼저 보겠다.

후보를 여러 개 만드는 데는 시간과 계산이 든다. 검색을 줄여 절약한 비용과 후보를 늘려 지출한 비용을 함께 재야 한다. 모든 요청을 깊게 검토하는 설정보다 질문의 중요도나 길이에 맞춘 정책이 유용할 수 있다. 이는 논문의 제어 가능성을 제품 요구에 옮긴 내 해석이다.

평가표에서 인용까지 읽기

원문은 7B와 13B 모델로 질문 답변, 사실 검증, 긴 답변 등의 평가를 수행한다. 당시 비교 모델과 RAG 구성에 대해 여러 과제의 개선을 보고하고, 긴 생성에서는 사실성과 인용 정확도를 따로 살핀다. 이 결과를 현재의 모든 챗봇보다 더 낫다는 주장으로 바꾸면 실험의 범위를 벗어난다. 논문 결과

내가 특히 보고 싶은 지표는 인용이 얼마나 붙었는지보다 인용한 문서가 문장을 실제로 지지하는 비율이다. 답변의 핵심 주장 가운데 근거가 붙은 비율도 함께 보면 좋다. 근거 없는 내용을 전부 빼면 정확한 인용만 남길 수 있지만, 질문에 필요한 내용까지 빠질 수 있기 때문이다. 정확성과 충분한 설명을 함께 평가해야 한다.

작은 실험으로 관련 있지만 지지하지 않는 문서를 일부러 넣어 볼 수 있다. 다른 버전의 옵션 설명, 다른 제품의 비슷한 기능, 조건이 빠진 성능 수치가 좋은 테스트다. 검색기가 가져오기 쉬운 자료를 모델이 무조건 믿는지, 주장 범위를 줄이는지, 추가 검색을 하는지 확인한다. 실제 업무에서 흔히 만나는 애매함을 평가에 넣는 것이다.

Self-RAG를 읽고 나면 검색을 답변 앞에 한 번 붙이는 기능으로만 보기 어렵다. 검색과 생성 사이에 판단해야 할 질문이 여럿 있다. 지금 자료가 필요한가, 이 자료가 맞는가, 내 문장이 여기서 나오나. 이 질문들을 따로 학습하고 제어하는 것이 근거 있는 답변의 설계를 더 구체적으로 만든다.

읽은 논문: Akari Asai 외, Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection, 사전 공개 2023, ICLR 2024. 논문 · 공식 프로젝트 · 코드

Dne Cna

컴퓨터공학 잘 하고 싶다

블로그 보기
Self-RAG: 검색 결과가 있다는 것과 답에 근거가 있다는 것은 다르다 · ariser