일반적인 생성형 언어모델의 파이프라인
User가 input을 주면 GPT나 T5 같은 언어모델의 내부를 지나게 된다. 언어 모델은 사전학습된 파라미터 값들과 input값들을 통해 ouput을 만들어낸다.
우리는 이 과정에서 자세히 어떤 일이 일어나는지 알 수 없다. 단지 언어모델의 어딘가에는 학습과정 때 주어진 지식들이 저장되어 있을 거라는 걸 실험적으로 도출할 수 있을 뿐이다. 이걸 파라메트릭 메모리(Parametric Memory)라고 한다. 파라미터에 저장되어 있기때문에 이런 이름이 붙었다.
모델이 적절하게 학습되었고 또 모델의 capacity가 충분할 경우에는 모델의 첫 번째 질문, '2020년 최저시급이 얼마야?'라는 질문에 첫 번째 예시와 같이 2020년 한국의 최저시급은 8,590원이라고 정확하게 대답할 수 있을 것이다. 위키피디아나 뉴스데이터 등 학습한 데이터의 어딘가에 2020년 최저시급에 대한 정보가 있었고, 2020년과 최저시급이라는 쿼리가 들어오면 이런 대답을 내뱉을 확률이 높아지도록 학습과정에서 파라미터가 조정된 것이다.
하지만 이런 모델은 굉장히 비싸다. 학습하는데 들어간 리소스의 단위도 굉장히 크다.
RAG 파이프라인
RAG는 기존 언어모델의 프로세스에서 두 가지가 추가되었다고 볼 수 있다. Indexing과 Retrieval이다.
기존 언어모델의 생성 프로세스가 언어모델의 내재적 지식, parametric knowledge에만 의존했다면, RAG에서는 외부의 메모리를 사용한다는 점이 가장 큰 차이점이다. 이를 non-parametric memory라고 한다.
먼저 외부에 관련된 지식들을 모아서 사용하기 쉬운 형태로 가공한다. 이를 Indexing 단계라고 한다.
User input이 들어오는 단계는 동일하다. User가 '2024년 최저시급이 얼마야?' 라던지, 'MacOS 최신버전은 뭐야?'라는 식의 쿼리를 줄 수 있다.
Retrieval 단계에서는 이전에 가공해 두었던 외부의 메모리를 보면서 유저의 input과 유사한 것을 골라내서 전달하게 된다. 이렇게 전달받은 지식과 유저 input은 결합돼서 인컨텍스트 러닝의 형식으로 제너레이터에 전해지게 된다.
제너레이터는 결과적으로 더 풍부하고 시의 적절한 지식을 가지고 유저의 쿼리에 대한 답을 생성할 수 있게 된다.
Indexing
인덱싱은 우리가 해결하고자 하는 태스크와 관련된 문서들을 처리하는 첫 번째 단계이다. 이 문서들은 위키피디아 데이터일 수도 있고, Article일수도 있고 회사나 개인이 이미 보유하고 있는 데이터일수도 있다. 우리는 이런 데이터들을 유저의 쿼리를 해결하는데 가져다 쓰고 싶다.
그런데 이런 문서들의 길이는 굉장히 다양하다. 위키피디아 아티클만 봐도 몇 단락 되지 않는 짧은 아티클부터 아주 길어서 섹션이 여러 가지 있는 아티클까지 다양하다. 그리고 필요한 문서가 가장 높은 점수를 받은 문서가 아니라 두 번째나 세 번째로 높은 점수를 받은 문서일 수도 있고, 문제를 해결하기 위해 문서가 하나가 아니라 여러 개가 필요할 수도 있다.
문서를 두, 세 개 가져다가 제너레이션 프로세스에 쓸 생각을 한다면, 각 문서의 길이를 제한하는 것이 중요하다.
이렇게 문서를 더 관리하기 쉬운 단위로 작게 나누는 과정을 Chunking이라고 한다.
이제 문서들이 작은 청크 단위로 분할되었다.
그런데 이때 위에서 RAG의 프로세스를 retrieval 과정에서 유저 쿼리와 유사한 것을 가지고 온다고 했다. 이 과정에서 인베딩 유사도를 활용하고자 할 때는 인덱싱 과정에서 각 청크에 해당하는 임베딩을 미리 만들어 놓는다. 이렇게 해서 인덱싱 과정을 마무리한다.
Retrieval
Retrieval 과정에서 우리의 목표는 인덱싱 과정에서 잘 청킹해 놓은 문서들 사이에서 사용자의 쿼리에 가장 도움이 될 수 있는 문서를 찾아내는 것이다.
가장 흔한 방식은 사용자의 쿼리와 가장 유사한 문서를 찾는 것이다. 이때 BM-25같이 검색에서 전통적으로 사용되어 온 방식을 사용할 수도 있고 언어모델을 이용해 생성된 임베딩의 유사성을 비교하는 식으로 조금 더 현대적인 방법론을 사용할 수도 있다. (아까 인덱싱 과정에서 임베딩을 만든다고 했는데 만약에 BM-25같이 전통적인 방식을 사용할 경우에, 이 과정은 생략된다.)
단순히 가장 유사하거나 제일 많은 단어가 겹치는 문서 하나를 찾아올 수도 있지만 리트리벌 과정에서 정답을 담고 있는 문서를 항상 가장 높은 유사도로 찾을 수 있다는 보장도 없고 문제 자체가 복잡해서 문서가 여러 개 필요할 수도 있다.
만약에 user input이 '2024년 최저시급은 얼마야?'라고 들어왔을 때 이와 가장 유사한 chunk는 위 이미지에서 chunk1과 chunk2가 될 것이다. chunk1은 최저시급이라는 단어는 들어가 있지만 구체적인 금액에 대한 정보는 포함되지 않았다. 필요한 정보를 담고 있는 건 chunk2가 된다.
다른 예로, '구글 CEO의 석사 전공이 뭐야?'라는 쿼리가 들어오면 chunk1로 '썬다 피차이는 인도계 미국인으로서 구글의 최고 경영자이다'라는 내용이 있고, chunk2에는 '썬다 피차이는 스탠퍼드 대학에서 재료과학 및 물리학 석사학위를 받았다'라는 내용이 있다고 가정하자. 이때 유저의 요청을 해결하기 위해서는 둘 중 하나의 chunk만 필요한 게 아니라 chunk1과 chunk2 모두 필요하다.
이런 이유로 retrieval 과정에서는 가장 점수가 높은 한 가지 chunk뿐만 아니라 Top K개의 chunk를 retrieval 하는 전략을 취한다. 이런 전략은 제너레이션 단계에서 리트리벌된 문서를 더욱 효과적으로 활용할 수 있도록 해준다.
Generation 단계에서 리트리벌된 문서를 적극적으로 사용하게 되므로 리트리벌 단계에서 정확한 문서를 전달하는것은 RAG 파이프라인에 있어서 굉장히 중요하다.
Generation
Generation 단계에서는 유저의 쿼리와 리트리벌된 문서를 합쳐서 하나의 프롬프트를 합성하게 된다. 이 프롬프트는 LLM의 input으로 들어가 그에 따른 답변을 생성하게 한다.
리트리벌된 청크가 없이 유저의 쿼리만 주어졌을때는 모델은 파라메트릭 메모리에만 의존해 대답하지만 이렇게 관련된 문서가 함께 주어졌을때는 모델이 파라메트릭 메모리 뿐만 아니라 전달받은 외부의 정보, 논 파라메트릭 메모리도 기반해 대답을 함께 생성할 수 있게 된다.
이렇게 외부정보를 전달받아서 대답을 생성하게 되면 파라메트릭 메모리에만 기반해 대답하는 것보다 훨씬 더 사실에 기반한 대답을 생성할 수 있다.
이 단계는 리트리벌된 문서의 품질, 이 문서들을 어떻게 조합하는지, 그리고 언어모델의 성능에 크게 의존한다. 이 과정은 유저에게 전달되는 마지막 응답을 생성하는 과정인 만큼, 리트리벌과 마찬가지로 RAG 프로세스에서 핵심적인 요소가 된다.
가장 간단한 RAG 모델 그려보기
간단하게 RAG 모델을 그려보자.
Retrieval
Retrieval에서 가장 간단한 접근 방법은 TF-IDF나 BM-25일 것이다. TF-IDF는 Term Frequency Inverse Document Frequency로, 문서에서 단어의 상대적 중요도를 평가하는 데 사용된다.
Term Frequency는 해당 단어가 얼마나 자주 등장하는지를 나타내고, Inverse Document Frequency는 전체 문서 집합에서 그 단어가 얼마나 덜 나타나는지를 측정한다.
단어가 문서 내에서 자주 등장하면 가중치를 주고 다른 문서에서는 드물게 등장할 때 또 가중치를 준다. 예를 들면, 굉장히 자주 사용될법한 '안녕'이라던가 '했습니다' 같은 것에는 가중치를 덜 주고 그 문서에서만 등장할법한 'RAG' 같은 단어에 조금 더 가중치를 주고자 하는 방법론이다.
BM-25는 TF-IDF랑 비슷한 방법론이기는 하지만 문서의 길이와 같은 다른 요소를 조금 더 섬세하게 고려해서 관련성을 측정하는 정교한 알고리즘이라고 생각하면 된다.
Generation
이런 경우에 제너레이션은 사전학습된 언어모델을 추가적인 파인튜닝 없이 그냥 가져다 쓰는 경우를 생각할 수 있다. (가장 간단하게 만드는 방법을 생각하는것니까,,)
물론 ChatGPT4처럼 언어모델 자체의 성능이 좋은 경우에는 파인튜닝 없이도 좋은 성능을 낼 수 있다. 다만 추가적인 학습 없이 좋은 성능을 내려고 하면 모델 자체의 파라미터 크기나 학습 데이터셋이 상당히 클 필요가 있다.
Augmentation
이 모델에서는 별도의 트레이닝이 이루어지지 않기 때문에 리트리벌된 데이터를 활용하는 시점은 실제 인퍼런스가 발생하는 시점이다.
인퍼런스가 발생하는 시점은 사용자의 입력이 들어와 모델이 예측을 수행하는 시점. 즉, 사용자 입력이 들어와 모델이 그 입력에 대한 결과를 산출하는 시점을 말한다.
데이터 소스는 텍스트 데이터이고, 리트리벌은 오직 한 번만 수행된다.
'RAG' 카테고리의 다른 글
Retrieval Strategy and Instruction Tuning (2) | 2024.11.14 |
---|---|
[RAG] RAG와 Fine-Tuning 차이점과 Small Language Models (SLM) (2) | 2024.08.30 |
Bert와 GPT 차이점 (1) | 2024.08.30 |
[RAG] RAG의 기본 개념 및 트랜스포머 어텐션 설명 (1) | 2024.08.19 |
페르소나를 이용한 챗봇 (2) - chat memory 추가 (0) | 2024.08.13 |