호돌찌의 AI 연구소
article thumbnail

올해 상반기 AI sector에서 핫한 토픽은 AI를 보다 일반인들에게 쉽게, 친숙하게 접근할 수 있는 ChatGPT였습니다. 여기서 같이 수혜주로 받은 것은 Vector Database 분야입니다. 이미 Faiss, Redis, ScaNN 기존 Vector Database 도 있었지만 작년 중순부터 스멀스멀 이야기가 나오던 Pinecone, Chroma, Weaviate, Qdrant 등 새로운 Vector Database가 나타나고 있습니다.

심지어 새롭게 뜨고 있는 Vector Database들에 대해서는 투자 금액이 쏠리고 있습니다. 참고로 Chief AI Officer의 트위터에서 4월 말 기준 투자 금액 기준으로 Top tools를 소개하면 다음과 같습니다. 

 

 

왜 이렇게 갑자기 많은 Vector 관련 Database들이 AI sector에서 화두가 되고 있을까요? 이번 글에서는 그 배경과 필요성을 한번 짚고 넘어가 보고자 합니다.

 

효율적인 데이터 저장 및 관리, 속도


첫째로 꼽은 것은 비정형데이터저장하고 관리하는 것, 그리고 속도의 이점입니다. 이미 전 세계의 데이터가 8~9할 이상이 비정형 데이터인데, 이에 대한 정보를 축약하는 기술인 임베딩한 값들은 기존 Traditional 한 DB. 즉, 관계형 DB 형태로 적재하기 어렵습니다. 하지만 Vector Database는 데이터 관리, 메타데이터 저장 및 필터링을 용이하게 하며 높은 확장성, 백업 및 수집, 실시간 업데이트 등 다양한 방면으로 활용이 가능합니다. 

제일 이해하기 쉬운 형태로 여러 Vector DB들 중 chroma db에서 적재되는 형태는 다음과 같이 적재되며 검색하는 형태 예시코드 입니다. (전체 코드는 여기 참고)

 

# collection에 임베딩값과, 메타정보, 인덱스들이 저장된다.
collection.add(
    embeddings=[
        [1.1, 2.3, 3.2],
        [4.5, 6.9, 4.4],
        [1.1, 2.3, 3.2],
        [4.5, 6.9, 4.4],
        [1.1, 2.3, 3.2],
        [4.5, 6.9, 4.4],
        [1.1, 2.3, 3.2],
        [4.5, 6.9, 4.4],
    ],
    metadatas=[
        {"uri": "img1.png", "style": "style1"},
        {"uri": "img2.png", "style": "style2"},
        {"uri": "img3.png", "style": "style1"},
        {"uri": "img4.png", "style": "style1"},
        {"uri": "img5.png", "style": "style1"},
        {"uri": "img6.png", "style": "style1"},
        {"uri": "img7.png", "style": "style1"},
        {"uri": "img8.png", "style": "style1"},
    ],
    documents=["doc1", "doc2", "doc3", "doc4", "doc5", "doc6", "doc7", "doc8"],
    ids=["id1", "id2", "id3", "id4", "id5", "id6", "id7", "id8"],
)

# vectordb 내부에서 inference할 임베딩값과 유사한 top n의 값을 정하면 결과를 얻을 수 있다.
query_result = collection.query(
        query_embeddings=[[1.1, 2.3, 3.2], [5.1, 4.3, 2.2]],
        n_results=2,
    )

print(query_result)

 

개인적으로 속도 부분이 제일 궁금하여, 자체적으로 실험을 했을 때 내용을 공유하면 다음과 같습니다. 설치가 제일 쉬운 Chroma를 기준으로 선정하였습니다.

  1. vector DB를 쓰는 경우는 Chroma DB를 활용(To-Be 방법)하고, 쓰지 않는 경우(As-Is 방법)는 그냥 python 자체에서 활용한다.
  2. 15만 개의 텍스트를 따로 준비하고 huggingface에서 특정 sts 모델(snunlp/KR-SBERT-V40K-klueNLI-augSTS)을 활용하여 sbert를 적용한다.
  3. 2번에서 뽑혀 나온 768차원 임베딩 벡터들을 Chroma DB에 add 시킨다. 그리고 위 코드와 같이 collection.query() 를 활용하여 시간을 측정한다.(To-Be)
  4. python 자체에서 활용하는 방법은 sbert의 공식 document에서 제시하는 Semantic Search 코드와 유사하게 검색한다. (As-Is)

시간 측정은 동일한 코드를 10,000번 수행하여 소요된 시간의 표본 평균입니다. 결과는 7배 정도 차이가 났습니다. 

 

 

 

Large Language Model과의 결합


두 번째 필요성은 LLM과의 결합했을 때입니다. Static 한 Large Language Model(LLM)에 대한 단점은 무거움이나 재학습, 서빙 등 다양한 허들 요소들이 있겠지만 일반인들도 ChatGPT를 좀 써봤다고 생각했을 때 경험해 본 '환각(hallucination)' 현상입니다. 일반인들에게 '환각' 현상이 뭐예요?라고 물어본다면, LLM이 자존심이 너무 세서 모르는 것에 모른다고 답하지 않고, 그럴싸하게 자연어를 생성해서 대답한다고 예를 드시면 됩니다.

 

