Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection (link)
기존의 RAG :
LLM의 입력을 관련된 검색된 구문으로 보강하여 지식 집약적인 작업에서 오류를 줄임.
but, 이 방법은 LLM의 다재다능성을 저해하거나, 불필요하거나 주제와 관련 없는 구문을 도입하여 저품질 생성을 초래할 수 있음
→ 사실적 근거가 도움이 되는지 여부와 관계없이 무차별적으로 구문을 검색하기 때문,
→ 출력은 검색된 관련 구문과 일관성을 보장하지도 않음 (모델이 제공된 구문에서 사실을 활용하고 따르도록 명시적으로 훈련되지 않았기 때문)
- RAG(Retrieval Augmented Generation)는 관련된 지식을 검색해 언어모델에 제공함으로써 파라미터 지식의 한계를 보완
- 하지만 관련이 없는 문서가 LLM의 인풋에 포함될 경우 생성된 응답의 품질이 떨어짐
SELF-RAG :
LLM의 생성 품질, 사실 정확성을 개선함
→ LLM의 다재다능성을 해치지 않으며 on-demand retrieve와 self-reflection 을 통해 이루어짐.
임의의 LM을 end to end 방식으로 훈련하여 주어진 작업 입력에 대해 자신의 생성과정을 reflection하도록 학습시킨다.
이과정에서 작업 출력과 간헐적인 특수토큰(reflection tokens)을 생성한다.
reflection token은 검색 필요성과 생성 품질을 각각나타내기 위해 retrieval 및 critique토큰으로 분류된다.
(1단계) 입력 프롬프트와 이전 생성을 고려할때, Self-RAG는 검색된 구문으로 계속 생성하여 보강하는 것이 도움이 되는지 아닌지를 결정함 -> 검색모델을 On-demand로 호출하는 검색 토큰을 출력함
(2단계) Self-RAG는 여러 검색된 구문을 동시에 처리하여 그 관련성을 평가하고 해당 작업 출력을 생성함
(3단계) 자신의 출력을 비판하고 사실성과 전반적인 품질 측면에서 최상의 것을 선택하기 위해 비판 토큰을 생성한다.
→ **이과정은 기존 RAG와 다름 : 생성에 필요한 문서 수와 관계없이 고정된 수의 문서를 검색하며 생성 품질을 두번째로
검토하지 않음. 또한, 각 세그먼트에 대해 출력이 본문에 의해 지원되는지에 대한 self-reflection와 함께 인용을 제공함.
(사실검증을 더 쉽게함)
(SELF-RAG) Self-Reflective Retrieval-Augmented Generation
- 검색 (retrieval)과 자기반성(self-reflection)을 통해 언어모델 응답의 품질과 사실성을 개선하고자 하는 프레임워크
- 언어모델이 task에 관련한 응답과 더불어 간헐적으로 특별한 토큰(=reflection token)을 생성하도록 학습
- reflection token은 retrieval(검색)과 critique(비판) 토큰으로 분류
SELF-RAG 추론 순서
- 1단계) 언제든지 (on-demand) 검색 → 검색 결과를 쓸 것인지 결정
- input과 이전의 생성(= model 응답)이 주어지면, 검색이 필요할지 여부를 결정
- retrieval 토큰이 생성된다면 검색 모델을 호출
- 2단계) 병렬 평가 및 생성 →Top-K 결과에 대해서 문맥에 대한 Relevance(관련성) 평가 진행
- 검색된 여러개의 문단들에 대해 동시에 처리 진행
- 여기서 처리란, 문단의 연관성을 평가하고 task output (=응답)을 생성함을 의미
- 3단계) output 평가 및 선택 → 대답을 generation하고 응답 중 가장 좋은 것 선택
- critique 토큰을 사용해 output을 평가하고 가장 좋은 응답을 선택
Critique모델 및 generation 모델 학습
- Critique 모델
- GPT-4를 활용해 reflection 토큰을 생성하게 하고, 해당 데이터셋을 학습에 활용
- Llama2-7B모델을 기반으로 추가 학습 진행
- maximizing likelihood (Conditional language modeling objective) 활용
- Critique 모델을 활용해 위의 Retrieve, IsRel, IsSup, IsUse reflection 토큰을 생성
- Generator 모델
- reflection 토큰을 추가한 코퍼스를 활용해 학습
- task output과 동시에 reflection 토큰을 예측하도록 학습
- next token prediction objective 활용
Inference
- generation을 이어가면서 모델은 'retrieve' 토큰을 예측
- 검색 필요 X → 다음 output segment로 이어서 예측
- 검색 필요 O → 검색을 하는 단계로 이루어짐
- 검색이 되면 모델은 'Critique' 토큰 예측
- 검색 passage 관련성 판단
- 그 후에 Critie 판단 진행
Training
- RLHF와 비슷하게 align을 하는 작업을 하는데 reward 모델이 아닌 'reflection' token을 통해서 align→ 훨씬 더 cost가 저렴
- Generation 모델 M을 검색결과와 Critic model C가 예측한 reflection token 가지고 훈련
- 이때, model M이 inference 시에는 critic model C에 의존하지 않고 스스로 생성할 수 있도록 훈련
- C를 훈련할떄는 ChatGPT를 통해서 데이터 생성 M을 훈련할 때는 C모델을 가지고 데이터 생성
- 검색을 할지 말지, passage가 관련이 있는지 없는 지 등
Experiment
- 바로 RAG 사용하는 기본 baseline에 비해 성능이 좋음
- ChatGPT(훨씬 더 큰 파라메터)랑 유사한 성능을 보임
- 태스크 및 데이터셋
- PubHealth: 사실 검증
- ARC-Challenge: 다지선다 추론
- Pop-QA: 짧은 문장 생성
- TriviaQA-unfiltered: 짧은 문장 생성
- ALCE-ASQA: 긴 문장 생성
- 평가지표
- 정확성 (PubHealth, ARC-Challenge)
- 정답이 문장에 포함되어 있는지 여부 (Pop-QA, TriviaQA-unfiltered)
- FactScore, MAUVE에 기반한 correctness (str-em) / fluency, citation precision and recall (ALCE-ASQA)
Self-RAG 논문 정리 및 Langchain 구현 코드
Advanced RAG 테크닉: Self-RAG 논문 정리 및 Langchain 구현 코드 일부 설명
velog.io