Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

디지안의 개발일지

VectorDB에 대하여 본문

etc

VectorDB에 대하여

안덕기 2024. 6. 19. 20:53

VectorDB

백터데이터베이스란 무엇인가?

우리가 사용하는 일반적인 데이터베이스는 찾고자하는 데이터를 정확하게 찾으려고 한다. 예를 들어, 사람이라는 집합 안에서 나이가 20살인 남성을 찾는다고 하면 정확하게 그 특징을 가지고 있는 사람 집합을 찾게 마련이다. 하지만 벡터데이터베이스는 정확하게 어떤 집합을 찾는 것이 아니라 유사한 집합을 찾는 것이 특징이다.

그렇다면 왜 그런 것이 필요하고 어떻게 동작하는지 궁금할거다. 한번 알아보도록 하자.

벡터

데이터베이스는 너무나 잘 알고 있지만 벡터라는 단어는 이제는 익숙하지 않는 단어다. 벡터는 수학과 물리학에서 크기와 방향을 가진 것을 의미한다. 데이터를 단순하게 어떤 수(컴퓨터에서는 String, Number, Array로 생각하자)로 표현할 수 없는 경우 방향을 추가하여 데이터를 2가지로 표현하는 것을 의미한다.

벡터데이터베이스에는 다양한 값이 벡터로 저장될 수 있다.

  • 문장, 사진, 음악등등

이 데이터들을 벡터데이터베이스에 저장할 때 임베딩 모델을 통해서 저장하게된다. 텍스트를 벡터로 변환하는데 이 벡터는 우리가 만드는 것이 아니다. 텍스트를 벡터로 만들기 위한 여러가지 임베딩 모델이 존재하고 주요 임베딩 모델들은 다음과 같다.

  • BERT (Bidirectional Encoder Representations from Transformers)
  • Word2Vec
  • FastText
  • GPT (Generative Pre-trained Transformer)
  • Sentence-BERT (SBERT)

데이터 저장

위에 언급한 것처럼 일단 저장하고자 하는 데이터를 벡터화(임베딩)하는 과정이 필요하다. 예를 들어, 벡터 DB에 안녕하세요. 오늘은 금요일입니다. 라는 문장을 저장한다고 해보자.

  1. 토크나이제이션 : 문장을 단어 또는 토큰으로 분리한다.
["안녕하세요", ".", "오늘은", "금요일", "입니다", "."]
  1. 임베딩: 각 토큰을 고차원 벡터로 변환한다. 이때 각 고차원 벡터의 값들은 방향을 의미하고 실제 크기는 L2 노름 이라는 것을 통해 구할 수 있다. 사실 실제 데이터는 메타데이터로 저장이 되고 VectorDB는 인덱싱하는 전략에 해당할 수 있다. 그래서 지금 이 수치화하는 과정은 쿼리할 때를 위한 과정이라고 볼 수 있다.
[0.1369,  0.2361, -0.3214, ... 0.3487, -0.1225, 0.1284] X 토큰 갯수
  1. 문장 벡터 생성 : 각 단어 벡터를 평균하거나 특정 방식으로 결합하여 문장 전체의 벡터를 생성한다.
[0.1369,  0.2361, -0.3214, ... 0.3487, -0.1225, 0.1284]

위와 같이 텍스트를 배열로 변환하는 과정을 통해 고차원 벡터로 변환한다는 개념을 가지고 데이터를 저장한다. 그리고 실제 값은 메타데이터로 별도로 저장해놓는다.

쿼리

쿼리를 하는 과정도 마찬가지다. 내가 검색하고자하는 문장을 위와 같이 1~3번 과정을 거치게 되고 이를 통해 문장 벡터를 생성한다. 문장 벡터를 생성한 이후에 유사도를 어떻게 측정하냐가 중요해지는데 이에 대해서 알아보자.

코사인 유사도 (Cosine Similarity)

코사인 유사도는 두 벡터 사이의 코사인 각도를 계산하여 유사성을 측정하는 방법이다. 값의 범위는 -1에서 1 사이이며, 1에 가까울수록 두 벡터가 유사함을 의미한다.

유클리드 거리 (Euclidean Distance)

유클리드 거리는 두 벡터 간의 직선 거리를 계산하는 방법이다. 값이 작을수록 두 벡터가 더 가깝고, 유사함을 의미한다.

맨해튼 거리 (Manhattan Distance)

맨해튼 거리는 두 벡터 간의 각 차원에서의 절대 거리의 합을 계산한다. 값이 작을수록 두 벡터가 더 가깝고, 유사함을 의미한다.

점곱 (Dot Product)

점곱은 두 벡터 간의 곱을 계산하여 유사성을 측정하는 방법이다. 값이 클수록 두 벡터가 더 유사함을 의미한다.

민코프스키 거리 (Minkowski Distance)

민코프스키 거리는 유클리드 거리와 맨해튼 거리의 일반화된 형태다. 파라미터 ppp를 통해 다양한 거리 측정 방법을 적용할 수 있다. p=2p = 2p=2일 때 유클리드 거리, p=1p = 1p=1일 때 맨해튼 거리와 같다.

 

이런저런 이야기를 적어놨지만 내가 저장하고 찾고자 하는 것에 어떤 알고리즘이 적합할지는 이론적으로 설명하기 매우매우 어려워보인다. 그래서 결과가 어떻게 나올지 모르기 때문에 어떤 알고리즘을 사용할지는 직접 사용해보면서 어떤게 좋은 결과를 나오게 하는지는 테스트 해봐야할거 같다. 실제로는 주로 코사인 유사도 방식을 사용한다고 한다.



참고자료

https://www.mongodb.com/ko-kr/resources/basics/vector-databases

https://en.wikipedia.org/wiki/Vector_(mathematics_and_physics)

https://discuss.pytorch.kr/t/gn-embeddings/2757

https://chat.openai.com/