이번엔 진행하는 프로젝트 중 AI 기술을 담당하시는 분이 Vector DB를 사용해보는건 어떠냐고 권유하셨다.
프로젝트에 적용할 기술이기 때문에 Vector DB가 무엇인지, 사용했을 때 이점은 무엇인지, 어떤 경우에 사용하는 것이 좋을지 등에 대해서 공부해야겠다고 생각해서 정리를 해보려고 한다.
우선 Vector DB에 대해서 공부하기 전에 벡터와 임베딩에 대해서 알아야 한다.
Vector
벡터는 다음과 같은 숫자의 리스트다.
[0.3512, 0.4837, 0.1996, ...]
이게 왜 벡터일까?
벡터
라고 하면 힘이나 속도같은 물리량을 보통 떠올리기 마련이지만, 사실 벡터는 좀 더 포괄적인 의미로 사용된다.
아래는 위키피디아에서 가져온 벡터의 정의이다.
In mathematics and physics,
vector is a term that refers colloquially to some quantities that cannot be expressed by a single number (a scalar),
or to elements of some vector spaces.
위키피디아에 따르면 단 하나의 숫자로 나타낼 수 없는 양을 벡터라고 한다.
기계학습 분야에서는 모델 학습을 위해서 사용하는 데이터나 가중치 혹은 모델의 결과값으로 나타나는 값들을 모두 벡터의 형태로 취급한다.
Embedding
임베딩은 정의에 따르면 "고차원의 데이터를 저차원으로 매핑하면서, 그 의미를 보존하는 것"이다.
차원이라는 건 뭘까? 차원이라는 개념도 벡터와 연관지어서 생각할 수 있다.
세 개의 값을 가지는 벡터는 3차원 벡터, N개의 값을 가지는 벡터는 N차원 벡터. 이런 식이다.
그러므로 "고차원의 데이터를 저차원으로 매핑한다"는 것은 높은 차원의 벡터를(가령 10000차원) 낮은 차원의 벡터로(가령 10차원) 변환한다는 뜻일 것이다.
의미를 보존한다는 건 무슨 뜻일까?
간단한 예시를 들어보자.
두 개의 64x64 사이즈의 고양이 이미지가 있다. 이미지의 크기는 64x64이므로 이 두 이미지는 흑백이라고 가정했을 때 4096차원의 벡터로 표현될 수 있을거다.
임베딩을 통해서 이 고차원의 벡터를 저차원의 벡터로 축소시킬 수 있고, 그 과정을 잘 조율한다면, 두 개체의 임베딩이 비슷할 때 그 개체가 근본적으로 비슷한 경향을 보이도록 할 수 있다.
즉, 차원은 축소되었지만 그 의미는 보존되는 것이다.
왜 굳이 임베딩을 해야할까?
이건 비교적 쉽게 답할 수 있다. 우선, 데이터가 너무 커서 저장할 때 효율적이지 않고 의미적인 '유사도'를 측정하기 어렵다는 문제가 있다. 두 번째로 숫자가 인공지능 모델이 아주 잘 다룰 수 있는 표현 형식이라 그렇다.
어떻게 저 많은 픽셀을 몇 개의 숫자로 표현하면서 의미가 보존될 수 있을까?
사실 저 많은 픽셀 중에 "고양이"라는 의미를 만드는 픽셀의 개수나 조합은 한정적이고, 전체 가능성 중 극히 일부분일 것이다. 이렇게 고차원의 데이터에서 "의미"를 가지는 정보는 극히 일부분이고, 이러한 의미를 잡아내는 어떠한 부분공간(Latent Manifold)이 존재한다는 가설을 Manifold 가설이라고 한다.
임베딩을 잘 사용하면 고차원의 데이터를 저차원으로 변환할 때 Latent Manifold를 따라 놓이도록 만들 수 있을 것이다.
임베딩을 통해서 글, 이미지나 동영상같은 비정형 데이터를 숫자로 표현할 수 있게 되었다.
이 숫자들간의 유사도를 비교하면, 임베딩하기 이전의 원본이 서로 비슷한 것들을 찾아낼 수 있을 것이다. 이렇게 입력 벡터로부터 가장 유사한 벡터를 찾아내는 접근을 Nearest Neighbor 라고 한다.
유사한 벡터를 찾아낼 때, 한 벡터가 다른 벡터와 얼마나 가까운지를 나타내는 metric은 다양한데, 그 중에 몇 개를 소개하면 다음과 같은 것들이 있다.
정보는 다양한 형태로 제공이 된다.
텍스트 문서, 리치 미디어, 오디오와 같이 비정형 정보도 있고 애플리케이션 로그, 테이블, 그래프와 같이 정형화된 정보도 있다. 임베딩은 모든 유형의 데이터를 자산의 의미와 컨텍스트를 캡처하는 벡터로 인코딩한다.
이를 통해 인접 데이터 포인트를 검색하여 유사한 자산을 찾을 수 있다.
벡터 데이터베이스는 벡터를 고차원 포인트로 저장하고 검색하는 기능을 제공한다. N차원 공간에서 가장 가까운 이웃을 효율적이고 빠르게 조회할 수 있는 추가적인 기능을 제공한다.
벡터 데이터베이스는 데이터 관리, 내결함성, 인증 및 액세스 제어, 쿼리 엔진과 같은 추가 기능을 제공한다.
결과적으로 "벡터" 데이터베이스는 일반적인 DB와 다르게 이런 벡터들을 저장하고 있다는 걸 알 수 있다.
벡터 데이터베이스는 일반적으로 시각적, 의미 체계, 다중 모달 검색과 같은 벡터 검색 사용 사례를 강화하는 데 사용된다.
최근에는 생성형 인공 지능(AI) 텍스트 모델과 결합하여 대화형 검색 경험을 제공하는 지능형 에이전트를 개발했다. 또한 생성형 AI 모델은 챗봇이 사실적이지는 않지만 믿을 수 있는 응답을 제공하는 것(AI 환각 현상)과 같이 사실 여부를 변별할 수 없도록 하는 것을 방지할 수 있다.
모델 내에서 k-NN(k-Nearest Neighbor) 인덱스는 벡터를 효율적으로 검색하고 코사인과 같은 거리 함수를 적용하여 유사성을 기준으로 결과의 순위를 매긴다.
벡터 데이터베이스가 기존 DB에 비해 가지는 장점들은 어떤 것들이 있을까?
장점
단점
출처
https://velog.io/@tura/vector-databases
https://aws.amazon.com/ko/what-is/vector-databases/