Weaviate
Vector Database
오픈소스 벡터 데이터베이스. 자체 ML 모델 내장, GraphQL API, 하이브리드 검색 지원.
Vector Database
오픈소스 벡터 데이터베이스. 자체 ML 모델 내장, GraphQL API, 하이브리드 검색 지원.
Weaviate는 2019년 네덜란드에서 시작된 오픈소스 벡터 데이터베이스로, AI 네이티브 검색과 생성형 AI 애플리케이션을 위해 설계되었습니다. Go 언어로 작성되어 높은 성능을 제공하며, GraphQL과 RESTful API를 모두 지원합니다. 특히 자체 벡터화(Vectorization) 모듈을 내장하여 별도의 임베딩 파이프라인 없이도 텍스트, 이미지 데이터를 자동으로 벡터화할 수 있습니다.
Weaviate의 핵심 차별점은 "모듈형 아키텍처"입니다. text2vec-openai, text2vec-cohere, img2vec-neural 등 다양한 벡터화 모듈을 플러그인처럼 추가할 수 있어, 데이터 타입과 사용 목적에 따라 최적의 임베딩 모델을 선택할 수 있습니다. 또한 generative-openai 모듈로 RAG(Retrieval-Augmented Generation)를 네이티브로 지원합니다.
기술적으로 Weaviate는 HNSW(Hierarchical Navigable Small World) 알고리즘을 사용한 벡터 인덱싱, BM25 기반의 키워드 검색, 그리고 두 가지를 결합한 하이브리드 검색을 지원합니다. 멀티테넌시를 통해 여러 사용자의 데이터를 효율적으로 격리하고, 스키마 기반의 데이터 모델링으로 구조화된 메타데이터 필터링이 가능합니다.
실무에서 Weaviate는 Docker, Kubernetes로 셀프 호스팅하거나 Weaviate Cloud(WCD)를 통해 완전 관리형 서비스로 사용할 수 있습니다. LangChain, LlamaIndex와 공식 통합되어 있어 RAG 파이프라인 구축이 용이하며, 시맨틱 검색, Q&A 시스템, 추천 엔진 등 다양한 AI 애플리케이션에 활용됩니다.
import weaviate
from weaviate.classes.init import Auth
from weaviate.classes.config import Configure, Property, DataType
from weaviate.classes.query import MetadataQuery
# 1. Weaviate Cloud 연결
client = weaviate.connect_to_weaviate_cloud(
cluster_url="https://your-cluster.weaviate.network",
auth_credentials=Auth.api_key("your-weaviate-api-key"),
headers={"X-OpenAI-Api-Key": "your-openai-api-key"}
)
# 2. 컬렉션(스키마) 생성 - 자동 벡터화 설정
collection = client.collections.create(
name="Document",
vectorizer_config=Configure.Vectorizer.text2vec_openai(
model="text-embedding-3-small"
),
generative_config=Configure.Generative.openai(
model="gpt-4o-mini"
),
properties=[
Property(name="title", data_type=DataType.TEXT),
Property(name="content", data_type=DataType.TEXT),
Property(name="category", data_type=DataType.TEXT)
]
)
# 3. 데이터 삽입 (자동 벡터화)
documents = collection.data.insert_many([
{"title": "RAG 개요", "content": "RAG는 검색 증강 생성입니다.", "category": "llm"},
{"title": "Weaviate 소개", "content": "Weaviate는 벡터 DB입니다.", "category": "database"},
{"title": "임베딩이란", "content": "텍스트를 숫자 벡터로 변환합니다.", "category": "ml"}
])
print(f"삽입된 문서 수: {len(documents.uuids)}")
# 4. 시맨틱 검색 (벡터 유사도)
results = collection.query.near_text(
query="벡터 데이터베이스란?",
limit=3,
return_metadata=MetadataQuery(distance=True)
)
print("\n=== 시맨틱 검색 결과 ===")
for obj in results.objects:
print(f"- {obj.properties['title']} (거리: {obj.metadata.distance:.4f})")
# 5. 하이브리드 검색 (벡터 + BM25)
hybrid_results = collection.query.hybrid(
query="벡터 DB",
alpha=0.5, # 0=BM25, 1=벡터검색, 0.5=균형
limit=3,
return_metadata=MetadataQuery(score=True)
)
print("\n=== 하이브리드 검색 결과 ===")
for obj in hybrid_results.objects:
print(f"- {obj.properties['title']} (점수: {obj.metadata.score:.4f})")
# 6. 필터링 검색
from weaviate.classes.query import Filter
filtered = collection.query.near_text(
query="AI 기술",
filters=Filter.by_property("category").equal("llm"),
limit=3
)
# 7. RAG: 검색 + 생성 (Generative Search)
rag_result = collection.generate.near_text(
query="벡터 검색이 뭔가요?",
limit=2,
grouped_task="검색된 문서를 바탕으로 벡터 검색을 설명해주세요."
)
print("\n=== RAG 응답 ===")
print(rag_result.generated)
# 8. 연결 종료
client.close()
2025년 10월 기준 Weaviate Cloud 요금제 (신규 가격 모델)
| 플랜 | 월 최소 비용 | 특징 | SLA |
|---|---|---|---|
| Free Trial | $0 (14일) | Sandbox 클러스터, 전체 기능 체험 | - |
| Shared Cloud (Flex) | $45/월~ | 고가용성(HA) 기본 제공, Pay-as-you-go | 99.5% |
| Shared Cloud (Plus) | 연간 계약 | 커밋 할인, 백업/복원 | 99.5% |
| Dedicated Cloud | 커스텀 | 전용 리소스, 프라이빗 네트워킹 | 99.9% |
과금 기준 (2025년 10월~)
셀프 호스팅 요구사항
"RAG 시스템 벡터 DB로 Weaviate를 검토 중인데요, 자체 벡터화 모듈이 있어서 별도 임베딩 서버 없이도 구축 가능합니다. 오픈소스라 셀프 호스팅도 가능하고, 하이브리드 검색으로 키워드와 시맨틱 검색을 같이 쓸 수 있어요."
"Weaviate와 Pinecone의 차이가 뭔가요?" - "Pinecone은 완전 관리형 SaaS고, Weaviate는 오픈소스라 셀프 호스팅이 가능합니다. Weaviate는 자체 벡터화 모듈과 GraphQL API가 강점이고, Pinecone은 설정이 간단하고 serverless로 운영 부담이 적어요."
"Weaviate의 generative-search 모듈을 쓰면 검색과 동시에 LLM 응답 생성이 가능해요. LangChain 없이도 네이티브 RAG를 구현할 수 있어서 아키텍처가 단순해집니다."
컬렉션 생성 시 vectorizer를 설정하지 않으면 수동으로 벡터를 제공해야 합니다. text2vec-openai 등 모듈을 미리 활성화하고, API 키를 헤더에 포함해야 자동 벡터화가 동작합니다.
한번 생성된 컬렉션의 속성(Property)은 수정이 제한됩니다. 특히 벡터화 대상 속성을 나중에 바꾸면 기존 데이터와 호환이 안 됩니다. 설계 단계에서 스키마를 신중히 결정하세요.
hybrid 검색의 alpha 값(0~1)을 데이터 특성에 맞게 조정하세요. 전문 용어가 많으면 BM25(alpha=0.3), 자연어 질의가 많으면 벡터 검색(alpha=0.7) 비중을 높이는 게 효과적입니다.