ABOUT ME

인공지능(AI), NLP(자연어처리), Data Science 관련 전반적인 내용에 대해 공부한 것들을 올리는 저의 Archive입니다.

Today
Yesterday
Total
  • RAG와 LLM 그리고 임베딩(Embedding) 모델의 동향
    자연어처리(NLP)와 인공지능(AI) 2024. 5. 20. 21:33

    RAG를 통해 LLM을 꽃 피우게하는 조연,

    ‘임베딩 모델’은 어떻게 흘러가고 있을까?

     

    본 글은 [Open-Up] 오픈소스 소프트웨어 통합지원센터로부터 지원받아 작성하였습니다.

     

    기계 학습에서 임베딩이란 무엇인가요?

                                              [출처]  기계 학습에서 임베딩이란 무엇인가요?, AWS

    LLM과 RAG란?

    최근 몇 년 동안, 대형 언어 모델(LLM, Large Language Models)은 인공지능(AI) 분야에서 뜨거운 주제로 부상하고 있다. LLM은 대규모의 텍스트 데이터를 학습하여 인간 수준의 자연어 처리 능력을 보여주었고, 다양한 응용 분야에서 혁신을 일으키고 있다. 이러한 모델들은 텍스트 생성, 기계 번역, 대화형 AI, 감정 분석 등 다양한 작업에서 탁월한 성능을 발휘하고 있어 많은 관심을 받고 있다. 특히, OpenAI의 ChatGPT는 방대한 양의 데이터를 학습하여 자연스러운 문장 생성 능력을 보여주었고, 이는 생성형 AI의 새로운 가능성을 열었으며, 여러 기업은 이 기술을 활용하여 고객 서비스, 콘텐츠 생성, 코드 작성 등 다양한 분야에서 활용하고자 노력하고있다.

     

    그러나 LLM에도 크나큰 약점이 있는데, 바로 답변의 ‘신뢰성’과 ‘최신성’을 만족하기 어렵다는 것이다. 여기서 답변의 ‘신뢰성’은 이미 잘 알려진 환각 또는 할루시네이션 특성에 기인한다. 

     

    RAG란 무엇인가요?

                                                                                  [출처] - RAG란 무엇인가요?, AWS

     

    위처럼 LLM은 잘못된 정보를 사실인듯 답변으로 내놓을 수 있다. 또한 모델이 상시로 학습을 하고 있는 것이 아니라면, 학습했던 정보는 새로운 이벤트가 발생했을 때 최신의 정보가 아니게 된다. 이러한 문제로 LLM으로 각종 서비스를 제공하는 업체들은 모두 제시하는 답변이 사실과 다를 수 있다는 점을 고지하고 있으며, 사용자들은 모델의 knowledge cut-off(특정 시점까지의 데이터를 기준으로 학습된 모델의 지식 한계)를 인지하고 있어야하는 불편함이 존재한다.

    RAG의 등장 

    RAG(Retrieval-Augmented Generation)는 이러한 문제를 해결하기 위한 방법 중 하나로,  생성 모델(LLM)에 정보 검색을 결합하는 방식 또는 프로세스를 말한다. 즉, 생성 모델이 검색된 정보를 참조하여 답변하게 함으로써, 답변의 신뢰성을 올리고 지식의 범위를 확장할 수 있게한다. 

     

    본래 RAG라는 용어는 ‘Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks’라는 paper를 통해 처음 등장하게 되었는데, 정보 검색 모델과 생성 모델을 Fine-tuning하는 방식에 기인하였다. 그러나 현재 RAG라는 용어는 Fine-tuning 방식이 아닌, 추론 과정에서 검색된 정보를 참고하여 답변을 생성하는 방식으로써 주로 쓰이고 있다.  

     

    정리하자면, RAG는 LLM의 환각을 방지하고, LLM이 최신 정보를 활용 할 수 있도록 하는 기법이다. 생성 모델이 정보를 직접 읽어보고 이를 기반으로 답변하게하는 일종의 오픈북 테스트 기법인 셈이다. 그러나 오픈북 시험을 보러 시험장에 갈 때, 도서관에 있는 ‘모든 책’을 ‘책 가방’ 속에 넣고 갈 수 없다.

    예를 들어 LLM에게 “국회 도서관 자료를 모두 읽어보고 답변해줘”라고 한다면 LLM은 그렇게 할 수 없을 것이다. LLM의 읽는 양과 기억에는 한계가 존재하기 때문이다. 물론, LLM의 읽는 양(Context)과 기억 한계를 증가하기 위한 여러 연구와 개선이 진행되고 있지만 긴 Context는 결국 ‘비용’의 문제이기 때문에 효율적인 서비스를 위해서는 RAG가 Default 옵션이 될 수 밖에 없고, 이를 위해 시험장에 들고 갈 ‘핵심 요약 노트’를 작성해주는 행위가 매우 중요해진다.   

     

    그렇다면 RAG에서 핵심 요약 노트는 어떤 방식으로 생성되는 것이며, LLM에게 어떻게 주어지는 것일까?  기본적인 RAG의 수행 흐름은 다음과 같다. 

    기본적인 RAG 수행 흐름
    [그림] 기본적인 RAG 수행 흐름

                                                                         

    1. 문서를 벡터화(임베딩)하여, 벡터 DB에 저장
    2. 사용자가 질문을 입력시, 입력된 질문에 대해 벡터화(임베딩)
    3. 유사도 비교를 통해 벡터화된 질문과 관련이 높은 상위 N개의 항목을 벡터 DB에서 추출하여, LLM에 질문과 함께 제공
    4. LLM의 응답

    먼저 여기서 임베딩(Embedding)이란, 텍스트를 숫자(벡터)로 표현해내는 기술을 말한다.

    벡터는 텍스트의 의미를 보존하며, 유사한 의미를 가진 텍스트는 유사한 벡터로 변환될 수 있어야 한다. 따라서 유사도 비교를 통해 질문과 유사한 내용이 담긴 문서나, 질문의 답변과 유사한 문서를 찾아낼 수 있게 된다. 그리고 이 문서는 질문과 관련된 정보가 포함된 ‘핵심 요약 노트’가 된다.

    이 ‘핵심 요약 노트’를 사용자의 질문과 함께 LLM에게 전달함으로써, LLM이 관련된 사실 정보를 기반으로 질문에 대한 답변을 하게 되는 것이다. 따라서 임베딩의 품질이 핵심 노트의 품질을 좌우하고, 이는 RAG의 품질과도 직결된다고 볼 수 있다. 임베딩을 수행하는 임베딩 모델은 바로 RAG라는 기법 속에서 LLM을 돋보이게 하는 ‘핵심 조연’인 셈이다.

     

    임베딩 기술 동향 

    그렇다면 임베딩 기술은 어떻게 흘러왔으며, 어떤 방향으로 발전되고 있을까?

    임베딩 기술은 크게 빈도 기반 방식과 분산 표현 벡터 방식으로 구분 지을 수 있다.

     

    빈도 기반 방식은 단어의 빈도 정보를 이용하여 벡터를 생성하는 것이다. 대표적으로 TF-IDF(Term Frequency-Inverse Document Frequency)가 있다.

    TF-IDF는 단어의 빈도와 문서별 빈도 가중치를 활용하여 단어의 중요도를 계산하고, 이를 기반으로 벡터를 생성 한다. 이 방법은 다른 문서에는 잘 등장하지 않는 단어가 특정 문서 내에서는 자주 등장 할 경우, 해당 단어의 중요성을 강조하는 특징이 있다. 빈도 기반 방식은 유의어를 구분 하지 못하고 전체 문맥을 이해하지 못한다는 근본적 한계가 있지만, BM25와 같은 알고 리즘은 빠른 계산, 학습이 필요없는 이점, 준수한 성능 등을 이유로 실제 서비스에 많이 활용되고 있다. 

     

    분산 표현 벡터 학습 방식
    [그림] 분산 표현 벡터 학습 방식, 출처: ML Applications, 이창용

                                                                        

    다른 방식인 분산 표현 벡터는 의미적 유사성을 벡터 공간에서 반영하는 게 목적이다. 이 방법은 주로 단어 기반 벡터와 문장 기반 벡터로 구분할 수 있다.

    단어 기반 벡터의 대표적인 예로는 Word2Vec, Glove, FastText가 있는데, 단어의 의미를 더 잘 포착하는데 중점을 둔다. 따라서 단어 간의 유사성을 벡터 공간에서 유의미하게 표현할 수 있다. 단,  동음이의어에 취약하다는 단점이 있다.

    [그림] 분산 표현 벡터 학습 방식’에 표현된 것처럼 모델을 학습할 때 문장에서 Target Word를 예측하도록 하는데, ‘의지’라는 의미를 갖는 명사로서의 Will과 ‘미래’를 나타내는 조동사로서의 Will이 학습 시에 하나의 Will로 여겨질 수 있다. 또한 단어 단위로 학습하므로 문장 전체의 맥락을 벡터에 투영하지 못하는 단점이 있어 문서 임베딩에는 활용되기 어렵다.

     

    다른 방식인 문장 기반 벡터는 문장 전체를 벡터로 표현하는 방법이다. 딥러닝 기반의 RNN, LSTM(Long Short-Term Memory), 시퀀스 투 시퀀스(Seq2Seq) 모델 등이 등장하면서 문장의 순차적 정보를 벡터에 더 잘 캡처할 수 있게 되었다. 특히, Transformer 기반의 BERT와 같은 모델이 등장하면서 문장 기반 벡터의 표현력이 크게 향상되었다.

    BERT는 2018년에 Google에서 개발한 모델로, 트랜스포머 인코더를 적층하고 문장의 양방향 정보를 활용하는 특징이 있다. BERT는 문장의 양방향 정보, 즉 좌우 문맥을 모두 활용하기때문에 보다 풍부한 의미 정보를 내포할 수 있다. 

    Sentence-transformer(SentenceBERT)의 등장

    문장 기반 벡터 방식은 sentence-transformer 방식을 통해 실용성이 크게 개선된다. 기존에는 두 문장 간의 유사도를 판단할 때, 위에서 소개한 BERT를 아래 그림의 Cross-Encoder 방식처럼 활용하였다. '하나의 인코더(BERT) + Classifier' 구조에 유사성을 판단할 2개의 문장을 입력하여, 문장 간의 유사도를 리턴 받는 방식이다. 

    이 방식은 문장 간의 유사도를 계산해주는 것에 초점이 맞춰져있다. 다시 말해 단일 문장이 Encoder에 들어가서 의미를 유지한 적절한 벡터로 변환하는 것이 목표가 아니라, 문장 간의 유사도를 잘 판단하도록 하는 것 자체가 목표다.

    따라서 각 문장을 미리 벡터로 변환해 두고 유사도를 비교하는 것이 아니라, 비교할 두 문장 중 하나라도 변경되면 모델에 다시 입력해야 한다. 이러한 특징때문에 Cross-Encoder 방식이 문장 유사도를 출력하는 품질 자체는 높을 수 있으나, 1000개의 문장에 대해 유사도를 비교 하기 위해서 C(1000, 2) 조합의 수 만큼 계산을 수행해야하는 단점이 있다. 즉, 다수 문장간 비교에서는 많은 계산량으로 인해 실용성이 떨어진다. 

     

    Cross Encoder와 Bi-Encoder
    [그림] Cross Encoder와 Bi-Encoder, 출처: https://hjkim5004.tistory.com/117

     

    반면에, 그림에 나타난 Bi-Encoder 방식에서는 A문장, B문장이 2개의 동일한 Encoder에 각각 들어가게 된다. 따라서 문장들은 각각 임베딩이 되어 벡터로서 표현된다. 위와 같은 구조를 사용하게 되면, 1000개의 문장에 대해 1000번의 Inference만 실행하면 된다. 또한 문장들(A, B문장)을 벡터로 저장해 두었다가, 바로 유사도 비교에 활용할 수 있게 된다.

    Bi-Encoder 방식의 단점은 Cross Encoder 방식보다 유사도 성능이 떨어진다 는 것이었는데, 이러한 부분을 커버하려는 노력 중에 하나가 SentenceBert에서 제시한 학습 방법론이었고, 높은 성능을 보여 현재까지도 Bi-encoder 방식을 중심으로 임베딩 기술이 발전되어 왔다. RAG에서 활용되는 임베딩 방식도 바로 Bi-Encoder이다.

     

     

    문장 기반의 Semi-supervised 학습 방법                           

    모델을 학습하기 위해서는 대량의 labeled 학습 데이터가 필요하다. 그렇지만, 대량의 labeled 학습 데이터 구축에는 비용과 시간의 문제가 발생하므로 보통은 Semi-supervised 학습을 통해 문장의 표현을 잘 이해한 기초 모델을 만들고, 이후에 labeled 데이터로 추가 학습을 진행한다. 여기서 문장의 표현을 잘 이해하기 위한 Semi-supervised 학습 방법은 크게 Self-prediction과 Contrastive learning로 구분할 수 있다. 

    Self-prediction이란, 하나의 data 내에서 한 부분을 통해서 다른 부분을 예측하도록 하는 학습 방법이다. Self-prediction은 다음과 같이 크게 4가지로 구분될 수 있다.                                     

    Self-Prediction
    [그림] Self-Prediction, 출처 : Self-prediction and Contrastive Learning, Weng & Kim

    1. Autoregressive generation : 이전의 behavior를 통해 미래의 behavior를 예측. 주어진 문장에서 다음에 올 단어를 예측하는 방식 등을 취한다. (ex. GPT의 자기회귀 예측)
    2. Masked prediction : 정보의 일부를 마스킹하고, 마스킹되지 않은 부분을 통해 마스킹 된 영역을 예측한다. (ex. BERT의 MLM)
    3. Innate relationship prediction : 오리지날 데이터에 변형을 가하고, 그 변형된 정보가 무엇인지 예측하는 방식. 주로 이미지에서 많이 활용된다. (ex. equivariant-SSL)
    4. Hybrid self-prediction : 위의 3가지 방식을 혼합하여 활용하는 방식. (ex. DALL-E)

    다른 방법인 Contrastive learning은 embedding space에서 유사한(positive) sample끼리는 거리가 가깝도록 하고, 유사하지 않은(negative) sample들끼리는 서로 거리를 멀게 하는 것이 목적이다. 즉, 모델이 sample들 사이의 관계 또는 거리를 파악하도록 하는 것이다.                         

    Contrative learning
    [그림] Contrative learning, 출처 : Self-prediction and Contrastive Learning, Weng & Kim

     

    많은 학습 방법론들이 위에서 설명한 Self-prediction과 Contrastive learning에 속한다고 볼 수 있는데, 21년에 발표된 TSDAE에서 제안한 방식은 Self-Prediction 중 Maked prediction에 해당한다.

    TSDAE는 [그림] TSDAE의 구조에서 보이는 것처럼 Encoder-Decoder 구조의 모델을 활용하였는데, 학습 시에는 문장의 일부 단어를 랜덤으로 제거하여 Encoder에 입력하도록 하였다. 그리고 Encoder를 통해 생성된 임베딩이 다시 Decoder를 통해 본래의 문장으로 생성되도록 하는 것이 주요 아이디어였다. 문장의 일부 단어를 제거하는 Noise를 포함하더라도 임베딩이 온전한 표현력을 가질 수 있도록 Denoising Encoder로써 일반화된 성능을 끌어올리고자 하였다. 

    TSDAE의 구조
    [그림] TSDAE의 구조, 출처 : https://blog.ml6.eu/multilingual-domain-specific-sentence-transformers-d34f071763d0

     

    21년에 발표된 SimCSE는 Contrastive learning을 통한 학습 방법론을 제안했는데, drop-out을 활용하여 하나의 문장을 Positive Pair(유사 문장)로 구성한 것, 그리고 학습 단위인 Batch 내에서 다른 문장은 Negative로 취급한 것이 핵심 아이디어다. drop-out은 일반화된 모델의 성능을 위해 랜덤하게 일부 뉴런을 비활성화시키는 방식인데, 같은 문장이 입력되더라도 출력되는 임베딩 값이 달라질 수 있게 된다. SimCSE는 이 부분을 활용하여, 동일 문장을 2번 Encoder에 입력함으로써 마치 유사한 문장 2개가 입력되는 것처럼 활용하였다.                         

    SimCSE의 drop-out을 활용한 input 구조
    [그림] SimCSE의 drop-out을 활용한 input 구조

                               

    22년에 발표된 DiffCSE는 MLM과 SimCSE를 조합한 방식을 제안하였는데, 특히 Self-prediction 중 Innate relationship prediction을 추가로 활용한 것이 핵심 아이디어다. 학습 시에 원 문장의 일부를 마스킹하고, 마스킹 된 부분을 Generator 통해 생성한 뒤, 변형된 전체 문장에서 어느 부분이 마스킹된 것인지 Discriminator를 통해 맞히게 하였다. (GAN을 알고 있다면, 이해가 더 쉬울 것이다) 이렇게 마스킹된 부분을 맞히는 작업을 피드백(Loss 함수)에 반영함으로써, 데이터 증강을 위해 수행한 삭제, 마스킹 등의 행위가 문장 본래의 의미를 잃게하는 것을 보상하고자 하였다.

    DiffCSE의 학습 구조
    [그림] DiffCSE의 학습 구조

                                                             

     

    LLM의 출현과 임베딩 모델의 변화  

    23년 ChatGPT의 등장과 함께, 임베딩 방식도 큰 변화를 맞이하게 된다. 지금까지 소개된 학습 방식들과 모델은 모두 BERT 계열의 모델을 활용한 것으로 즉, Encoder를 활용하였다. 압축에 적합한 Encoder와 생성에 적합한 Decoder 중에서, 임베딩에는 Encoder가 더 나을 것이라는 예상과 달리 Decoder로 이뤄진 OpenAI Embedding과 오픈소스 LLM 모델을 활용한 임베딩 모델들로 SOTA를 이뤘다. 즉, 대량의 Auto-Regressive Pre-training만으로 좋은 임베딩 형성에 충분히 기여할 수 있다는 것이다. 

    23년에 공개된 ‘Improving Text Embeddings with Large Language Model’ 에서는 오픈소스 LLM인 Mistral 7B 모델과 ChatGPT4로 생성한 학습 데이터를 활용한 방식을 제안하였는데, LLM 모델을 생성 데이터로 Contrastive learning(InfoNCE loss)한다는 심플한 아이디어로 SOTA(아래 그림 e5-mistral-7b-instruct 모델로 24년 5월 기준 6위)를 달성했다. 

    MTEB 리더보드
    [그림] MTEB 리더보드

                                                                           

    그러나, LLM 기반 임베딩에는 2가지 단점이 존재하다. 바로 많은 메모리 사용량과 높은 임베딩 차원 수다. [그림] MTEB 리더보드에서 상위 랭크된 LLM 계열 모델들의 메모리 사용량과 임베딩 차원 수를 확인할 수 있는데, 많은 메모리 사용량은 ‘조연’ 임베딩 모델이 ‘주인공’ LLM 만큼의 메모리 사용량을 차지해 실용성을 떨어지게 한다. 또한 지금껏 경험해 본적 없는 높은 임베딩 차원은 많은 연산량으로 비용 부담을 증가시키고, VectorDB에서 빠르게 유사 벡터를 찾도록 하는 ANN(approximate nearest neighbor) 서치 알고리즘에 불확실성을 가져다 줄 수 있다. 

    실용성을 확보하기 위한 여러가지 시도와 노력  

    이렇게 성능 위주로 고려된 모델들의 실용성에 대한 의문이 제기되면서, 최근에는 높은 임베딩 성능을 보장하면서도 적절한 차원의 수와 메모리 사용량을 유지하고자 하는 시도와 노력이 계속되고 있다. 24년 1월에는 OpenAI에서 ‘Matryoshka Representation Learning (이하 MRL)’을 적용한 임베딩 모델을 공개하며, 낮은 차원의 임베딩 벡터 출력이 가능하도록 하였다. 또한 mixedbread에서도 2D-Matryoshka를 적용한 임베딩 모델을 공개하며, 해당 모델이 적절한 차원을 유지하면서도 높은 성능을 낼 수 있음을 강조하였다. 

    여기서 MRL이란, 아래 그림의 Matryoshka 인형처럼 큰 인형 안에 작은 인형이 연달아 나오듯이, original 차원의 임베딩 벡터를 일정 비율로 반복적으로 축소하고, 축소된 차원의 임베딩 벡터를 Loss Function에 반영하였다. 이를 통해 적은 수의 차원으로도 original과 유사 수준의 표현력을 얻고자 의도하였다. 여기에 2D MRL은 한층 진보되어 출력되는 벡터의 차원뿐 아니라, layer 측면에서도 출력 층과 중간 Layer 간의 표현력을 Align할 수 있도록 하여, 적은 수의 차원 벡터 안에 높은 표현력을 담고자 하였다. 2D-Matryoshka를 적용한 mixedbread의 mxbai-embeded-2d-large-v1 모델은 1024의 높지 않은 차원 수로 24년 5월 현재 MTEB 리더보드 29위에 랭크되어 있다.    

    Matryoshka 인형과 MRL

       

    Matryoshka 인형과 MRL
    [그림] Matryoshka 인형과 MRL,  출처 : The Russian Store,   Matryoshka Representation Learning

     

    Base MRL 방식과 2D MRL 방식
    [그림] Base MRL 방식과 2D MRL 방식

     

     

    그 외에도 24년 2월에 BAAI(Beijing Academy of Artificial Intelligence)에서 공개한 BGE-m3 모델은 빈도 기반 방식인 BM25와 문장 기반의 Dense 벡터, 그리고 전체 임베딩 값을 그대로 활용하는 Multi-vector 방식을 모두 적용했다. 여기에 각 3가지 방식에 대한 점수를 통합하고 이를 Teacher로서 활용하는 Self-Knowledge Distillation를 제안하며, 앙상블의 원리를 기반으로 1024 차원 정도로 높은 다국어 모델의 성능을 갖도록 하였다. 

    BGE-m3 모델의 BM25, Dense Vector, Multi-vector를 활용한 학습
    [그림] BGE-m3 모델의 BM25, Dense Vector, Multi-vector를 활용한 학습

                                 

     

    고품질 임베딩에 대한 높은 수요와 지속적인 연구

    임베딩 기술은 LLM과 RAG를 맞이하여, 다시 주목받고 있다. 국내외 많은 산업체들은 LLM을 앞세운 서비스와 솔루션을 제시하고 있지만, 그 밑바탕에는 대부분 RAG 또는 유사 파이프 라인이 존재하고 있으며 임베딩 모델은 RAG의 한 축을 담당하고 있다. OpenAI와 Google, Cohere 등의 주요 업체는 모두 임베딩 변환 서비스를 유료로 제공하고 있는데, 고품질의 임베딩 변환 자체만으로도 매력적인 서비스가 될 수 있다는 것이다.

    고품질의 임베딩에 대한 수요는 계속 이어질 것이며, 이를 위한 지속적인 노력이 필요한 시점이다. 한국어에 적합한 임베딩 모델, 도메인에 특화된 임베딩 모델과 학습 방법론, 적절한 차원을 유지한 채 높은 임베딩을 가능하게 하는 방법 등 많은 국내 연구자와 산업계의 지속적인 기여와 노력이 필요하다.

     

    728x90
Designed by Tistory.