AI 애플리케이션에 "텍스트로 이미지 검색", "의미 기반 검색", "유사도 추천" 기능을 추가하고 싶을 때, 가장 먼저 떠오르는 건 뭐예요? Chroma? Pinecone? 아니면 Weaviate?

오늘 소개할 오픈소스 프로젝트는 벡터 데이터베이스 선택에 대한 생각을 완전히 바꿔줄지도 모릅니다. 이름은 Zvec, 알리바바 통이 연구소에서 오픈소스로 공개한 임베디드 벡터 데이터베이스입니다. "벡터 데이터베이스계의 SQLite"라고 불리죠.

서버도 필요 없고, Docker도 필요 없고, 설정 파일도 필요 없습니다. pip install zvec 한 줄이면 Python 프로세스 안에서 바로 실행됩니다. 정말 이만큼 간단합니다.

프로젝트 소개

Zvec는 알리바바가 오픈소스로 공개한 경량·인프로세스(in-process) 벡터 데이터베이스입니다. 설계 철학은 SQLite와 똑같아요 — 어떤 외부 서비스에도 의존하지 않고, 애플리케이션에 직접 임베드합니다.

항목 설명
GitHub Stars 10,400+ (2026년 6월 GitHub Trending 등재)
라이선스 Apache 2.0
언어 C++ 코어, 다국어 SDK (Python / Node.js / Go / Rust / Dart)
최신 버전 v0.5.0 (2026-06-12)
내부 엔진 Proxima (알리바바 내부에서 사용하는 벡터 검색 엔진)

Zvec vs 전통적 벡터 데이터베이스

항목 Zvec Chroma Pinecone Milvus
배포 방식 인프로세스 (임베디드) 서비스 필요 클라우드 호스팅 배포 필요
설치 pip install zvec Docker 필요 계정 가입 복잡한 배포
메모리 사용량 낮음 (DiskANN 인덱스가 디스크 저장 지원) 보통 해당 없음 높음
적합한 상황 로컬 앱, 엣지, 중소규모 RAG 프로토타입 개발 운영 환경 클라우드 서비스 대규모 클러스터

한 줄 요약: "박스에서 꺼내 바로 쓸 수 있는" 벡터 데이터베이스가 필요하고, 서버나 설정에 신경 쓰고 싶지 않다면, Zvec가 가장 가볍고 빠른 선택입니다.

설치

Zvec는 여러 운영체제와 프로그래밍 언어를 지원합니다. 설치도 아주 간단해요.

Python (권장)

BASH
pip install zvec

Python 3.10 - 3.14가 필요합니다.

Node.js

BASH
npm install @zvec/zvec

Go

BASH
go get github.com/zvec-ai/zvec-go

Rust

TOML
# Cargo.toml
[dependencies]
zvec = "0.5"

시스템 요구사항

플랫폼 아키텍처
Linux x86_64, ARM64
macOS ARM64 (Apple Silicon)
Windows x86_64

빠르게 시작하기

첫 번째 벡터 검색

단 몇 줄의 코드로 벡터 데이터베이스를 만들고 유사도 검색을 실행할 수 있어요:

PYTHON
import zvec

# 1. 컬렉션 스키마 정의
schema = zvec.CollectionSchema(
    name="my_collection",
    vectors=zvec.VectorSchema("embedding", zvec.DataType.VECTOR_FP32, 4),
)

# 2. 컬렉션 생성 및 열기 (로컬에 자동 저장)
collection = zvec.create_and_open(path="./my_zvec_data", schema=schema)

# 3. 벡터 데이터 삽입
collection.insert([
    zvec.Doc(id="doc_1", vectors={"embedding": [0.1, 0.2, 0.3, 0.4]}),
    zvec.Doc(id="doc_2", vectors={"embedding": [0.2, 0.3, 0.4, 0.1]}),
    zvec.Doc(id="doc_3", vectors={"embedding": [0.9, 0.1, 0.1, 0.2]}),
])

# 4. 벡터 유사도 검색 실행
results = collection.query(
    zvec.VectorQuery("embedding", vector=[0.2, 0.3, 0.3, 0.1]),
    topk=2
)

# 결과 출력
for r in results:
    print(f"ID: {r['id']}, 유사도 점수: {r['score']:.4f}")

실행 결과:

ID: doc_2, 유사도 점수: 0.9899
ID: doc_1, 유사도 점수: 0.9798

간단한 RAG 애플리케이션 만들기

OpenAI의 embedding 모델과 결합해서 문서 질응답 시스템을 빠르게 구축할 수 있어요:

