어제는 텍스트를 임베딩(embeddings)으로 변환했습니다. 이제 새로운 문제가 생겼습니다. 수백만 개의 벡터가 어디에 저장되어야 하며, 질문과 가장 가까운 것을 어떻게 빠르게 찾을까요?
쉽게 설명하자면: 일반 데이터베이스는 라벨이 붙은 폴더가 있는 파일 캐비닛과 같습니다. "open"이라는 이름의 폴더를 요청하면 그것을 건네줍니다. 반면 벡터 데이터베이스는 당신이 무슨 의미인지 이해하는 사서와 같아서, 비록 어떤 라벨도 일치하지 않더라도 당신의 아이디어에 가장 가까운 책들을 가져다줍니다.
다이어그램: 관계형 데이터베이스(relational database)는 정확히 일치하는 질문에 답합니다. 벡터 데이터베이스는 저장된 임베딩들을 거리별로 순위 매김하여, 표준 데이터베이스로는 인덱싱하기 어려운 방식으로 이 의미와 가장 가까운 답변을 제공합니다. 애니메이션 버전 보기.
1. 벡터 스토어 (The vector store)
PostgreSQL이나 MySQL 같은 표준 관계형 데이터베이스는 **정확히 일치하는 매치(exact matches)**를 검색하도록 구축되었습니다: WHERE status = 'open'. 이들은 "저장된 벡터 중 어떤 것이 이것과 가장 가까운가?"라는 질문에 효율적으로 답할 방법이 없습니다. 그 작업에는 기하학(geometry)이 필요합니다. Milvus, Qdrant 또는 Pinecone 같은 **벡터 데이터베이스(vector database)**는 수백만 개의 임베딩을 저장하고 인덱싱하며, 이 질문에 효율적으로 답변하도록 설계되었습니다.
2. 근사 최근접 이웃 (Approximate nearest neighbour, ANN)
질문을 저장된 모든 벡터와 비교할 수는 있지만, 백만 개의 문서가 있는 경우 이는 너무 느립니다. 따라서 벡터 데이터베이스는 대신 인덱스를 구축합니다. HNSW (계층적 탐색 가능 스몰 월드, Hierarchical Navigable Small World)가 인기 있는 방법 중 하나입니다. 이 알고리즘은 벡터들을 계층화된 그래프(layered graph)로 연결하여, 검색이 거친 단계에서 시작해 답에 점점 더 가까워지며 이동하도록 합니다. 그 대가로 약간의 정확도를 포기하는 대신 엄청난 속도를 얻게 되므로, 이것이 '근사적(approximate)'이라고 불리는 이유입니다.
⚠️ [IMG:N] 형식 토큰은 이미지 placeholder 입니다. 번역하지 말고 원래 위치에 그대로 유지하세요.
다이어그램: 모든 벡터와 쿼리를 비교하는 것은 대규모 환경에서 너무 느립니다. HNSW(Hierarchical Navigable Small World) 같은 근사 최근접 이웃 인덱스(Approximate nearest neighbour indexes)는 계층적 그래프를 따라 이동하여 밀리초 단위로 유사한 매치를 찾아내며, 정확도를 약간 희생하는 대신 엄청난 속도를 얻습니다. 비교 횟수는 예시입니다. 애니메이션 버전 보기.
3. pgvector: 새로운 시스템이 필요하지 않음
만약 팀에서 이미 PostgreSQL을 사용하고 있고, 운영할 다른 데이터베이스를 원하지 않는다면, pgvector 확장은 벡터 컬럼 유형과 유사성 검색 기능을 추가합니다. 임베딩(embeddings)은 일반 관계형 데이터 바로 옆에 위치하므로, 하나의 쿼리로 고객별 필터링과 의미 기반 순위 지정이 가능합니다.
다이어그램: Milvus, Qdrant 또는 Pinecone 같은 전용 벡터 데이터베이스에 임베딩을 저장하거나, pgvector 확장을 통해 PostgreSQL의 일반 데이터 옆에 저장할 수 있으며, 소규모 실험을 위해서는 로컬 라이브러리를 사용할 수도 있습니다. 애니메이션 버전 보기.
다음은 완전한 pgvector 예시입니다. 세 자리 벡터는 내용을 짧게 유지하기 위한 것이며, 실제 임베딩은 수백 차원의 차원을 가지며, vector(3) 크기는 모델의 출력과 일치할 것입니다.
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE docs (
...
이것들을 조합하면 쿼리는 다음과 같이 작동합니다: 질문을 임베딩하여 벡터로 변환하고, 벡터 데이터베이스에 가장 가까운 벡터를 요청한 다음, 일치하는 단락들을 받아옵니다.
다이어그램: 질문은 임베딩 모델에 의해 벡터로 변환되고, 벡터 데이터베이스가 가장 가까운 저장된 벡터를 찾고, 일치하는 단락들이 근접도 순으로 반환됩니다. 애니메이션 버전 보기.
다음 내용
Day 13: 검색 증강 생성(Retrieval-Augmented Generation, RAG): 독점 문서와의 채팅.
#VectorDatabase #DataScience #DataArchitecture #BackendEngineering #AI
본 게시물은 애니메이션 다이어그램을 포함하고 있으며, [https://sureshpallapothu.in/blog/day-12-vector-databases]에서 최초 발행되었습니다.