목차
벡터 데이터베이스는 의미의 거리로 검색하는 기억 장치다
벡터 데이터베이스는 세상을 값이 아니라 의미의 거리로 검색하기 위해 태어난 기억 장치다.
벡터 데이터베이스는 세상을 값이 아니라 의미의 거리로 검색하기 위해 태어난 기억 장치다.
- 벡터 데이터베이스는 같은 값을 찾는 대신, 가장 가까운 뜻을 찾는 장치다.
- 임베딩 모델은 뜻을 숫자로 번역하고, 벡터 데이터베이스는 그 숫자를 저장하고 검색한다.
- 실제 검색에서는 인덱스와 메타데이터가 함께 있어야 비로소 쓸모가 생긴다.
값이 아니라 의미
벡터 데이터베이스는 세상을 “값”이 아니라 “의미의 거리”로 검색하기 위해 태어난 기억 장치다.
- Ledger숫자와 규칙
누가 몇 살인지, 누가 어느 도시에 사는지, 누가 지난달에 얼마를 썼는지.
- Meaning뜻을 찾고 싶다
이 문장과 뜻이 비슷한 글, 이 질문과 의도가 비슷한 답변을 찾고 싶어 한다.
- Vector DB기억 장치
가장 가까운 의미의 이웃을 재빨리 찾아내는 장치다.
장부라고 생각하면 쉽다
인터넷 프로토콜을 사용하고, 컴퓨터를 사용하고, 핸드폰을 사용하는 우리에게 데이터베이스는 필수 요소로 자리 잡았다. 데이터베이스는 보통 숫자, 문자열, 날짜, 상태값 같은 명시적으로 정리된 정보다.
장부라고 생각하면 쉽다. 숫자가 있고, 날짜, 이름, 규칙들이 있으며 장부를 작성한 사람은 자랑스럽게 훑어보기도 한다. 누구는 몇 살인지, 누가 어느 도시에 사는지, 누가 지난달에 얼마를 썼는지. 복잡한 세상을 얌전하고 단정한 세상으로 만들어낸 것이다.
1+1=2이고, 3월은 3월인 것처럼.
하지만 인간은 장부처럼 질서에 머물기 싫어한다. 숫자, 이름만 찾는 것에 만족하지 않고, 이제는 의미를 찾고 싶어 한다.
“이 문장과 뜻이 비슷한 글을 찾아라.”
“이 그림과 분위기가 닮은 이미지를 찾아라.”
“이 질문과 의도가 비슷한 답변을 찾아라.”
이런 말을 들은 성실하고 근면한 하인인 데이터베이스가 얼마나 당황스러울까. 단어가 다르면 다른 것으로 여기고, 표면이 달라지면 남남으로 여긴다.
여기서 벡터라는 존재가 등장한다
여기서 벡터라는 존재가 등장한다.
벡터는 겉보기에 그저 숫자들의 긴 행렬이다.
0.12, -0.44, 0.91 등으로 숫자들이 줄줄이 늘어선다.
데이터베이스를 고집하던 사람들은 이걸 보며 비웃는다. “이 무의미한 숫자들이 어떻게 사람이 말하는 뜻을 품을 수 있다는 거야?”
아인슈타인의 상대성 이론처럼 아주 단순한 공식이 아직까지도 과학에 영향을 끼치듯, 가장 메마른 형식 속에 가장 기묘한 생명이 깃든다.
텍스트 한 줄, 이미지 한 장, 소리 한 조각이 현대적 연금술사인 신경망을 통과하면 더 이상 단순한 문장·그림이 아닌 의미의 좌표가 된다. 즉, 벡터가 되는 것이다.[1]
“고양이가 소파에서 자고 있다.”
“소파 위에 잠든 고양이.”
표면만 보면 둘이 다르다고 말할 것이다. 자세히 해체하면 한 마리 고양이, 한 장의 소파, 잠. 동일한 사건을 드러낸다. 여기서 임베딩 모델이 등장한다. 나중에 자세히 다룰 것이지만, 이것은 의미의 친족 관계를 숫자 속으로 옮겨 적는다. 그래서 의미가 가까운 것들은 벡터 공간 안에서도 서로 가까이 놓인다. 이거야말로 언어라는 피부를 벗겨 뜻의 뼈대를 드러내는 일이다.
벡터 공간이란 무엇일까
벡터 공간이란 무엇일까. 이건 수학 강의실에서나 쓰일 법한 딱딱한 표현처럼 들리지만, 실은 아주 간단하다. 사물, 문장, 이미지, 생각 등을 숫자의 좌표로 놓아둘 수 있는 보이지 않는 지도다.
예를 들어 초등학교 때 배운 2차원 좌표평면을 떠올려보자.
점 A는 (1, 3), 점 B는 (2, 5), 점 C는 (9, 1).
이렇게 놓이면 A와 B는 서로 가깝고, A와 C는 멀다. 벡터 공간도 똑같은 원리다. 다만 차이가 있다면, 현실에서 AI는 2차원, 3차원이 아니라 수백 차원, 수천 차원인 경우가 많다는 것이다.
거리는 이렇게 다룰 수 있다. 두 벡터 사이의 거리, 각도, 방향 유사성 같은 걸 계산해 가까운지 판단한다. 우리가 말하는 “뜻이 비슷하다, 맥락이 비슷하다”는 말은 “벡터 좌표상 가까이 있다”는 뜻으로 바뀐다.[2]
“고양이가 소파에서 잔다”라는 문장이 있다.
이것을 임베딩으로 변환하면 [0.12, -0.48, 0.91, ...]
여기서 문장 하나의 숫자 배열이 곧 벡터다. 그리고 이 벡터는 벡터 공간 안의 한 점의 좌표라고 보면 된다.
벡터 데이터베이스란 무엇일까
여기까지 이해했다면 이 질문에 대답하는 것도 쉬울 수 있다. 벡터 데이터베이스란 무엇일까? 벡터 데이터베이스는 의미를 숫자로 바꿔 놓은 좌표들을 질서 있게 보관하고, 새로운 질문이 들어왔을 때 가장 가까운 의미의 이웃을 재빨리 찾아내는 장치다.[3]
세상에는 종종 이것과 저것을 혼동하는 사람이 있다. 마찬가지로 임베딩 모델과 벡터 데이터베이스 개념도 사람들의 머릿속에서 자주 뒤엉키는 요소 중 하나다.
왜 하나하나 비교하면 안 되나
자신이 천재라고 칭하는 사람들, 자신의 똑똑함에 희열을 느끼는 사람들은 이런 질문도 한다. “벡터 몇 개 저장해 두고, 들어온 질문과 하나하나 비교하면 되지 않나?” 소박하고도 정직한 생각이다.
소량의 데이터는 실제로 가능하다. 문서 몇천 개쯤은 모두 꺼내서 줄 세운 다음, 새 벡터와 하나씩 악수시켜 보면 된다. 그럼 누가 가장 친한 친구인지 금방 드러난다. 그러나 문서가 수십만, 수백만, 수천만으로 불어나면 사정이 달라진다. 모든 벡터를 매번 전부 비교하는 건 도서관 전체를 뒤져 단 한 권의 책을 찾겠다고 사서, 학생, 지나가던 철학자도 모두 서가에 매달리게 하는 일과 다르지 않다. 이 무질서를 견디기 위해 등장하는 것이 바로 인덱스다. 인덱스는 도서관의 거대한 책들 속에서 찾고자 하는 책의 위치를 보여주는 지도다.[5]
이제 핵심이다
여기까지 읽은 자칭 현자들은 당장 벡터랑 임베딩 모델을 구축하고 사용하고 싶어 할지 모르겠지만, 참아야 한다. 세상 모든 검색은 단순한 유사성 하나로 끝나지 않기 때문이다. 어떤 회사 문서를 찾는다고 해보자. 사용자는 단지 의미가 비슷한 문서만 원하지 않는다. “올해 작성된 것”, “내 권한으로 볼 수 있는 것”, “인사팀 문서만” 등의 조건을 함께 원하게 된다.
벡터 데이터베이스는 단순히 유행하는 저장 기술이 아니다. 이것은 무엇을 데이터로 볼 것인가에 대한 관점의 변화이고 더 나아가 무엇을 검색이라고 부를 것인가에 대한 혁명이다.
엑셀에게 “같은 값인가?”를 묻는다. 벡터 데이터베이스는 “가까운 뜻인가?”를 묻는다. 전자는 장부의 질서 위에 서 있고, 후자는 의미의 공간 위에 서 있다.
사람의 대화를 분석한다면 우리는 상대의 단어도 듣고, 의도도 읽는다. 검색도 그렇게 변화하고 있다.
그래서 벡터 데이터베이스란 이런 것이다
그렇기에 벡터 데이터베이스는 오늘날 AI 시스템의 심장 가까이에 놓인다. RAG에서 문서를 찾을 때, 추천 시스템이 취향의 이웃을 찾을 때, 이미지 검색이 닮은 장면을 찾을 때, 개인의 제2의 뇌가 오래된 기록 속에서 지금의 질문과 통하는 조각을 끌어올릴 때. 이 배후에는 언제나 벡터 검색의 층이 있다.[7] 이제 세상은 더 이상 정보만 저장하길 원하지 않는다. 세상은 맥락을 되찾고 싶어 한다. 벡터 데이터베이스가 이 소망에 대한 기술적 응답이다.
그래서 벡터 데이터베이스란 이런 것이다. 텍스트, 이미지, 소리, 기억, 행동 같은 복잡한 대상을 의미의 좌표로 바꾸어 보관하고, 새로 들어온 질문과 가장 가까운 좌표를 찾아내며, 그 과정에 필터링과 조건, 운영의 질서를 부여하는 시스템이다.
너무 어렵다고? 그럼 이렇게 바꿔보자. 벡터 데이터베이스는 세상을 “값”이 아니라 “의미의 거리”로 검색하기 위해 태어난 기억 장치다.
인용
Qdrant Docs, “Vectors,” 벡터는 객체 간 similarity를 정의하며, 보통 neural network가 객체를 fixed-size vector로 변환한다고 설명. Reimers & Gurevych, “Sentence-BERT,” EMNLP 2019, sentence embedding을 cosine similarity로 비교 가능한 semantically meaningful representation으로 제시. Qdrant ↩
LanceDB Docs, “Vector Search,”
l2,cosine,dot,hamming등 distance metric을 지원하며 embedding model이 학습된 metric과 일치시키라고 권고. pgvector README 역시 L2, inner product, cosine distance, L1, Hamming, Jaccard를 지원. LanceDB / pgvector ↩LanceDB Docs, “Vector Search,” raw data(text, image, audio 등)를 embedding으로 변환해 vector database에 저장하고 similarity search를 수행한다고 설명. Qdrant Docs, “Concepts” 및 “Vectors,” vector search를 vector space에서의 similarity search로 정의. LanceDB / Qdrant Concepts / Qdrant Vectors ↩
Pinecone Docs, overview, integrated embedding과 bring-your-own-vectors workflow를 분리해 설명하며, embedding 생성 단계와 vector storage/search 단계를 구분. LanceDB Docs, “Vector Search,” embedding model이 원시 데이터를 embedding으로 바꾸고, vector DB가 이를 저장·검색한다고 설명. Pinecone / LanceDB ↩
LanceDB Docs, brute-force search는 모든 벡터를 비교하는 exact kNN이며, 데이터가 커질수록 latency가 선형적으로 증가한다고 설명. pgvector README, exact nearest neighbor search와 approximate nearest neighbor search(HNSW, IVFFlat)를 모두 지원한다고 설명. Malkov & Yashunin, “Efficient and Robust Approximate Nearest Neighbor Search Using Hierarchical Navigable Small World Graphs,” IEEE TPAMI, 2020. LanceDB / pgvector / HNSW ↩
Qdrant Docs, “Concepts” 및 “Payload,” point는 vector와 optional payload로 이루어진 record이며, payload는 JSON 형태의 추가 정보를 저장하고 filtering에 활용할 수 있다고 설명. pgvector README는 approximate index에서 filtering이 index scan 이후 적용될 수 있다고 설명. Qdrant Concepts / pgvector ↩
Lewis et al., “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks,” NeurIPS 2020 / arXiv 2005.11401. RAG를 pre-trained parametric memory와 dense vector index 기반 non-parametric memory를 결합한 구조로 설명. arXiv ↩
다음으로 읽을 글
관련된 글도 함께 읽어보세요.