(좌) https://www.chosun.com/national/weekend/2023/03/04/HR457QM36JFTXDUVAMMNG23MHQ/ (우) 필자가 테스트

 

 또한 ChatGPT API를 써보신 분들은 다양한 Parameter들을 마주하게 되는데, 이때 답변의 랜덤성을 담당하는 temperature 값을 0으로 설정하여 LLM이 동일한 응답을 제공하려고 합니다. 하지만 이 부분은 일관성과 관련된 부분을 관장하고 담당하지만 답변의 결과는 신뢰도까지 직결되지 않습니다.

그래서 이를 해결하기 위해서 임베딩 모델 한 번만 태우고, 이를 적재하고 빠르게 읽어오기 위해 Vector Database를 활용합니다. (아래 그림을 langchain과  Vector Database를 결합한 예시입니다)

 

 

 

이를 통해 knowledge에 적재된 Vector Database 부분만을 참고하여 원하는 범주 내에서 질의응답이나 활용을 할 수 있습니다. 이런 방법을 이용하면 환각에 대한 부분을 어느 정도 막을 수 있습니다. 여기서 프롬프트를 고정하고 내가 어떤 Vector Database를 쓰느냐에 따라서 시간 차이가 엄청나게 납니다. (이 부분은 또 다른 콘텐츠에 작성해 보겠습니다)

 

다양한 분야 & 세부 Task에서 활용


마지막 필요성은 이미 많은 분야에서 사용이 되고 있다는 점입니다. 우선 모델에서 만든 임베딩한 고차원의 vector (dense하든 sparse하든 이 부분은 무관합니다) 들은 이미 많은 세부 task에서 활용되고 있다는 점입니다. 사용분야의 예시로는 semantic search, QA, 이상탐지, image 검색, 추천시스템 등에 적용을 하고 있습니다. 

실제로 이를 product 단에서 사용하고 이를 공유하는 국내 글은 아직까지는 많이 없는 것 같습니다. 아래 글은 추천시스템에서 실제로 활용하고 있는 글입니다. 한번 참고해 보시면 좋겠습니다.

Reference : 

- 컨텐츠 기반 필터링 구축기: MiniLM, ScaNN 그리고 TFServing

- 그 많던 벡터는 다 어디로 갔을까? Milvus 활용기

 


이번 글에서는 Vector Database에 대한 필요성을 점검해 보았습니다. Claypot AIChip Huyen(Stanford, NVIDIA 출신)의 "Building LLM applications for production" 의 글에서 이 분이 다음과 같은 표현을 했습니다.

 

"If 2021 was the year of graph databases, 2023 is the year of vector databases."

 

저는 이런 확신에 차는 한마디는 무조건 한번은 경계를 하는 편인데, 저는 이 확신을 뼈저리게 느끼고 있기 때문에 매우 공감합니다. 다음 글에는 Vector Database에서 어떤 종류들이 있고 간단하게 비교해 보겠습니다. 

2023.07.24 - [AI/Vector Database] - [Vector DB] 2. Vector Database 종류 & 한계점

 

[Vector DB] 2. Vector Database 종류 & 한계점

이전 글에서는 Vector DB가 떠오르고 있는 배경과 왜 필요한지에 대해 글을 작성하였습니다. 2023.06.10 - [AI/Vector Database] - [Vector DB] 1. Vector Database 배경 & 필요성 [Vector DB] 1. Vector Database 배경 & 필요성

hotorch.tistory.com

 

Vector DB Feature Matrix

https://docs.google.com/spreadsheets/d/170HErOyOkLDjQfy3TJ6a3XXXM1rHvw_779Sit-KT7uc/edit#gid=0

 

 Milvus 관련 글

2023.10.10 - [AI/Vector Database] - [Vector DB] 3. Milvus 튜토리얼 (1) - 설치, 변수 정의, Collection 생성하기

2023.10.12 - [AI/Vector Database] - [Vector DB] 4. Milvus 튜토리얼 (2) - Collection에 데이터 insert 하기

2023.10.13 - [AI/Vector Database] - [Vector DB] 5. Milvus 튜토리얼 (3) - Query 임베딩 생성 & Vector DB 검색하기

2023.10.19 - [AI/Vector Database] - [Vector DB] 6. Milvus 튜토리얼 (4) - Collection에 데이터 Upsert 하기

 


아래는 블로그 주인장의 토스 익명 후원 링크입니다. 글이 도움 되거나 흡족스러웠다면 후원해 주시면 감사하겠습니다.

https://toss.me/hotorch

 

hotorch님에게 보내주세요

토스아이디로 안전하게 익명 송금하세요.

toss.me

 

 

profile

호돌찌의 AI 연구소

@hotorch's AI Labs

포스팅이 도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!