LLM의 한계와 RAG를 사용하는 이유
Phil Eaton
2024년 6월 17일
이 블로그는 Phil Eaton, Bilge Ince, Artjoms Iskovs가 공동으로 작성했습니다.
대규모 언어 모델(LLMs)은 강력한 성능을 자랑하지만, 만능은 아닙니다. ChatGPT나 다른 LLM을 사용해 보신 분이라면 이들이 독점 정보와 관련된 질문에 제대로 답하지 못한다는 점을 경험해 보셨을 겁니다. 더 큰 문제는, 이 모델들이 단순히 독점 정보를 모르는 것뿐만 아니라, 자신의 한계를 인식하지 못한다는 것입니다. 설령 한계를 인지한다고 해도, 독점 정보에 접근할 방법이 없습니다. 바로 여기서 RAG(Retrieval Augmented Generation)가 등장합니다. RAG는 LLM이 새로운 독점 정보를 활용해 보다 정확한 답변을 생성할 수 있도록 돕습니다.
다시 기본에서 생각해보기
LLM은 인간과 유사한 텍스트를 이해하고 생성할 수 있는 고도화된 인공지능 기술입니다. 방대한 양의 텍스트 데이터를 학습해, 질문에 답하거나, 에세이를 작성하거나, 정보를 요약하고, 대화에도 참여할 수 있습니다. 이 모델들은 **신경망(neural network)**을 기반으로 작동하는데, 이는 인간의 뇌를 본뜬 구조입니다. 신경망은 정보를 처리하는 여러 층의 노드(또는 “뉴런”)로 이루어져 있습니다. 뉴런 간의 연결에는 “가중치(weights)”가 적용되며, 모델이 학습 데이터를 통해 학습하면서 이 가중치가 조정됩니다. 이러한 과정을 통해 모델은 입력받은 텍스트를 기반으로 적절하고 맥락에 맞는 텍스트를 생성할 수 있습니다.
예를 들어 ChatGPT를 살펴보겠습니다. 이 모델은 GPT-4o나 GPT-3.5 Turbo와 같은 모델을 사용합니다. 사용자가 ChatGPT에 입력한 텍스트는 “컨텍스트 윈도우(context window)”라는 형식으로 처리되며, 이는 사용자의 입력 프롬프트를 토큰화한 결과와 ChatGPT의 시스템 프롬프트를 합친 것입니다. 최종 출력은 모델(GPT-4o, GPT-3.5 Turbo 등)이 생성한 텍스트입니다. ChatGPT는 LLM을 활용한 여러 애플리케이션 중 하나일 뿐이지만, 이를 통해 설명하면 이해하기가 더 쉽습니다.
GPT 계열 모델이나 다른 범용 모델은 일반적인 질문에 매우 유용합니다. 하지만 회사 내부 데이터와 관련된 구체적인 질문에는 한계가 있습니다. 예를 들어, GPT-4o 모델을 사용하는 ChatGPT에 “지난 주요 릴리스에서 변경된 핵심 내용은 무엇인가요?” 또는 “결제 게이트웨이와 관련된 해결되지 않은 주요 버그가 있나요?”와 같은 질문을 한다면, 모델은 정확하거나 최신의 답변을 제공하지 못할 것입니다. 이는 모델이 JIRA나 Git과 같은 시스템에 저장된 독점 데이터에 접근할 수 없기 때문입니다. 따라서 이러한 한계를 해결하려면 새로운 접근 방식이 필요합니다. RAG가 바로 이런 문제를 해결하기 위한 솔루션입니다.
도메인에 맞게 모델을 최적화하기
당신의 데이터를 기반으로 처음부터 새로운 모델을 학습시키는 방법이 있습니다. 특정 작업을 자주 수행해야 하는 경우라면 이러한 투자가 가치 있을 수 있습니다. 하지만 일반적인 모델을 학습시키는 데는 수개월이 걸리고, 고가의 하드웨어가 필요합니다. 게다가 학습 기간 동안 추가되거나 수정된 데이터는 새로운 모델이 반영하지 못한다는 단점이 있습니다.
다른 방법으로는 일반 LLM이 다루기 어려운 전문 지식이 필요한 작업에 대해 **파인튜닝(fine-tuning)**을 적용하는 것이 있습니다. 파인튜닝은 특정 도메인, 작업, 또는 언어에 맞춘 맞춤형 모델을 생성하며, 이를 통해 일반 LLM보다 해당 분야에서 더 뛰어난 성능을 발휘할 수 있습니다. 또한, 특정 우려를 반영해 모델의 출력이 편향을 줄이고, 요구 사항에 맞게 조정되도록 할 수 있습니다.
다만, 파인튜닝은 해당 작업에 최적화된 고품질 데이터가 필요하며, 기계 학습에 대한 전문 지식과 도메인에 대한 깊은 이해가 필수적입니다. 더불어, 모델의 유지보수와 확장까지 고려해야 합니다.
최근에는 **RAG(Retrieval Augmented Generation)**가 점점 더 주목받고 있습니다. RAG는 LLM 모델을 실행할 때 사용자 프롬프트에 관련성 높은 (독점) 데이터를 자동으로 추가하는 방식입니다. 필요한 데이터를 실시간으로 보완함으로써, 기존 LLM을 활용하면서도 더욱 정확하고 도메인에 적합한 결과를 얻을 수 있습니다.
컨텍스트 윈도우란?
컨텍스트 윈도우와 관련해 두 가지 주요 과제가 있습니다.
첫째, LLM의 컨텍스트 윈도우는 처리할 수 있는 데이터 양이 제한적입니다.
둘째, 컨텍스트 윈도우 크기에 따라 비용이 발생합니다. (예를 들어, Llama 3 같은 LLM을 자체 하드웨어에서 실행한다고 해도, 컨텍스트 윈도우가 클수록 더 많은 RAM이 필요하므로 비용이 늘어납니다.)
컨텍스트 윈도우는 일반적으로 4,096에서 1백만 토큰까지 지원합니다. 여기서 “토큰”이란 NLP에서 익숙한 개념이지만, 모델마다 토큰화 방식은 다릅니다. 예를 들어, **“Diseased Nature often times breaks forth in strange eruptions.”**라는 문장은 8개의 단어와 마침표로 구성되어 있지만, GPT의 토크나이저로 처리하면 11개의 토큰이 됩니다.
결국 우리는 모델이 제공하는 기본적인 지능에 의존하며, 사용자 프롬프트 앞에 독점 데이터를 추가하여 필요한 맥락을 제공합니다.
하지만 여기서 문제는 어떤 텍스트를 프롬프트에 포함할지입니다. 컨텍스트 윈도우의 공간이 제한적이기 때문에 포함할 내용을 신중히 선택해야 합니다.
또한, ChatGPT 같은 AI 시스템에서 텍스트를 처리하는 비용은 입력 크기와 비례합니다. 입력 텍스트가 길어질수록 더 많은 메모리와 처리 능력, 시간이 요구되며, 이는 운영 비용 상승으로 이어지게 됩니다.
관련 정보 검색하기
RAG(Retrieval Augmented Generation)는 사용자 프롬프트에 답변하는 과정을 두 단계로 나눕니다.
첫 번째는 사용자 프롬프트와 가장 관련성이 높은 제한된 독점 정보를 검색하는 단계입니다.
두 번째는 검색된 정보를 사용자 프롬프트에 결합해 생성 모델에 입력하고, 이를 통해 최종 답변을 받는 단계입니다.
1단계: 정보 검색(Retrieval)
RAG의 첫 단계인 검색에서는 독점 문서를 찾기 위해 벡터 검색을 활용할 수 있습니다. 벡터 검색은 서로 다른 벡터 간의 근접성을 계산해 의미적으로 유사한 벡터를 찾아냅니다. 예를 들어, “food”를 검색하면 “bananas”와 관련된 독점 문서를 찾을 수 있습니다. 물론, Lucene 스타일의 전체 텍스트 검색과 같은 다른 방식도 사용할 수 있습니다. 적합한 검색 알고리즘은 작업의 성격에 따라 달라질 수 있지만, 현재 가장 널리 사용되는 방식은 벡터 유사성 검색입니다.
벡터 유사성 검색의 구성 요소
- 벡터 데이터베이스: 벡터를 저장, 인덱싱, 검색할 수 있는 데이터베이스가 필요합니다.
- 임베딩 생성: 문서를 벡터로 변환(임베딩)해 데이터베이스에 저장해야 합니다.
LLM을 활용해 텍스트를 임베딩으로 변환하고 이를 벡터 데이터베이스에 저장할 수 있습니다. 이 경우 LLM은 텍스트 생성 대신 임베딩 생성만을 담당하게 됩니다. 또한, 검색 단계에서 사용하는 LLM과 텍스트 생성 단계에서 사용하는 LLM이 반드시 동일할 필요는 없습니다.
Postgres 사용자라면? pgvector 활용
Postgres 사용자는 pgvector 확장을 벡터 데이터베이스로 사용할 수 있습니다. 이를 위해 다음과 같은 과정을 거칩니다:
- 문서에서 임베딩을 생성하고 이를 pgvector에 저장합니다.
- 사용자가 프롬프트를 입력하면 pgvector의 벡터 유사성 검색을 사용해 가장 관련성이 높은 문서를 검색합니다.
- 검색된 문서 텍스트를 사용자 프롬프트에 추가한 뒤 생성 모델로 전달합니다.
RAG 애플리케이션 구축 옵션
- 오픈 소스 기반: RAG 애플리케이션을 완전히 오픈 소스 구성 요소로 구축하고 자체적으로 호스팅할 수 있습니다.
- EDB Postgres AI 사용: Postgres 및 pgvector를 관리하며, 기존 테이블의 특정 열에서 임베딩을 자동으로 생성 및 업데이트하는 기능을 제공합니다.
RAG는 LLM이 독점 정보를 효과적으로 활용해 더 정확하고 유용한 답변을 제공하도록 돕는 강력한 방법입니다.