介绍 Embex:通用向量数据库 ORM

发布: (2026年1月3日 GMT+8 19:05)
5 min read
原文: Dev.to

Source: Dev.to

介绍 Embex:通用向量数据库 ORM 的封面图片

KOLOG B Josias Yannick

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)

相同代码。不同后端。零重写。

注意: Embex 使用 async 初始化 (new_async()) 来统一处理本地(LanceDB)和云端提供商(Qdrant、Pinecone),确保在所有提供商之间行为一致。

2. 基于 Rust 核心并支持 SIMD 加速

Embex 并非薄包装——它基于共享的 Rust 核心并使用 SIMD 指令:

  • 提升 4 倍 的向量运算(点积、余弦相似度)
  • 零拷贝 的跨语言数据传递
  • < 5 % 开销 相比原生客户端
# This runs on optimized Rust code with AVX2/NEON
results = await collection.search(query_vector, top_k=10)

3. 简单起步,后续扩展

StageProviderTypical Use
第 1 天 – 学习lancedb://./data嵌入式,无 Docker,无 API 密钥
第 2 周 – 预演qdrant://https://...托管云,连接池
第 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 加速: 3.6× – 4.0× 更快的点积 / 余弦相似度
  • 最小开销: < 5 % 相比原生客户端
  • 包大小: 8‑15 MB(从 65 MB+ 优化而来)

生产特性

  • 连接池 – 高并发连接管理
  • 迁移 – 类 Git 的模式更改版本控制
  • 可观测性 – OpenTelemetry 指标和追踪
  • 类型安全 – 完整的 TypeScript 定义和 Python 类型提示

支持的提供商

  • 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 上打开 issue!

Back to Blog

相关文章

阅读更多 »