MSVBASE
microsoft/MSVBASE加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象你运营着一个电影推荐平台,数据库里存着十万部影片的特征向量。当用户点击一部电影时,你需要从海量候选中找出"最相似的 Top 10",同时还要按"发行年份 > 2015"和"评分 > 8.0"做过滤。
传统方案是"双剑合璧":PostgreSQL 处理过滤条件,Milvus / Pinecone 处理向量相似度搜索,两套系统之间用应用层 JOIN —— 延迟高、数据一致性和维护成本令人头疼。
MSVBASE 正是来解决这个问题的。
MSVBASE(Microsoft Vector BASE)是微软研究院于 2023 年 6 月开源的项目,核心目标只有一个:在 PostgreSQL 内部原生支持向量相似度搜索,让向量查询和关系型查询使用同一套执行引擎。
这不仅仅是"加一个扩展"那么简单。MSVBASE 深度修改了 PostgreSQL 的查询规划器和执行器,实现了 HNSW、SPTAG、SPANN 三种业界主流向量索引算法的集成,并配套发表了两篇顶级学术论文:
MSVBASE 的 SQL 语法与标准 PostgreSQL 完全兼容,学习成本极低。你可以用标准的 CREATE TABLE 建表,插入数据后,通过 CREATE INDEX 声明向量索引类型和距离度量方式:
-- 建表:向量用 float8[] 数组存储
create table movies(id int, year int, rating float,
embedding float8[128]);
-- 在向量列上创建 HNSW 索引(L2 距离)
create index idx_vec on movies
using hnsw(embedding) with(dimension=128, distmethod=l2_distance);
-- 或者 SPTAG 索引(内积距离)
create index idx_vec2 on movies
using sptag(embedding vector_inner_product_ops)
with(distmethod=inner_product);
查询时,<-> 代表 L2 距离,<*> 代表内积距离:
-- TopK 查询:找最相似的 10 部电影,同时过滤年份和评分
select id, year, rating
from movies
where year > 2015 and rating > 8.0
order by embedding <-> '{0.12, -0.45, ...}'
limit 10;
这一条 SQL 就能同时完成过滤和向量搜索——没有双系统,没有应用层拼接,没有数据复制。
MSVBASE 支持的查询类型覆盖了实际生产中的主要场景:
| 查询类型 | SQL 示例 | 说明 |
|---|---|---|
| TopK 精确查询 | order by vec <-> '{...}' limit 10 | 按距离排序返回 Top K 结果 |
| TopK + 过滤 | where price > 15 order by vec <-> '{...}' limit 10 | 向量搜索 + 标量条件联合过滤 |
| 距离范围查询 | where vec <<->> '{threshold, ...}' | 返回指定距离阈值内的所有向量 |
| 多向量列融合 | approximate_sum('0.5*vec1<->... + 0.5*vec2<*>...') | 多个向量列加权组合查询 |
| 向量 Join | join on t1.vec <<*>> t2.vec | 两表的向量相似度 Join |
支持的向量索引算法:
MSVBASE 没有 Web UI,也没有图形化管理界面,一切交互通过标准的 psql 客户端完成:
docker exec -it --privileged vbase_open_source bash
psql -U vectordb
这种方式对 DBA 友好,但增加了新手的上手门槛。微软提供了三步快速启动脚本:
git clone https://github.com/microsoft/MSVBASE.git
cd MSVBASE
git submodule update --init --recursive
./scripts/patch.sh # 应用源码补丁
./scripts/dockerbuild.sh # 构建 Docker 镜像
./scripts/dockerrun.sh # 启动容器
构建过程依赖较多(gcc 12.3.0、Boost 1.81.0、PostgreSQL 13),直接编译需要约 20-30 分钟,Docker 方式可显著降低环境配置的痛苦。
没有银弹。 MSVBASE 的定位是研究级系统而非生产级产品,当前版本存在以下局限:
float8[] 数组而非原生向量类型,缺乏向量维度约束和类型校验m(邻居数)和 efConstruction 参数对最终性能影响显著,需要专业调优知识MSVBASE 的学术贡献远大于工程实用价值,但其提出的核心理念正在被工业界广泛借鉴。VBASE 论文中"统一向量检索与关系型查询"的思想,已经被 Qdrant、Chroma 等新兴向量数据库借鉴,用于设计更符合实际业务需求的混合查询能力。
如果你正在进行 RAG(检索增强生成)系统的选型,同时需要复杂的业务过滤逻辑,MSVBASE 的思路值得关注——但对于大多数场景,pgvector + PostgreSQL 的成熟组合可能是更稳妥的选择。
对于 AI 开发者而言,MSVBASE 更像是一扇窗:它展示了向量检索与传统数据库融合的前沿方向,也提醒我们,真正的生产级系统还需要在工程化、易用性和生态上持续投入。