오늘은 벡터 데이터베이스에 대해서 알아보고, 벡터 임베딩이 무엇인지 인덱싱을 위한 알고리즘이 어떤 것들이 있는지 알아보도록 하겠습니다.
Table Of Contents
벡터 데이터베이스란?
벡터 데이터베이스는 CRUD 작업, 메타데이터 필터링, 수평적 확장 및 서버리스와 같은 기능을 사용하여 빠른 검색 및 유사성 검색을 위해 벡터 임베딩을 인덱싱하고 저장합니다.
우리는 AI 혁명의 한가운데에 있습니다. 이는 모든 산업을 뒤엎고 위대한 혁신을 약속하지만 새로운 도전 과제도 제시합니다. 효율적인 데이터 처리는 대규모 언어 모델, 생성형 AI 및 시맨틱 검색을 포함하는 애플리케이션에서 그 어느 때보다 중요해졌습니다.
이러한 모든 새로운 애플리케이션은 AI가 복잡한 작업을 실행할 때 활용할 수 있는 장기 기억을 이해하고 유지하는 데 중요한 의미론적 정보를 전달하는 벡터 데이터 표현 유형인 벡터 임베딩에 의존합니다.
임베딩은 AI 모델(예: 대규모 언어 모델)에 의해 생성되며 많은 속성 또는 기능을 가지고 있어 표현을 관리하기가 어렵습니다. AI 및 기계 학습의 맥락에서 이러한 기능은 패턴, 관계 및 기본 구조를 이해하는 데 필수적인 데이터의 다양한 차원을 나타냅니다.
벡터 임베딩은 단어와 문장, 기타 데이터를 의미와 관계를 포착하는 숫자로 변환하는 방법입니다. 다양한 데이터 유형을 다차원 공간의 점으로 표현하며 유사한 데이터 요소가 서로 더 가깝게 클러스터링됩니다. 이러한 수치 표현은 기계가 이 데이터를 보다 효과적으로 이해하고 처리하는 데 도움이 됩니다.
단어 및 문장 임베딩은 벡터 임베딩의 가장 일반적인 하위 유형 중 두 가지이지만 다른 유형도 있습니다. 일부 벡터 임베딩은 전체 문서뿐만 아니라 시각적 콘텐츠와 일치하도록 설계된 이미지 벡터, 사용자 선호도를 결정하는 사용자 프로필 벡터, 유사한 제품을 식별하는 데 도움이 되는 제품 벡터 등을 나타낼 수 있습니다. 벡터 임베딩은 머신 러닝 알고리즘이 데이터에서 패턴을 찾고 정서 분석, 언어 번역, 추천 시스템 등과 같은 작업을 수행하는 데 도움이 됩니다.
그렇기 때문에 이 데이터 유형을 처리하기 위해 특별히 설계된 특수 데이터베이스가 필요합니다. 벡터 데이터베이스는 임베딩을 위한 최적화된 스토리지 및 쿼리 기능을 제공하여 이러한 요구 사항을 충족합니다.
벡터 데이터베이스는 독립형 벡터 인덱스에는 없는 기존 데이터베이스의 기능을 가지고 있습니다.
또한, 전통적인 스칼라 기반 데이터베이스에는 없는 벡터 임베딩을 처리하는 전문성을 갖추고 있습니다.
벡터 데이터 작업의 과제는 기존의 스칼라 기반 데이터베이스가 이러한 데이터의 복잡성과 규모를 따라갈 수 없어 인사이트를 추출하고 실시간 분석을 수행하기 어렵다는 것입니다. 벡터 데이터베이스는 이러한 유형의 데이터를 처리하도록 의도적으로 설계되었으며 데이터를 최대한 활용하는 데 필요한 성능, 확장성 및 유연성을 제공합니다.
차세대 벡터 데이터베이스는 효율적인 비용과 인텔리전스 확장을 처리하기 위해 보다 정교한 아키텍처를 도입하고 있습니다. 이 기능은 스토리지와 컴퓨팅 비용을 분리하여 AI에 대한 저비용 지식 지원을 가능하게 하는 서버리스 벡터 데이터베이스에 의해 처리됩니다.
벡터 데이터베이스를 사용하면 의미 체계 정보 검색, 장기 기억 등과 같은 지식을 AI에 추가할 수 있습니다. 아래 다이어그램은 이러한 유형의 응용 프로그램에서 벡터 데이터베이스의 역할을 더 잘 이해할 수 있도록 합니다.
위의 그림을 자세히 살펴보겠습니다.
1. 먼저 임베딩 모델을 사용하여 인덱싱하려는 콘텐츠에 대한 벡터 임베딩을 만듭니다.
2. 벡터 임베딩은 임베딩이 생성된 원본 콘텐츠에 대한 일부 참조와 함께 벡터 데이터베이스에 삽입됩니다.
3. 애플리케이션이 쿼리를 발행하면 동일한 임베딩 모델을 사용하여 쿼리에 대한 임베딩을 생성하고 이 임베딩을 사용하여 데이터베이스에서 유사한 벡터 임베딩을 쿼리합니다.
앞서 언급했듯이 이러한 유사한 임베딩은 임베딩을 만드는 데 사용된 원본 콘텐츠와 연관됩니다.
아래 이미지는 벡터 임베딩과 최근접 질의를 처리하는것을 그림으로 나타낸 것입니다. 결국 이미지나, 문서, 음악, 영상과 같은 데이터들은 벡터 표현으로 임베딩되고 질의 과정에서도 입력으로 들어온 조건에 대한 이미지, 문서, 음악, 영상과 같은 것들을 임베딩하여 최근접 검색 결과로 나타난 값을 반환합니다.
벡터 임베딩의 유형
다양한 애플리케이션에서 일반적으로 사용되는 여러 가지 유형의 벡터 임베딩이 있습니다. 몇 가지 예를 들면 다음과 같습니다.
단어 임베딩
개별 단어를 벡터로 나타냅니다. Word2Vec, GloVe 및 FastText와 같은 기술은 큰 텍스트 말뭉치에서 의미론적 관계와 문맥 정보를 캡처하여 단어 임베딩을 학습합니다.
문장 임베딩
전체 문장을 벡터로 나타냅니다. Universal Sentence Encoder(USE) 및 SkipThought와 같은 모델은 문장의 전반적인 의미와 맥락을 포착하는 임베딩을 생성합니다.
문서 임베딩
문서(신문 기사, 학술 논문, 서적 등 모든 것)를 벡터로 나타냅니다. 이는 전체 문서의 의미 정보와 컨텍스트를 캡처합니다. Doc2Vec 및 Paragraph Vectors와 같은 기술은 문서 임베딩을 학습하도록 설계되었습니다.
이미지 임베딩
다양한 시각적 특징을 포착하여 이미지를 벡터로 표현합니다. 콘볼루션 신경망(CNN)과 같은 기술과 ResNet 및 VGG와 같은 사전 훈련된 모델은 이미지 분류, 객체 감지, 이미지 유사성과 같은 작업을 위한 이미지 임베딩을 생성합니다.
사용자 임베딩
시스템이나 플랫폼의 사용자를 벡터로 나타냅니다. 이는 사용자 선호도, 행동 및 특성을 포착합니다. 사용자 임베딩은 추천 시스템부터 개인 맞춤화된 마케팅, 사용자 세분화에 이르기까지 모든 분야에서 사용될 수 있습니다.
제품 임베딩
전자상거래 또는 추천 시스템의 제품을 벡터로 나타냅니다. 이는 제품의 속성, 기능 및 기타 사용 가능한 의미 정보를 캡처합니다. 그런 다음 알고리즘은 이러한 임베딩을 사용하여 벡터 표현을 기반으로 제품을 비교, 권장 및 분석할 수 있습니다.
벡터 임베딩 알고리즘
- Word2Vec: 단어 임베딩의 선구자로, 단어 간 의미적 관계를 캡처합니다. CBOW (Continuous Bag of Words)와 Skip-gram 두 가지 모델로 구성됩니다.
- GloVe (Global Vectors for Word Representation): 단어의 빈도와 문맥 정보를 함께 고려하여 벡터를 생성합니다. 행렬 분해 기반 알고리즘입니다.
- FastText: Word2Vec의 확장 버전으로, 단어를 하위 단어(subword)로 분해하여 벡터를 생성합니다. 이는 희귀한 단어에 대한 효과적인 임베딩을 제공합니다.
- ELMo (Embeddings from Language Models): 문장 임베딩을 위해 사전 훈련된 언어 모델을 사용합니다. 양방향 LSTM을 기반으로 합니다.
- BERT (Bidirectional Encoder Representations from Transformers): Transformer 아키텍처를 사용한 사전 훈련된 언어 모델입니다. 문장 임베딩과 문맥 정보를 효과적으로 캡처합니다.
- Doc2Vec (Paragraph Vector): 문서 임베딩을 위한 알고리즘으로, 단어와 문맥을 함께 고려하여 문서를 벡터로 표현합니다.
이 외에도 다양한 벡터 임베딩 기법이 있으며, 연구와 발전이 계속되고 있습니다. 각 알고리즘은 특정한 목적이나 데이터에 적합한 임베딩을 생성합니다.
벡터 임베딩 생성 절차
- 데이터 수집: 텍스트나 이미지 등의 대규모 데이터 세트를 수집합니다.
- 데이터 전처리: 노이즈 제거, 정규화 등을 통해 데이터를 준비합니다.
- 모델 선택 및 훈련: 적절한 신경망 모델을 선택하고 데이터로 모델을 훈련시킵니다.
- 임베딩 생성: 모델이 데이터의 패턴을 학습하고 의미 있는 수치 벡터를 생성합니다.
이 과정을 통해 데이터의 의미와 관계를 포착하는 벡터 임베딩이 만들어집니다
벡터 인덱스와 벡터 데이터베이스의 차이점은 무엇입니까?
FAISS(Facebook AI Similarity Search)와 같은 독립형 벡터 인덱스는 벡터 임베딩의 검색 및 검색을 크게 향상시킬 수 있지만, 기존의 데이터베이스에 존재하는 기능들처럼 사용할 수가 없습니다. 반면, 벡터 데이터베이스는 벡터 임베딩을 관리하기 위해 특별히 구축된 것으로, 독립형 벡터 인덱스를 사용할 때보다 몇 가지 이점을 제공합니다.
데이터 관리
벡터 데이터베이스는 데이터 삽입, 삭제, 업데이트와 같이 잘 알려져 있고 사용하기 쉬운 데이터 저장 기능을 제공합니다. 따라서 스토리지 솔루션과 통합하기 위해 추가 작업이 필요한 FAISS와 같은 독립형 벡터 인덱스를 사용하는 것보다 벡터 데이터를 관리하고 유지 관리하는 것이 더 쉽습니다.
메타데이터 저장 및 필터링
벡터 데이터베이스는 각 벡터 항목과 관련된 메타데이터를 저장할 수 있습니다. 그런 다음 사용자는 세분화된 쿼리를 위해 추가 메타데이터 필터를 사용하여 데이터베이스를 쿼리할 수 있습니다.
확장성
벡터 데이터베이스는 증가하는 데이터 양과 사용자 요구에 따라 확장할 수 있도록 설계되어 분산 및 병렬 처리를 더 잘 지원합니다. 독립형 벡터 인덱스는 비슷한 수준의 확장성을 달성하기 위해 사용자 정의 솔루션이 필요할 수 있습니다(예: Kubernetes 클러스터 또는 기타 유사한 시스템에 배포 및 관리). 최신 벡터 데이터베이스는 또한 서버리스 아키텍처를 사용해 규모에 따라 비용을 최적화합니다.
실시간 업데이트
벡터 데이터베이스는 종종 실시간 데이터 업데이트를 지원하므로 데이터를 동적으로 변경하여 결과를 최신 상태로 유지할 수 있는 반면, 독립형 벡터 인덱스는 새로운 데이터를 통합하기 위해 전체 데이터 재 인덱싱 프로세스가 필요할 수 있으며, 이는 시간과 계산 비용이 많이 들 수 있습니다. 고급 벡터 데이터베이스는 최신성을 유지하면서 내부적으로 인덱스 재구성을 통해 성능을 업그레이드할 수 있습니다.
백업 및 컬렉션
벡터 데이터베이스는 데이터베이스에 저장된 모든 데이터를 백업하는 일상적인 작업을 처리합니다.
에코시스템 통합
벡터 데이터베이스는 데이터 처리 에코시스템의 다른 구성 요소, 예를 들어 ETL 파이프라인(예: Spark), 분석 도구(예: Tableau 및 Segment), 시각화 플랫폼(예: Grafana)과 보다 쉽게 통합할 수 있어 데이터 관리 워크플로우를 간소화할 수 있습니다. 또한 LangChain, LlamaIndex, Cohere 등과 같은 다른 AI 관련 도구와도 쉽게 통합할 수 있습니다.
데이터 보안 및 액세스 제어
벡터 데이터베이스는 일반적으로 민감한 정보를 보호하기 위해 데이터 보안 기능과 액세스 제어 메커니즘을 기본으로 제공하며, 이는 독립형 벡터 인덱스 솔루션에서는 제공되지 않을 수 있습니다. 네임스페이스를 통한 멀티테넌시를 통해 사용자는 자신의 인덱스를 완전히 분할하고 심지어 자신의 인덱스 내에 완전히 격리된 파티션을 생성할 수도 있습니다.
요약하면, 벡터 데이터베이스는 확장성 문제, 번거로운 통합 프로세스, 실시간 업데이트 및 내장 보안 조치의 부재와 같은 독립형 벡터 인덱스의 한계를 해결하여 벡터 임베딩을 처리하기 위한 우수한 솔루션을 제공하여 보다 효과적이고 간소화된 데이터 관리 방법을 제공합니다.
벡터 데이터베이스는 어떻게 작동하나요?
기존 데이터베이스는 문자열, 숫자, 기타 유형의 스칼라 데이터를 행과 열에 저장하는 방식으로 작동한다는 것은 누구나 잘 알고 있습니다. 반면에 벡터 데이터베이스는 벡터에서 작동하므로 최적화 및 쿼리 방식이 상당히 다릅니다.
기존 데이터베이스에서는 일반적으로 데이터베이스에서 값이 쿼리와 정확히 일치하는 행을 쿼리합니다. 벡터 데이터베이스에서는 유사성 메트릭을 적용하여 쿼리와 가장 유사한 벡터를 찾습니다.
벡터 데이터베이스는 근사 최인접 이웃(ANN: Approximate Nearest Neighbor) 검색에 참여하는 다양한 알고리즘의 조합을 사용합니다. 이러한 알고리즘은 해싱, 양자화 또는 그래프 기반 검색을 통해 검색을 최적화합니다.
이러한 알고리즘은 쿼리된 벡터의 이웃을 빠르고 정확하게 검색할 수 있는 파이프라인으로 조립됩니다. 벡터 데이터베이스는 대략적인 결과를 제공하기 때문에 정확도와 속도 사이의 주요 절충점을 고려합니다. 결과가 정확할수록 쿼리 속도는 느려집니다. 하지만 좋은 시스템은 완벽에 가까운 정확도로 초고속 검색을 제공할 수 있습니다.
이러한 알고리즘은 쿼리된 벡터의 이웃을 빠르고 정확하게 검색할 수 있는 파이프라인으로 구성됩니다. 벡터 데이터베이스는 대략적인 결과를 제공하기 때문에 정확성과 속도 사이의 주요 절충점을 고려합니다. 결과가 정확할수록 쿼리 속도는 느려집니다. 하지만 좋은 시스템은 완벽에 가까운 정확도로 초고속 검색을 제공할 수 있습니다.
다음은 벡터 데이터베이스의 일반적인 파이프라인입니다.
1. 인덱싱
벡터 데이터베이스는 PQ, LSH 또는 HNSW와 같은 알고리즘을 사용하여 벡터를 색인화합니다 (자세한 내용은 아래 알고리즘 참조). 이 단계에서는 벡터를 더 빠른 검색을 가능하게 하는 데이터 구조에 매핑합니다.
2. 쿼리
벡터 데이터베이스는 색인된 쿼리 벡터를 데이터 세트의 색인된 벡터와 비교하여 가장 가까운 이웃을 찾습니다(해당 색인에서 사용하는 유사성 메트릭 적용).
3. 사후 처리
경우에 따라 벡터 데이터베이스는 데이터 세트에서 최종적으로 가장 가까운 이웃을 검색하고 이를 후처리하여 최종 결과를 반환합니다. 이 단계에는 다른 유사도 측정값을 사용하여 가장 가까운 이웃의 순위를 다시 매기는 작업이 포함될 수 있습니다.
알고리즘(Algorithms)
여러 가지 알고리즘을 통해 벡터 인덱스를 쉽게 만들 수 있습니다. 이들의 공통적인 목표는 빠르게 탐색할 수 있는 데이터 구조를 생성하여 빠른 쿼리를 가능하게 하는 것입니다. 이러한 알고리즘은 일반적으로 원본 벡터의 표현을 압축된 형태로 변환하여 쿼리 프로세스를 최적화합니다.
하지만 벡터데이터베이스의 사용자는 이러한 다양한 알고리즘의 복잡성과 선택에 대해 걱정할 필요가 없습니다. 벡터 데이터베이스는 모든 복잡성과 알고리즘 결정을 뒷단에서 처리하도록 설계되어 번거로움 없이 최상의 성능과 결과를 얻을 수 있습니다. 벡터 데이터베이스를 활용하면 가치 있는 인사이트를 추출하고 강력한 AI 솔루션을 제공하는 등 진정으로 중요한 일에 집중할 수 있습니다.
다음 섹션에서는 벡터 임베딩을 처리하는 몇 가지 알고리즘과 고유한 접근 방식을 살펴봅니다.
랜덤 프로젝션 (Random Projection for Locality Sensitive Hashing)
랜덤 프로젝션의 기본 개념은 랜덤 프로젝션 행렬을 사용하여 고차원 벡터를 저차원 공간에 투영하는 것입니다. 난수 행렬을 생성합니다. 행렬의 크기는 우리가 원하는 목표 저차원 값이 될 것입니다. 그런 다음 입력 벡터와 행렬의 도트 곱을 계산하여 원래 벡터보다 차원은 작지만 유사성은 그대로 유지되는 투영 행렬을 생성합니다.
쿼리할 때 동일한 투영 행렬을 사용하여 쿼리 벡터를 저차원 공간에 투영합니다. 그런 다음 투영된 쿼리 벡터를 데이터베이스의 투영된 벡터와 비교하여 가장 가까운 이웃을 찾습니다. 데이터의 차원이 줄어들기 때문에 검색 프로세스는 전체 고차원 공간을 검색하는 것보다 훨씬 빠릅니다.
단, 무작위 투영은 근사치이며 투영 품질은 투영 행렬의 속성에 따라 달라진다는 점을 명심하세요. 일반적으로 투영 행렬이 무작위적일수록 투영 품질이 더 좋아집니다. 그러나 진정한 의미의 무작위 투영 행렬을 생성하는 것은 특히 대규모 데이터 세트의 경우 계산 비용이 많이 들 수 있습니다.
랜덤 프로젝션에 대한 더 자세한 내용은 아래 링크에서 확인하실 수 있습니다.
Random Projection for Locality Sensitive Hashing
곱 양자화(Product Quantization, PQ)
인덱스를 구축하는 또 다른 방법은 벡터 임베딩과 같은 고차원 벡터를 위한 손실 압축 기술인 곱 양자화(PQ)입니다. 이 기법은 원본 벡터를 가져와서 작은 청크로 나누고, 각 청크에 대해 대표적인 '코드'를 만들어 각 청크의 표현을 단순화한 다음, 유사성 연산에 필수적인 정보를 잃지 않고 모든 청크를 다시 합치는 방식입니다. PQ 프로세스는 분할, 학습, 인코딩, 쿼리의 네 단계로 나눌 수 있습니다.
- 분할 - 벡터가 세그먼트로 나뉩니다.
- 훈련 - 각 세그먼트에 대한 '코드북'을 구축합니다. 간단히 말해, 알고리즘은 벡터에 할당할 수 있는 잠재적인 '코드'의 풀을 생성합니다. 실제로 이 '코드북'은 각 벡터의 세그먼트에 대해 k-means clustering 을 수행하여 생성된 클러스터의 중심점으로 구성됩니다. 세그먼트 코드북에는 k-means clustering에 사용한 값과 동일한 수의 값이 포함됩니다.
- 인코딩 - 알고리즘은 각 세그먼트에 특정 코드를 할당합니다. 실제로는 학습이 완료된 후 코드북에서 각 벡터 세그먼트에 가장 가까운 값을 찾습니다. 세그먼트에 대한 PQ 코드는 코드북에서 해당 값에 대한 식별자가 됩니다. 원하는 만큼의 PQ 코드를 사용할 수 있으므로 코드북에서 여러 값을 선택하여 각 세그먼트를 나타낼 수 있습니다.
- 쿼리 - 쿼리할 때 알고리즘은 벡터를 하위 벡터로 분류하고 동일한 코드북을 사용하여 정량화합니다. 그런 다음 인덱싱된 코드를 사용하여 쿼리 벡터에 가장 가까운 벡터를 찾습니다.
코드북의 대표 벡터 수는 표현의 정확성과 코드북 검색에 드는 계산 비용 사이의 절충점입니다. 코드북에 대표 벡터가 많을수록 하위 공간에서 벡터의 표현은 더 정확하지만 코드북을 검색하는 데 드는 계산 비용이 높아집니다. 반대로 코드북의 대표 벡터 수가 적을수록 표현의 정확도는 떨어지지만 계산 비용은 낮아집니다.
Locality-sensitive hashing
지역 민감 해싱(LSH)은 대략적인 가장 가까운 이웃 검색의 맥락에서 색인을 생성하는 기술입니다. 이 기법은 속도에 최적화되어 있으면서도 완전하지 않은 대략적인 결과를 제공합니다. LSH는 아래와 같이 일련의 해싱 함수를 사용해 유사한 벡터를 '버킷'으로 매핑합니다.
주어진 쿼리 벡터의 가장 가까운 이웃을 찾기 위해 유사한 벡터를 해시 테이블에 '버킷'하는 데 사용되는 것과 동일한 해시 함수를 사용합니다. 쿼리 벡터를 특정 테이블에 해시한 다음 같은 테이블에 있는 다른 벡터와 비교하여 가장 가까운 일치 항목을 찾습니다. 이 방법은 전체 공간보다 각 해시 테이블에 있는 벡터 수가 훨씬 적기 때문에 전체 데이터 세트를 검색하는 것보다 훨씬 빠릅니다.
LSH는 근사값을 구하는 방법이며 근사값의 품질은 해시 함수의 속성에 따라 달라진다는 점을 기억하는 것이 중요합니다. 일반적으로 더 많은 해시 함수를 사용할수록 근사치 품질이 더 좋아집니다. 그러나 많은 수의 해시 함수를 사용하면 계산 비용이 많이 들 수 있으며 대규모 데이터 세트에는 적합하지 않을 수 있습니다.
Hierarchical Navigable Small World (HNSW)
HNSW는 트리의 각 노드가 벡터 집합을 나타내는 계층적 트리와 같은 구조를 만듭니다. 노드 사이의 가장자리는 벡터 간의 유사성을 나타냅니다. 알고리즘은 각각 소수의 벡터로 구성된 노드 집합을 생성하는 것으로 시작합니다. 이 작업은 무작위로 수행하거나 각 클러스터가 노드가 되는 k-mean과 같은 알고리즘으로 벡터를 클러스터링하여 수행할 수 있습니다.
그런 다음 알고리즘은 각 노드의 벡터를 검사하고 해당 노드와 가장 유사한 벡터를 가진 노드 사이에 에지를 그립니다.
HNSW 인덱스를 쿼리할 때 이 그래프를 사용하여 트리를 탐색하고 쿼리 벡터에 가장 가까운 벡터를 포함할 가능성이 높은 노드를 방문합니다.
참고자료
'DBMS' 카테고리의 다른 글
Redis Cluster 리눅스에 설치하고 테스트 하기 (0) | 2024.05.29 |
---|---|
Redis Cluster 쓰려면 어떤걸 설치 해야하지? - Redis OSS와 Stack의 차이 및 라이선스 그리고 Cluster는? (0) | 2024.05.28 |
레디스(Redis) 최신 매출 정보(2023)와 회사 규모 (0) | 2024.05.16 |
HammerDB에서 Redis를 지원하는가?(HammerDB supports Redis ?) (0) | 2024.01.17 |
MariaDB 캐릭터셋 변경하기 (1) | 2024.01.04 |