벡터 데이터베이스가 AI 애플리케이션에서 비정형 데이터 검색을 혁신하는 방법
벡터 데이터베이스는 AI 애플리케이션 내 비정형 데이터 검색을 혁신하는 데 중요한 역할을 하게 되었습니다. 널리 인정받는 역할 중 하나는 검색 증강 생성(RAG)으로, 관련 문서를 LLM과 연결하는 프로세스입니다. 그러나 그 응용 분야와 역량은 RAG를 훨씬 넘어섭니다. 텍스트, 이미지, 오디오, 분자, 그래프처럼 사전 정의된 데이터 모델을 따르지 않는 모든 유형의 데이터, 즉 다양한 종류의 비정형 데이터에 더 폭넓게 적용될 수 있습니다.
최근 Brazil Unstructured Data Meetup에서 Zilliz의 인공지능 및 머신러닝 책임자인 Frank Liu가 벡터 데이터베이스가 AI 애플리케이션에서 비정형 데이터 검색의 지형을 어떻게 변화시키고 있는지에 대해 발표했습니다. 그의 인사이트는 이러한 데이터베이스의 광범위하고 영향력 있는 역량을 조명했습니다.
Frank의 meetup 발표 다시보기 데모 따라 해보기
벡터란 무엇인가요?
벡터 데이터베이스와 AI 애플리케이션에서의 역할을 다루기 전에, 벡터가 벡터 데이터베이스의 구성 요소이므로 벡터가 무엇인지 이해하는 것이 중요합니다. 벡터는 컴퓨터가 처리할 수 있는 방식으로 정보를 인코딩하는 숫자의 목록입니다. 아래에 표시된 것과 같은 이미지가 있다고 상상해 보세요:
그림 1- 벡터 형식으로 표현된 이미지
여러분에게는 아름다운 꽃이지만, 컴퓨터에게 이 이미지는 이해할 수 있는 형식으로 변환되어야 합니다. 이때 벡터 임베딩이 중요한 역할을 합니다.
위 꽃 이미지는 구조화된 숫자 배열인 벡터 임베딩으로 변환됩니다. 벡터의 각 숫자는 색상, 질감, 형태와 같은 이미지의 특정 특징을 나타냅니다. 이러한 숫자들의 조합은 컴퓨터가 유사한 이미지 검색, 객체 분류, 심지어 새로운 이미지 생성과 같은 다양한 작업에 사용할 수 있는 간결하고 효율적인 이미지 표현을 제공합니다. 다음은 벡터 임베딩이 생성되고 Milvus와 같은 벡터 데이터베이스에 저장되는 과정을 시각화한 것입니다.
그림 2- 벡터 임베딩 생성 및 저장 프로세스
이 프로세스는 다양한 유형의 데이터를 포함하는 지식 베이스에서 시작됩니다. 그런 다음 데이터는 임베딩 모델에 의해 처리되어 벡터로 변환됩니다. 마지막으로 벡터는 검색을 위해 준비된 상태로 Milvus와 같은 벡터 데이터베이스에 저장됩니다.
데이터 임베딩은 이미지에만 국한되지 않습니다. 텍스트, 오디오, 그리고 분자와 그래프 같은 더 복잡한 데이터 유형도 벡터 임베딩으로 변환될 수 있습니다. 데이터를 벡터로 표현함으로써 우리는 벡터 데이터베이스의 힘을 활용해 효율적이고 정확한 검색을 수행할 수 있습니다.
벡터 데이터베이스가 다양한 분야에서 어떻게 활용되고 있는지 살펴보겠습니다.
벡터 데이터베이스로 구동되는 다양한 사용 사례
벡터 데이터베이스는 수많은 애플리케이션 전반에서 비정형 데이터를 처리하고 검색하는 방식을 변화시키고 있습니다. AI 시스템의 역량 강화부터 더 효과적인 추천 제공까지, 그 가능성은 방대하고 영향력이 큽니다. 벡터 데이터베이스로 구동되는 몇 가지 구체적인 사용 사례를 살펴보겠습니다.
검색 증강 생성(RAG)
벡터 데이터베이스는 관련 정보를 더 효율적이고 의미적으로 유의미하게 검색할 수 있게 함으로써 RAG를 변화시키고 있습니다. 전통적인 키워드 기반 검색 방법은 복잡한 쿼리나 미묘한 맥락을 다룰 때 종종 한계를 보입니다. 벡터 데이터베이스는 정확한 일치가 아니라 의미적 유사성을 기반으로 데이터를 저장하고 검색함으로써 이러한 한계를 해결합니다.
RAG에서는 문서가 그 의미론적 의미를 포착하는 고차원 벡터로 변환됩니다. 쿼리가 수신되면 그것도 벡터로 변환되며, 벡터 데이터베이스는 의미적으로 가장 유사한 문서를 빠르게 찾아냅니다. 이 접근 방식은 더 정교하고 문맥을 인식하는 정보 검색을 가능하게 하며, 이는 정확하고 관련성 높은 응답을 생성하는 데 매우 중요합니다.
기술 회사의 고객 지원 챗봇을 생각해 보세요. 사용자가 "켜지지 않는 기기를 어떻게 문제 해결하나요?"라고 묻는 경우, 벡터 데이터베이스는 해당 정확한 단어가 포함되어 있지 않더라도 관련 문서를 검색할 수 있습니다. 전원 문제, 배터리 문제, 일반적인 문제 해결 단계에 대한 정보를 가져올 수 있습니다. 그러면 LLM은 이 검색된 정보를 사용해 포괄적이고 문맥적으로 관련성 있는 응답을 생성하여 고객 지원의 품질을 크게 향상시킵니다.
추천 시스템
벡터 데이터베이스는 더 정교하고 효율적인 유사도 계산을 가능하게 함으로써 추천 시스템에 혁신을 일으키고 있습니다. 기존 추천 시스템은 종종 "콜드 스타트" 문제로 어려움을 겪으며, 대규모 데이터셋을 다룰 때 계산 비용이 많이 들 수 있습니다. 벡터 데이터베이스는 고차원 공간에서 빠른 근사 최근접 이웃 검색을 가능하게 하여 이러한 문제를 해결합니다.
벡터 데이터베이스 기반 추천 시스템에서는 사용자와 아이템 모두 공유 임베딩 공간의 벡터로 표현됩니다. 이러한 임베딩은 복잡한 특징과 선호도를 포착하여 더 정교한 추천을 가능하게 합니다. 벡터 데이터베이스는 유사한 사용자나 아이템을 빠르게 찾아낼 수 있어, 방대한 데이터셋에서도 실시간 개인화를 가능하게 합니다.
예를 들어, Spotify와 같은 음악 스트리밍 서비스는 추천 엔진을 구동하기 위해 벡터 데이터베이스를 사용합니다. 각 곡은 장르, 템포, 분위기, 청취 패턴과 같은 다양한 속성을 포착하는 벡터로 표현됩니다. 사용자 선호도 역시 벡터로 인코딩됩니다. 사용자가 새로운 곡을 들을 때, 시스템은 벡터 공간에서 유사한 곡을 빠르게 찾아낼 수 있어, 익숙하지 않은 아티스트나 장르의 곡이라도 사용자의 취향에 맞는 새로운 음악을 발견할 수 있게 합니다.
분자 유사도 검색
벡터 데이터베이스는 유사한 화합물을 더 효율적이고 정확하게 식별할 수 있게 함으로써 신약 개발에서 분자 유사도 검색을 변화시키고 있습니다. 기존 방법은 종종 2D 구조 유사도에 의존하며, 이는 중요한 3D 입체구조 유사성이나 작용기 관계를 놓칠 수 있습니다.
벡터 데이터베이스를 사용하면 분자의 이미지는 복잡한 구조적 및 화학적 특성을 포착하는 고차원 벡터로 표현됩니다. 이를 통해 연구자들은 2D 구조가 달라 보이더라도 유사한 특성이나 잠재적 생물학적 활성을 가진 분자를 검색할 수 있습니다. 벡터 데이터베이스의 속도는 방대한 화학 라이브러리의 신속한 스크리닝도 가능하게 합니다.
새로운 항생제 후보를 찾고 있는 제약 회사의 예를 들어 보겠습니다. 그들은 효과는 좋지만 심각한 부작용이 있는 알려진 항생제 분자를 가지고 있습니다. 벡터 데이터베이스를 사용하면 수백만 개의 화합물을 빠르게 검색하여 유사한 항균 특성을 가지면서도 잠재적으로 다른 부작용 프로필을 가진 분자를 찾을 수 있습니다. 벡터 표현은 전하 분포, 잠재적 결합 부위, 3D 형태와 같은 특징을 포착할 수 있어, 기존의 2D 유사도 검색으로는 놓칠 수 있는 구조적으로 다양하지만 기능적으로 유사한 분자의 발견을 가능하게 합니다.
멀티모달 유사도 검색
벡터 데이터베이스는 다양한 유형의 데이터(텍스트, 이미지, 오디오 등)를 표현하고 검색하는 통합된 방법을 제공함으로써 멀티모달 검색에 혁신을 일으키고 있습니다. 기존 검색 시스템은 종종 교차 모달 쿼리나 서로 다른 데이터 유형 간의 관계를 찾는 데 어려움을 겪습니다.
벡터 데이터베이스 기반 멀티모달 시스템에서는 모든 데이터 유형이 공유 고차원 공간으로 투영되어 원래 데이터 유형과 관계없이 유사도를 계산할 수 있습니다. 이를 통해 더 유연하고 강력한 검색 기능이 가능해지며, 서로 다른 모달리티 전반에서 관련 콘텐츠를 찾을 수 있습니다.
예를 들어, 한 이커머스 플랫폼이 벡터 데이터베이스를 사용하여 멀티모달 검색 시스템을 구현합니다. 사용자는 마음에 드는 가구의 이미지를 업로드하고 원하는 색상과 소재에 대한 텍스트 설명을 제공할 수 있습니다. 시스템은 이미지와 텍스트를 모두 공유 공간의 벡터로 변환합니다. 그런 다음 벡터 데이터베이스를 검색하여 이미지의 시각적 스타일과 텍스트 설명의 특정 속성을 모두 만족하는 제품을 찾습니다. 이를 통해 사용자는 원하는 것을 말로만 완전히 표현하지 못하더라도 정확히 찾을 수 있어 쇼핑 경험이 크게 향상됩니다.
이것들은 벡터 데이터베이스로 혁신되고 있는 사용 사례 중 일부에 불과합니다. Frank는 더 많은 사용 사례가 담긴 다음 슬라이드를 공유했습니다.
Fig 3- 벡터 데이터베이스 사용 사례
위 목록이 전부는 아닙니다. 이는 벡터 데이터베이스를 통해 AI 애플리케이션에서 데이터 검색을 향상할 때 무엇이 가능한지를 보여주는 하나의 예시일 뿐입니다.
이제 다양한 분야에서 벡터 데이터베이스의 중요성을 이해했으니, 실제로 어떻게 동작하는지 볼 수 있도록 사용 사례 중 하나를 구현해 보겠습니다. GitHub 스타 수 기준으로 가장 인기 있는 벡터 데이터베이스인 Milvus를 활용하겠습니다.
Milvus, Radient, ImageBind, Meta-Chameleon-7b를 사용한 멀티모달 유사도 검색 시스템 구현
위 도구들을 사용하여 멀티모달 유사도 검색 시스템을 구현하려면, 환경에 해당 도구들을 설치하고 가져와야 합니다.
환경 설정
필요한 라이브러리를 설치하고 필요한 모델을 다운로드하는 것부터 시작합니다.
!pip install -U radient
!pip install -U yt-dlp
!pip install pymilvus
!pip install -U git+https://github.com/facebookresearch/chameleon.git@main
!git clone https://huggingface.co/eastwind/meta-chameleon-7b
!yt-dlp "https://www.youtube.com/watch?v=wwk1QIDswcQ" -o ~/google_io_preshow.mp4
!pip install git+https://github.com/fzliu/ImageBind@main
위 각 라이브러리가 하는 일은 다음과 같습니다:
Radient: 멀티모달 데이터를 처리하고 분석하기 위한 워크플로를 생성 및 실행하며, 다양한 데이터 처리 단계를 통합합니다.
yt-dlp: YouTube에서 동영상을 다운로드하기 위한 명령줄 도구입니다. 이 글에서는 Google 프리쇼의 이 동영상을 사용합니다.
PyMilvus: Milvus 벡터 데이터베이스 및 Milvus lite와 상호작용하기 위한 Python SDK로, 대규모 데이터의 효율적인 유사도 검색 및 검색 결과 가져오기를 가능하게 합니다.
Chameleon: Meta AI가 개발한 비전-언어 모델로, 시각적 입력을 기반으로 텍스트를 이해하고 생성할 수 있으며, 멀티모달 데이터 입력을 통합하는 데 유용합니다.
Meta-Chameleon-7b: Chameleon 시리즈의 특정 모델로, 고급 비전-언어 작업을 위해 설계되었으며, 시각 및 텍스트 데이터를 통합하여 문맥 인식 응답을 제공합니다.
ImageBind: 멀티모달 임베딩 모델입니다.
라이브러리를 설치한 후에는 해당 함수들을 사용할 수 있도록 코드로 가져와야 합니다.
from pathlib import Path
from radient import make_operator
from radient import Workflow
radient만 가져온다는 점에 주목하세요. 이는 Radient가 워크플로 내에서 임베딩 모델과 PyMilvus의 통합 및 활용을 처리하기 때문입니다. 따라서 이를 수동으로 가져올 필요가 없습니다.
make_operator 함수는 워크플로의 구성 요소가 될 다양한 연산자를 생성할 수 있게 해줍니다. Workflow 클래스는 이러한 연산자들을 논리적인 순서로 연결합니다.
가져오기를 마치면 멀티모달 유사도 검색 시스템을 구현할 준비가 된 것입니다.
연산자 생성
워크플로가 수행할 특정 작업을 지정하는 것부터 시작합니다.
path = Path('/content/google.mp4') // pass the youtube downloaded video path here
read = make_operator(optype="source", method="local", task_params={"path": str(path)})
demux = make_operator(optype="transform", method="video-demux", task_params={"interval": 5.8})
vectorize = make_operator (optype="vectorizer", method="imagebind", modality="multimodal", task_params={})
store = make_operator (optype="sink", method="milvus", task_params={"operation": "insert"})
각 연산자를 자세히 살펴보겠습니다.
read: 로컬 비디오 파일을 읽는source연산자입니다. 파일 경로를 매개변수로 받아 비디오 데이터를 워크플로에 로드하는 역할을 합니다.demux: 비디오를 5.8초 간격의 프레임으로 디먹스(분리)하는transform연산자입니다. 이 단계는 연속적인 비디오 스트림을 개별적으로 처리할 수 있는 불연속 이미지로 나누는 데 매우 중요합니다.vectorize: 이 연산자는ImageBind모델을 사용하여 멀티모달 데이터에 대한 벡터 임베딩을 생성합니다. ImageBind는 다양한 모달리티(이미지, 텍스트, 오디오 등)에 대해 통합 임베딩을 생성할 수 있는 강력한 모델로, 비디오 프레임을 고차원 벡터 공간에서 표현할 수 있게 해줍니다.store: 벡터화된 데이터를 Milvus lite에 삽입하는 싱크 연산자입니다. Milvus의 경량 버전입니다
연산자를 생성한 후 다음 단계는 이를 사용하여 워크플로를 생성하는 것입니다.
삽입 워크플로 구성
다음으로, 처리된 비디오 데이터를 Milvus 데이터베이스에 삽입하기 위한 워크플로를 구성합니다.
insert_wf = (Workflow()
.add(read, name="read")
.add(demux, name="demux")
.add(vectorize, name="vectorize")
.add(store, name="store")
)
insert_wf()
이 워크플로는 비디오 파일을 읽는 것부터 시작한 다음, 이를 개별 프레임으로 디먹스합니다. 이후 각 프레임은 ImageBind 모델을 사용하여 벡터화됩니다. 결과 벡터는 Milvus 데이터베이스에 저장됩니다.
모든 것이 원활하게 실행되면 아래와 유사한 출력이 표시됩니다.
그림 4- 삽입 작업 결과
출력은 비디오가 처리되어 Milvus에 삽입되었다는 확인을 보여줍니다. 삽입된 레코드 수, 해당 ID 및 계산 비용을 나타내는 삽입 작업 결과를 보여줍니다.
검색 워크플로 설정
데이터를 삽입한 후에는 검색을 위한 워크플로를 설정해야 합니다. 이 워크플로를 통해 텍스트 쿼리를 기반으로 관련 비디오 프레임을 찾을 수 있습니다.
vectorize = make_operator("vectorizer", "imagebind", modality="text")
search = make_operator("sink", "milvus", task_params={"operation": "search", "output_fields": None})
search_wf = (Workflow()
.add(vectorize, name="vectorize")
.add(search, name="search")
)
이 검색 워크플로는 두 가지 주요 단계로 구성됩니다.
vectorize연산자는 텍스트 입력을 받아 ImageBind를 사용하여 벡터 임베딩으로 변환합니다. 이를 통해 텍스트 쿼리를 비디오 프레임과 동일한 벡터 공간에서 표현할 수 있습니다.그런 다음
search연산자는 이 벡터를 사용하여 Milvus 데이터베이스에서 유사도 검색을 수행하고, 쿼리와 가장 유사한 비디오 프레임을 찾습니다.
검색 워크플로가 있으므로 검색을 수행해 보겠습니다.
멀티모달 검색 수행
텍스트를 사용하여 비디오를 검색하고 있으므로 이는 멀티모달 검색입니다. 정확히 말하면 비디오 프레임을 검색하는 것입니다.
prompt = "What was unusual about the coffee mug?"
search_wf(data=prompt)
search_vars = {
"limit": 1, # top-k limit
"output_fields": ["*"] # output fields
}
results = search_wf(
extra_vars={"search": search_vars},
data=prompt
)
results[0][0][0]["entity"]["data"]
여기서는 특이한 커피 머그잔에 대해 묻는 검색 프롬프트를 정의합니다. search_vars 딕셔너리는 상위 1개 결과와 모든 출력 필드를 원한다는 것을 지정합니다.
그런 다음 이러한 입력으로 검색 워크플로를 실행합니다. 워크플로는 우리의 텍스트 프롬프트를 벡터화하고, Milvus에서 유사한 벡터를 검색한 뒤 결과를 반환합니다. 중첩 인덱싱 [0][0][0]은 첫 번째(그리고 이 경우 유일한) 검색 결과에 접근하며, ["entity"]["data"]는 이 결과와 연결된 실제 데이터를 가져옵니다.
위 코드는 쿼리에 가장 잘 맞는 프레임의 경로를 반환합니다.
/root/.radient/data/video_demux/6bc783e9-c789-4340-b45c-204621145f2b/frame_0001.png
머그잔에서 무엇이 특이한지 확인하기 위해 반환된 이 프레임을 시각화해 보겠습니다.
from PIL import Image
image_path = "/root/.radient/data/video_demux/6bc783e9-c789-4340-b45c-204621145f2b/frame_0001.png"
image = Image.open(image_path)
import matplotlib.pyplot as plt
plt.imshow(image)
plt.show()
이 코드는 PIL(Python Imaging Library)을 사용하여 검색 결과에 해당하는 이미지 파일을 열고, matplotlib을 사용해 표시합니다. 이 시각적 표현은 특이한 커피 머그잔에 대한 쿼리에 응답하여 시스템이 무엇을 찾았는지 이해하는 데 도움이 됩니다.
출력은 다음과 같습니다:
Fig 5- 머그잔에서 나오는 사람
보시다시피 이 프레임은 일반적인 머그잔에는 사람을 넣을 수 없으므로 특이한 머그잔을 보여줍니다. 특이한 활동은 사람이 머그잔에서 나오고 있다는 것입니다.
이미지 설명을 위한 Meta-Chameleon-7b 활용
멀티모달 검색 시스템을 더욱 향상시키기 위해 Meta-Chameleon-7b 모델을 사용하여 이미지 설명을 생성할 수 있습니다:
from chameleon.inference.chameleon import ChameleonInferenceModel
import os
# 파일 경로와 존재 여부 확인
image_path = '/root/.radient/data/video_demux/6bc783e9-c789-4340-b45c-204621145f2b/frame_0001.png'
print(f"Image path: {image_path}")
print(f"File exists: {os.path.exists(image_path)}")
print(f"File size: {os.path.getsize(image_path)} bytes")
# 모델 초기화
model = ChameleonInferenceModel(
"./meta-chameleon-7b/models/7b/",
"./meta-chameleon-7b/tokenizer/text_tokenizer.json",
"./meta-chameleon-7b/tokenizer/vqgan.yaml",
"./meta-chameleon-7b/tokenizer/vqgan.ckpt",
)
try:
tokens = model.generate(
prompt_ui=[
{"type": "image", "value": f"file:{image_path}"}, # 'file:' 뒤의 공백 제거
{"type": "text", "value": prompt},
{"type": "sentinel", "value": "<END-OF-TURN>"},
]
)
result = model.decode_text(tokens)[0]
print("Generated description:")
print(result)
except Exception as e:
print(f"Error: {e}")
import traceback
traceback.print_exc()
이 코드는 이미지를 문맥 속에서 이해하고 설명할 수 있는 비전-언어 모델인 Meta-Chameleon-7b 모델을 초기화합니다. 이미지와 원래 텍스트 프롬프트를 모두 제공하여, 쿼리와 관련된 설명을 생성할 수 있도록 합니다.
generate 메서드는 이미지 파일 경로, 텍스트 프롬프트, 입력의 끝을 표시하는 sentinel 토큰을 포함한 입력 목록을 받습니다. 그런 다음 모델은 토큰 시퀀스를 생성하고, 이를 사람이 읽을 수 있는 텍스트로 디코딩합니다. 출력 예시는 다음과 같습니다:
Fig 6- 비전-언어 모델을 사용한 이미지 설명 출력
이 구현은 Milvus와 같은 벡터 데이터베이스가 더 큰 AI 시스템에 통합되어 다양한 모달리티 전반에서 효율적인 유사도 검색을 가능하게 하는 방법을 보여줍니다.
결론
Frank는 벡터 데이터베이스가 AI와 머신 러닝 분야, 특히 비정형 데이터를 처리하는 데 있어 어떻게 혁신적인 기술로 부상했는지 잘 보여주었습니다. 시연된 것처럼, 벡터 데이터베이스의 애플리케이션은 단순한 검색 증강 생성(RAG) 시스템을 훨씬 넘어 고객 지원, 추천 시스템, 신약 개발, 멀티모달 검색을 포함한 다양한 영역을 혁신하고 있습니다. 계속해서 벡터 데이터베이스 기반의 더욱 정교한 AI 애플리케이션을 구현해 보세요. 참고할 수 있는 몇 가지 리소스는 다음과 같습니다.
임베딩의 역사를 포함해 더 자세히 이해하려면, 밋업 발표 다시보기를 시청하세요.
추가 리소스
계속 읽기

Zilliz Cloud Now Available in AWS Asia Pacific (Seoul)
Zilliz Cloud is now available in AWS Seoul — low-latency vector search, in-country data residency, and one-step migration for Korean AI teams. 31 regions across 5 clouds.

Introducing Functions and Model Inference on Zilliz Cloud: Automatic Embedding and Reranking with Hosted Models
Zilliz Cloud Functions auto-generate embeddings via OpenAI, Voyage AI, Cohere, or Zilliz Hosted Models. Built-in reranking — just insert text and search.

How to Choose the Best Embedding Model for RAG in 2026: 10 Models Benchmarked
We benchmarked 10 embedding models on cross-modal, cross-lingual, long-document, and dimension compression tasks. See which one fits your RAG pipeline.