PYTHON
import zvec
import openai

# embedding 모델 초기화
client = openai.OpenAI(api_key="your-api-key")

def get_embedding(text: str) -> list[float]:
    response = client.embeddings.create(
        model="text-embedding-3-small",
        input=text
    )
    return response.data[0].embedding

# 컬렉션 생성
schema = zvec.CollectionSchema(
    name="rag_docs",
    vectors=zvec.VectorSchema("embedding", zvec.DataType.VECTOR_FP32, 1536),
    fields=[
        zvec.FieldSchema("content", zvec.DataType.STRING),
        zvec.FieldSchema("source", zvec.DataType.STRING),
    ],
)

collection = zvec.create_and_open(path="./rag_data", schema=schema)

# 문서 인덱싱
documents = [
    ("Zvec는 알리바바가 오픈소스로 공개한 경량 벡터 데이터베이스입니다", "doc1.md"),
    ("벡터 데이터베이스는 고차원 벡터 데이터를 저장하고 검색하는 데 사용됩니다", "doc2.md"),
    ("RAG 기술은 검색과 생성을 결합한 것으로, 현재 LLM 애플리케이션의 주류 방안입니다", "doc3.md"),
]

for content, source in documents:
    embedding = get_embedding(content)
    collection.insert([
        zvec.Doc(
            vectors={"embedding": embedding},
            fields={"content": content, "source": source},
        )
    ])

# 가장 관련성 높은 문서 검색
question = "벡터 데이터베이스가 뭐예요?"
query_embedding = get_embedding(question)

results = collection.query(
    zvec.VectorQuery("embedding", vector=query_embedding),
    topk=2
)

print("관련 문서:")
for r in results:
    print(f"- [{r['fields']['source']}] {r['fields']['content']}")
    print(f"  유사도: {r['score']:.4f}\n")

고급 기능

v0.5.0에서 네이티브 전문 검색 기능이 도입되었습니다. Elasticsearch나 다른 외부 검색 엔진을 따로 가져올 필요가 없어요:

PYTHON
import zvec

schema = zvec.CollectionSchema(
    name="ft_search",
    vectors=zvec.VectorSchema("embedding", zvec.DataType.VECTOR_FP32, 384),
    fields=[
        zvec.FieldSchema("title", zvec.DataType.STRING),
        zvec.FieldSchema("body", zvec.DataType.STRING),
    ],
)

collection = zvec.create_and_open(path="./fts_data", schema=schema)

# body 필드에 전문 검색 인덱스 생성
collection.create_fts_index("body_fts", field="body")

# 데이터 삽입
collection.insert([
    zvec.Doc(
        id="1",
        vectors={"embedding": [0.1] * 384},
        fields={"title": "Python 튜토리얼", "body": "Python은 AI와 데이터 분석에서 널리 사용되는 강력한 프로그래밍 언어입니다."},
    ),
    zvec.Doc(
        id="2",
        vectors={"embedding": [0.2] * 384},
        fields={"title": "JavaScript 입문", "body": "JavaScript는 프론트엔드 개발의 핵심 언어로, Web, Node.js 등 다양한 환경을 지원합니다."},
    ),
])

# 전문 검색
results = collection.query(
    zvec.FTSQuery("body_fts", "Python 데이터 분석"),
    topk=5
)

for r in results:
    print(f"[{r['fields']['title']}] {r['fields']['body'][:30]}...")

Zvec의 가장 강력한 기능 중 하나는 벡터 검색, 전문 검색, 스칼라 필터링을 하나의 쿼리로 조합해서 가장 정확한 결과를 얻는 거예요:

PYTHON
# 하이브리드 검색: 벡터 + 전문 검색 + 스칼라 필터
results = collection.query(
    zvec.MultiQuery([
        # 벡터 유사도
        zvec.VectorQuery("embedding", vector=[0.15] * 384, weight=0.7),
        # 전문 검색
        zvec.FTSQuery("body_fts", "프로그래밍 언어 튜토리얼", weight=0.3),
    ]),
    topk=3
)

for r in results:
    print(f"[{r['id']}] 하이브리드 점수: {r['score']:.4f}")

DiskANN 디스크 인덱스

벡터 데이터가 너무 커서 메모리가 부족할 수 있죠. Zvec의 DiskANN 인덱스는 인덱스의 대부분을 디스크에 저장해서 메모리 사용량을 대폭 줄여줍니다:

PYTHON
schema = zvec.CollectionSchema(
    name="large_collection",
    vectors=zvec.VectorSchema("embedding", zvec.DataType.VECTOR_FP32, 768),
)

