Embex 소개: 범용 벡터 데이터베이스 ORM
Source: Dev.to

TL;DR: Embex는 벡터 데이터베이스용 범용 ORM으로, Qdrant, Pinecone, Chroma, LanceDB, Milvus, Weaviate, PgVector 사이를 코드 한 줄도 수정하지 않고 전환할 수 있게 해줍니다. Rust 코어와 SIMD 가속을 기반으로 하며, 순수 Python/JS 구현보다 4× 빠릅니다.
내가 해결하려던 문제
벡터 데이터베이스를 다뤄본 적이 있다면, 그 고통을 알 것입니다:
- 모든 데이터베이스마다 API가 다릅니다 – Qdrant는 한 형식을 사용하고, Pinecone은 또 다른 형식을, Chroma는 또 다른 형식을 사용합니다.
- 벤더 종속성 – 공급자를 바꾸면 전체 코드베이스를 다시 작성해야 합니다.
- 성능 트레이드오프 – 대부분의 클라이언트가 순수 Python/JS로 구현돼 있어 성능이 제한됩니다.
- 설정 복잡성 – 시작하려면 Docker, API 키, 클라우드 계정 등이 필요합니다…
나는 다음과 같은 솔루션을 원했습니다:
- ✅ 모든 벡터 데이터베이스와 호환
- ✅ 설정 없이 바로 시작 가능
- ✅ 프로덕션 수준의 성능 제공
- ✅ 프로토타입에서 프로덕션까지 확장 가능
그래서 Embex를 만들었습니다.
Embex가 다른 이유는?
1. 범용 API – 공급자를 즉시 전환
# Development: LanceDB (embedded, zero setup)
client = await EmbexClient.new_async("lancedb://./data")
# Production: Switch to Qdrant (just change the config!)
client = await EmbexClient.new_async(
"qdrant://https://your-cluster.com",
api_key="..."
)
# Everything else stays the same!
await collection.insert(points)
results = await collection.search(vector, top_k=10)
동일한 코드. 다른 백엔드. 코드 수정 전혀 없음.
Note: Embex는 async 초기화(
new_async())를 사용하여 로컬(LanceDB)과 클라우드 공급자(Qdrant, Pinecone)를 동일한 API로 올바르게 처리합니다. 이를 통해 모든 공급자에서 일관된 동작을 보장합니다.
2. SIMD 가속이 포함된 Rust 코어
Embex는 얇은 래퍼가 아니라 SIMD 인트린식이 포함된 공유 Rust 코어 위에 구축되었습니다:
- 4배 빠른 벡터 연산 (내적, 코사인 유사도)
- 제로‑복사 언어 간 데이터 전달
- < 5 % 오버헤드 (네이티브 클라이언트 대비)
# This runs on optimized Rust code with AVX2/NEON
results = await collection.search(query_vector, top_k=10)
3. 간단히 시작하고 나중에 확장
| 단계 | 공급자 | 일반적인 사용 |
|---|---|---|
| Day 1 – 학습 | lancedb://./data | 임베디드, Docker 필요 없음, API 키 필요 없음 |
| Week 2 – 스테이징 | qdrant://https://... | 관리형 클라우드, 연결 풀링 |
| Month 1 – 확장 | milvus://https://... | 수십억 규모 벡터, 분산 환경 |
# Day 1 – LanceDB
client = await EmbexClient.new_async("lancedb://./data")
# Week 2 – Qdrant
client = await EmbexClient.new_async("qdrant://https://...", api_key="...")
# Month 1 – Milvus
client = await EmbexClient.new_async("milvus://https://...")
빠른 시작: 5분 안에 의미 검색
import asyncio
from embex import EmbexClient, Point
from sentence_transformers import SentenceTransformer
async def main():
# 1️⃣ Setup (LanceDB – zero setup!)
client = await EmbexClient.new_async("lancedb://./data")
model = SentenceTransformer('all-MiniLM-L6-v2')
# 2️⃣ Create collection
await client.create_collection(
"products",
dimension=384,
distance="cosine"
)
# 3️⃣ Insert documents
docs = [
"Apple iPhone 15 Pro Max",
"Samsung Galaxy S24 Ultra",
"Fresh Organic Bananas"
]
points = [
Point(
id=str(i),
vector=model.encode(doc).tolist(),
metadata={"text": doc}
)
for i, doc in enumerate(docs)
]
await client.insert("products", points)
# 4️⃣ Search
query = "smartphone"
query_vector = model.encode(query).tolist()
results = await client.search(
collection_name="products",
vector=query_vector,
top_k=2
)
for result in results.results:
print(f"{result.metadata['text']} (score: {result.score:.3f})")
asyncio.run(main())
그게 전부입니다! Docker도, API 키도, 클라우드 설정도 필요 없습니다. 단지:
pip install embex lancedb sentence-transformers
그리고 바로 실행됩니다.
성능 벤치마크
- SIMD 가속: dot‑product / 코사인 유사도에서 3.6× – 4.0× 더 빠름
- 최소 오버헤드: 네이티브 클라이언트 대비 < 5 %
- 패키지 크기: 8‑15 MB (65 MB+에서 최적화)
Production Features
- ✅ Connection Pooling – 고동시성 연결 관리
- ✅ Migrations – 스키마 변경을 위한 Git과 유사한 버전 관리
- ✅ Observability – OpenTelemetry 메트릭 및 트레이싱
- ✅ Type Safety – 전체 TypeScript 정의와 Python 타입 힌트
Supported Providers
- LanceDB – 임베디드, 설정 필요 없음
- Qdrant – 프로덕션 및 로컬
- Pinecone – 서버리스
- Chroma – AI‑네이티브
- PgVector – PostgreSQL 확장
- Milvus – 수십억 규모
- Weaviate – 모듈형
지금 바로 사용해 보세요
# Python
pip install embex lancedb sentence-transformers
# Node.js
npm install @bridgerust/embex lancedb @xenova/transformers
다음은 무엇인가요?
다가오는 기능, 커뮤니티 플러그인, 그리고 인기 있는 LLM 툴킷과의 더 깊은 통합을 기대해 주세요!
Embex 피드백
우리는 Embex를 개발 중이며 여러분의 피드백을 받고 싶습니다:
- 어떤 기능이 부족한가요?
- 어떤 사용 사례를 우선순위에 두어야 할까요?
- 겪은 성능 문제는 무엇인가요?
- 제공자 지원 요청이 있나요?
질문? 피드백? 이슈? 아래에 댓글을 남기거나 GitHub에서 이슈를 열어 주세요!
