기존 LLM의 한계
LLM(Large Language Model)은 대규모 텍스트 데이터를 학습해 사람처럼 자연스러운 언어를 이해하고 생성할 수 있는 인공지능 모델입니다. 이러한 모델은 방대한 데이터로 학습되어 다양한 주제에 대해 유창하게 답변할 수 있지만, 몇 가지 한계가 존재합니다.
대표적인 문제 중 하나는 환각(Hallucination) 현상입니다. 이는 모델이 실제로 존재하지 않는 정보나 잘못된 사실을 그럴듯하게 생성하는 경우를 말합니다. 또한, 학습 시점 이후의 최신 정보에 대해서는 답변이 부정확하거나 오래된 데이터를 기반으로 대답 할 수 있습니다.
기업이나 개발자는 사용자의 요구사항에 맞춰 정확하고 최신의 답변을 제공해야합니다.
이를 위해서 최신 데이터 반영, 도메인별 전문 지식 제공, 잘못된 정보 최소화등을 충족해야합니다.
환각은 크게 두가지 종류로 나뉘어 집니다.
내재적 환각(Intrinsic) : 학습한 정보를 잘못 조합하거 문맥을 왜곡할때
외재적 환각(Extrinsic) : 지식 범위를 넘어 질문에 대해 근거없는 응답을 줄때
RAG
RAG(Retrieval Augmented Generation)의 약자로 대규모 언어 모델이 답변을 생성하기 전에 외부 지식 데이터베이스에서 정보를 검색하여 답변의 정확성과 최신성을 높이는 기술입니다.
RAG와 프롬프트 엔지니어링과 도메인 특화 파인튜닝을 결합하면, 사용자의 요구사항에 맞춘 정확하고 신뢰할 수 있는 AI 답변을 구현할 수 있습니다.

