RAG 프로세스에서 임베딩(Embedding)과 벡터(Vector)란?
아래 이미지 RAG(Retrieval-Augmented Generation) 처리과정을 살펴보면 중간에 임베딩(Embedding) 생성 단계가 있습니다.
임베딩 생성단계는 사람이 이해할 수 있는 텍스트로 이루어진 문서를 기계가 이해할 수 있는 형태로 바꾸는 작업을 의미합니다.
RAG 1, 2 단계를 통해 잘게 쪼개진 문서, chunk 들은 임베딩 단계(3)를 거쳐 벡터 DB에 저장(4)됩니다.
여기서 임베딩을 통해 문자를 숫자(벡터)로 변환하는 이유는 무엇이고, 왜 이것이 컴퓨터가 연산하기 좋다는 것일까요? 이해를 위해 예를 하나 들어보겠습니다.
[개, 강아지, 고양이, 집] 4개의 단어가 있습니다. 그리고 이 단어들간의 관련성을 파악해보죠. 개를 중심으로 관련성을 살펴보면 일반적으로 아래와 같이 추측할 겁니다.
- 개-강아지 : 강한 관련성
- 개-고양이 : 중간 관련성
- 개-집 : 약한 관련성
이런 관련성이 인식이 된다면 강아지-고양이의 관련성이나 강아지-집, 고양이-집의 관련성도 유추할 수 있겠죠.
사람이야 이 단어를 보면 단어간의 유사성이나 관련성을 쉽게 파악하지만, 컴퓨터는 어떻게 이걸 계산할 수 있을까요? 이 문제를 해결하는 방법이 임베딩입니다.
임베딩은 단어를 문자 그대로 사용하는 대신 일련의 숫자들, 벡터(Vector)로 변환하는 방법입니다.
위 예시에서 각 단어는 7개의 숫자로 바뀌었습니다. 각 단어나 문장이나 문단에서 다양한 의미와 역할을 할 수 있기 때문에 한 두개가 아니라 여러개의(다차원의) 숫자(벡터)로 표현한겁니다.
다만 7개의 숫자는 우리가 2차원 공간에 좌표로 표기하기가 어려우니 2개의 숫자로 압축했다고 하죠. 그러면 각 단어를 2차원 공간에 표시해서 서로간의 거리를 통해 연관성을 유추할 수 있습니다.
(2차원 공간으로의 압축은 우리의 이해를 위한 것이지 실제 RAG 단계에서 이렇게 하는건 아닙니다.)
벡터간의 거리가 단어간의 관련성이라고 한다면 거리 계산을 통해 관련성을 알 수 있습니다. 텍스트를 벡터로 바꿈으로서 사람이 알아보긴 힘들지만 컴퓨터는 계산하기 쉬워졌죠.
다른 예를 하나 더 살펴보죠.
이번에는 [남자, 여자] 그리고 [왕, 여왕] 단어들을 임베딩하는 예시입니다.
이상적으로 단어가 벡터화 되었다면, 2차원 평면에서 남자와 여자는 가깝게 표시되고, 왕과 여왕 역시 가깝게 표시될겁니다. 그리고 남자와 여자 벡터간 거리가 왕과 여왕의 거리와 비슷하겠죠.
이런식으로 임베딩은 문장에서 각 단어들이 다른 단어들과 어떠한 연관성을 가지는지 판단할 수 있는 수학적, 기술적 방법을 제공합니다. 지금은 단어를 예로 들었지만 문장이나 문단, 문서 자체도 유사한 방법으로 벡터화 할 수 있습니다.
그렇다면 각 단어들을 벡터로 변환하는 방법도 중요하고 종류도 다양하게 있겠죠? 이 방법은 보다 전문적인 이해를 필요로하니 단순히 종류와 특장점만 나열할도록 하겠습니다.
Word2Vec
- 단순하고 효과적인 방법: 큰 텍스트 코퍼스에서 단어의 공동 출현 정보를 기반으로 벡터 공간을 학습합니다.
- 장점: 학습이 빠르고, 유사한 의미를 가진 단어는 벡터 공간에서 서로 가깝게 위치합니다.
- 단점: 문맥 정보를 충분히 반영하지 못하며, 다의어 문제를 해결하기 어렵습니다.
GloVe
- 전역 통계와 지역적 통계를 결합: Word2Vec의 단점을 보완하여, 전역적인 통계 정보와 지역적인 통계 정보를 모두 고려하여 벡터를 학습합니다.
- 장점: Word2Vec보다 더욱 정확하고 의미 풍부한 벡터를 생성합니다.
- 단점: 학습 시간이 Word2Vec보다 오래 걸릴 수 있습니다.
FastText
- 단어뿐만 아니라 서브워드(subword)까지 고려: 희귀 단어나 오타에 대한 처리 능력이 뛰어납니다.
- 장점: 어휘 외 확장성이 좋고, 희귀 단어에 대한 처리 능력이 뛰어납니다.
- 단점: 의미적으로 가까운 단어를 잘 구분하지 못할 수 있습니다.
BERT, RoBERTa, XLNet 등의 Transformer 기반 모델
- 문맥 정보를 강하게 학습: 양방향 문맥 정보를 활용하여 단어의 의미를 더욱 정확하게 파악합니다.
- 장점: 다양한 자연어 처리 태스크에서 SOTA(State-of-the-Art) 성능을 보여줍니다.
- 단점: 학습 시간이 오래 걸리고, 많은 계산 자원이 필요합니다.
Sentence-BERT (SBERT)
- 문장 단위의 임베딩: 문장 전체를 하나의 벡터로 표현하여 문장 간의 유사도를 효과적으로 측정합니다.
- 장점: RAG에서 질의와 문서의 유사도를 측정하는 데 효과적입니다.
- 단점: 문장 내 단어의 의미보다는 문장 전체의 의미에 초점을 맞추기 때문에, 단어 수준의 분석에는 적합하지 않을 수 있습니다.
임베딩을 통해 문서가 벡터로 이루어진 일련의 숫자로 변환이 되었다면 이 값들을 DB에 저장해둬야 할겁니다. 그래야 사용자의 질문이 입력되었을 때 그와 관련된 문서들만 추출해내는 작업을 빠르게 수행할 수 있으니까요.
이때 사용되는 것이 벡터 DB 입니다. RAG 과정에서 사용되는 벡터 DB의 종류와 특징은 다음과 같습니다.
Chroma
- 장점
- 오픈 소스이며 무료로 사용 가능
- 파이썬 네이티브로 설계되어 파이썬 환경에서 사용하기 쉬움
- 로컬 및 클라우드 환경 모두에서 사용 가능
- 메타데이터 필터링 기능 제공
- 단점
- 대규모 데이터셋에 대해서는 성능이 상대적으로 낮을 수 있음
- 분산 환경에서의 확장성이 제한적
- 적합한 사용 사례
- 소규모에서 중간 규모의 프로젝트
- 빠른 프로토타이핑
- 로컬 개발 환경
FAISS (Facebook AI Similarity Search)
- 장점
- 고성능 벡터 검색 라이브러리
- 대규모 데이터셋에 최적화됨
- GPU 가속 지원
- 다양한 인덱싱 방법 제공
- 단점
- 사용이 상대적으로 복잡할 수 있음
- 메타데이터 관리 기능이 제한적
- 분산 환경 설정이 복잡할 수 있음
- 적합한 사용 사례
- 대규모 데이터셋을 다루는 프로젝트
- 고성능 검색이 필요한 경우
- 머신러닝 및 AI 연구 프로젝트
Pinecone
- 장점
- 완전 관리형 클라우드 서비스
- 높은 확장성과 성능
- 실시간 업데이트 지원
- 강력한 메타데이터 필터링 기능
- 다중 테넌트 지원
- 단점
- 유료 서비스
- 데이터가 외부 서버에 저장되므로 보안 및 규정 준수 문제가 있을 수 있음
- 로컬 환경에서 사용 불가
- 적합한 사용 사례
- 프로덕션 레벨의 대규모 애플리케이션
- 실시간 업데이트가 필요한 동적 시스템
- 높은 확장성이 요구되는 프로젝트
선택 기준
- 데이터 규모: 소규모는 Chroma, 대규모는 FAISS나 Pinecone
- 성능 요구사항: 고성능 필요 시 FAISS나 Pinecone
- 배포 환경: 로컬/온프레미스는 Chroma나 FAISS, 클라우드는 Pinecone
- 예산: 무료 솔루션은 Chroma나 FAISS, 관리형 서비스는 Pinecone
- 개발 복잡성: 간단한 구현은 Chroma, 복잡한 요구사항은 FAISS나 Pinecone