# DiskANN 인덱스로 컬렉션 생성
collection = zvec.create_and_open(
    path="./diskann_data",
    schema=schema,
    index_options=zvec.IndexOptions(
        index_type=zvec.IndexType.DISKANN,  # 디스크 기반 인덱스
    )
)

# 대량 데이터 삽입 (백만 개도 거뜬)
for i in range(100000):
    collection.insert([zvec.Doc(
        id=f"doc_{i}",
        vectors={"embedding": [0.1 * (i % 768)] * 768},
    )])

스칼라 필터링

벡터 검색에 구조화된 필드 필터링을 추가할 수 있어요:

PYTHON
results = collection.query(
    zvec.ScalarQuery("category = 'AI' AND published_year >= 2025"),
    topk=10
)

영속화와 동시성

Zvec는 WAL(Write-Ahead Logging)을 사용해서 데이터 영속성을 보장합니다. 프로세스가 크래시되거나 전원이 끊겨도 데이터가 손실되지 않아요. 또한 여러 프로세스가 동시에 같은 컬렉션을 읽을 수 있습니다 (쓰기는 배타적):

PYTHON
# 프로세스 A: 쓰기
collection_a = zvec.open("./shared_data", mode="write")
collection_a.insert([zvec.Doc(id="new_1", vectors={"embedding": [0.5] * 4})])
collection_a.flush()

# 프로세스 B: 읽기 (프로세스 A와 병렬)
collection_b = zvec.open("./shared_data", mode="read")
results = collection_b.query(
    zvec.VectorQuery("embedding", vector=[0.5] * 4),
    topk=5
)

성능

공식 벤치마크에 따르면, Zvec는 여러 측면에서 뛰어난 성능을 보여줍니다:

  • 검색 지연 시간: 수십억 개 벡터 데이터셋에서도 밀리초 단위로 응답
  • 메모리 효율: DiskANN 인덱스는 전통적 메모리 인덱스 대비 10배 이상 메모리 절감
  • 처리량: 고동시성 쿼리 시나리오 지원
  • 경쟁 제품 대비: 동일한 하드웨어에서 Zvec의 QPS(초당 쿼리 수)와 지연 시간이 Chroma와 Milvus보다 우수

자세한 벤치마크 데이터는 공식 Benchmarks 문서를 참고하세요.

시각화 디버깅 도구: Zvec Studio

코드로 벡터 데이터를 디버깅하는 게 싫다면, Zvec 공식에서 제공하는 시각화 도구 Zvec Studio를 사용해 보세요:

BASH
git clone https://github.com/zvec-ai/zvec-studio
cd zvec-studio
npm install && npm run dev

브라우저를 열면 컬렉션 데이터를 탐색하고, 쿼리를 디버깅하고, 인덱스 상태를 확인할 수 있어요 — 코드를 한 줄도 쓸 필요 없이.

활용 사례

시나리오 Zvec가 적합한 이유
개인 RAG 애플리케이션 외부 서비스 배포 불필요, pip install로 바로 사용
데스크톱 AI 애플리케이션 임베디드 설계로 추가 프로세스 불필요
모바일/엣지 디바이스 경량, 낮은 메모리 사용량
빠른 프로토타입 검증 제로 설정, 5분이면 전체 흐름 완료
중소규모 운영 환경 WAL 영속화 + DiskANN으로 안정성 보장
다국어 프로젝트 Python / Node.js / Go / Rust / Dart SDK 제공

마무리

Zvec는 중요한 빈틈을 채워줍니다 — Docker 배포가 필요한 Chroma 같은 벡터 데이터베이스와 Pinecone 같은 클라우드 서비스 사이에서, 진정으로 가볍고 진정으로 임베디드된 대안을 제시하니까요.

다음과 같은 개발자라면 Zvec에 5분만 투자해 볼 만해요:

  • Docker 없이 로컬에서 RAG 앱을 실행하고 싶은 분
  • 의미 검색 프로토타입을 위한 간단한 벡터 데이터베이스가 필요한 분
  • 데스크톱/모바일 AI 앱을 개발 중이라 경량 임베디드 솔루션이 필요한 분
  • 복잡한 설정에 지쳤고, pip install만으로 되는 도구를 원하는 분

프로젝트 주소: github.com/alibaba/zvec
공식 문서: zvec.org

Zvec를 사용하고 계신다면, 댓글로 사용 경험을 공유해 주세요. 아니면 이미 다른 벡터 데이터베이스를 쓰고 계신가요? Zvec와 다른 솔루션의 비교에 대해 이야기 나눠 봐요.