RAG 동작 프로세스
사용자의 요청이 들어오면, 벡터 데이터베이스에서 의미적으로 가장 가까운 청크들을 검색합니다. 이후 이 청크들을 사용자 입력과 결합해 프롬프트를 생성하고, 이를 LLM에 전달하여 응답을 생성합니다.
전처리 동작
RAG는 다음 단계를 통해 지식 기반을 전처리합니다.
- PDF, Word, HTML, 텍스트 파일 등 다양한 형식의 문서를 Document Loader를 통해 읽어옵니다.
- 스플리터(Spliter)를 통해 읽어온 문서를 작은 텍스트 덩어리(Chunk)로 나눕니다.
- 이후 토크나이저(Tokenizer)를 통해 토큰단위로 변환합니다.
- 임베딩 모델을 사용해 각 토큰을 의미를 반영한 벡터(Vector)로 변환 합니다.
- 의미적 유사성을 통한 검색이 가능한 벡터 데이터베이스에 벡터를 저장합니다.
사용자 요청 처리 동작
RAG는 다음 단계를 통해 사용자 요청을 처리합니다.
- 사용자가 입력한 요청문을 토크나이저를 통해 토큰 단위로 분리합니다
- 임베딩 모델을 통해 해당 토큰을 벡터로 변환합니다.
- 벡터 데이터베이스에 가장 유사한 문서 N개를 가져옵니다.
- 문서 N개에서 Re-Ranker를 통해 재평가 하여 관련상 높은 문서 K개로 선별합니다.
- 선별된 문서K개와 사용자 요청을 함께 LLM에 요청을 보내 처리합니다.
RAG는 외부 데이터베이스나 벡터 스토어에 저장된 데이터를 사용자의 요구에 맞게 검색한 뒤, 이 검색 결과를 사용자의 질문과 함께 LLM에 전달하여 보다 정확하고 풍부한 답변을 생성하는 방식입니다.
RAG 구성모듈
RAG는 크게 Tokenizer, Splitter, Embedding Model, Retriever, VectorDB로 구성되어있습니다.
Splitter
Splitter은 데이터를 체계적으로 정리하고, 임베딩 모델이 효율적으로 처리할 수 있도록 준비하도록 합니다.
임베딩 모델에는 컨텍스트 윈도우가 존재합니다. 이는 토큰에 있는 정보의 양을 단일 고정 크기 벡터로 처리할 수 있는 양을 결정합니다. 만약 초과를 하게 된다면 초과 토큰이 벡터로 처리되게전에 버려질 수 있습니다. 이는 중요한 문맥이 제거되어 성능 저하를 일으킬 수 있습니다.
그렇기에 미리 정의된 규칙에 따라 문서를 문장 또는 단락과 같은 논리적 단위로 나눕니다. 이러한 분할 작업은 정보의 의미적 일관성을 유지하면서 처리과정의 준비를 가능하게 합니다.
Tokenizer
Tokenizer는 원시 텍스트를 토큰이라는 단위로 변환하는 역할을 합니다. 이 토큰에는 Tokenizer Vocabulary내에서 토큰을 고유하게 식별할 수 있는 정수 값(토큰 ID)가 할당이 됩니다.
Tokenizer Vocabulary는 토크나이저 학습에 사용되는 모든 가능한 토큰의 집합입니다. 즉 각 토큰을 Vocabulary에서 찾아 해당 ID로 변환을 하게 됩니다. Tokenizer에는 텍스트를 분리 하는 여러가지의 방식이 존재합니다. 대표적으로 Word-Based, Character-based, Subword 가 존재합니다.
Embedding Model
Embedding Model(임베딩 모델)은 텍스트를 숫자 벡터로 변환하는 역할을 합니다. 학습을 통해 각 토큰(token)을 고유한 벡터 공간의 좌표로 매핑하며,이로써 의미적으로 비슷한 단어들은 가까운 벡터 위치에 배치됩니다.
또한 임베딩 모델은 문맥(Context)에 따라 단어의 의미를 구분할 수 있어,같은 단어라도 문맥이 달라지면 서로 다른 벡터로 표현됩니다. 이러한 특성 덕분에 모델은 텍스트 간의 의미적 유사성(Semantic Similarity)을 효과적으로 파악할 수 있습니다
문맥에 따른 의미란, 같은 단어라도 문장이 사용된 맥락에 따라 다른 의미로 해석되는 것을 말합니다.
예를 들어 “Apple”이라는 단어는 문맥에 따라 과일(apple)을 뜻할 수도 있고, 회사(Apple Inc.)를 의미할 수도 있습니다.
임베딩 모델은 이러한 문맥적 차이를 반영해, 같은 단어라도 문장 내 사용 의도에 따라 서로 다른 벡터로 표현합니다.
VectorDatabase
정보는 텍스트 문서, 애플리케이션 로그, 테이블, 그래프 등 다양한 형태로 존재합니다. 이처럼 정형 데이터뿐만 아니라 비정형 데이터도 함께 다뤄야 하는 환경에서, VectorDB(Vector Database)는 비정형 데이터를 벡터 형태로 변환하여 저장할 수 있는 데이터베이스입니다. 또한 VectorDB는 메타데이터(metadata)를 함께 저장할 수 있어, 단순한 유사도 기반 검색뿐만 아니라 메타데이터 필터링을 통한 정교한 쿼리 수행도 가능합니다. 이를 통해 개발자는 문맥적으로 유사한 데이터를 빠르고 효율적으로 검색할 수 있습니다.
Retriever
Retriever는 사용자의 질의(Query)에 따라 가장 관련성이 높은 데이터를 찾아주는 검색 담당자 역할을 합니다.
사용자의 입력을 벡터 형태로 변환(Embedding)한 뒤, 데이터베이스 내의 벡터들과 유사도를 계산하여 가장 가까운 결과를 반환합니다.
리트리버는 검색 방식에 따라 Sparse(희소) 타입과 Dense(밀집) 타입으로 구분됩니다.