闲社

标题: 【教程】阿里zvec向量数据库实战:5分钟搭建本地AI语义搜索引擎 [打印本页]

作者: alt-sky    时间: 8 小时前
标题: 【教程】阿里zvec向量数据库实战:5分钟搭建本地AI语义搜索引擎
前言

最近GitHub Trending上阿里开源的zvec火得不行——10K+星标,号称"轻量级、闪电般速度的进程内向量数据库"。它支持Python/Node.js/Go/Rust/Dart多语言SDK,最近v0.5.0还新增了全文检索和混合检索功能。

今天这篇教程,手把手教你用zvec搭建一个本地AI语义搜索引擎,实现"以文搜文"的核心能力。无需Docker,无需配置服务器,pip安装即用。

一、前置条件



安装依赖:
  1. pip install zvec sentence-transformers
复制代码

二、步骤详解

步骤1:创建向量数据库集合

首先定义数据集合的结构。zvec使用 CollectionSchema 来声明字段:
  1. import zvec
  2. # 定义集合结构
  3. schema = zvec.CollectionSchema(
  4.     name="docs",
  5.     vectors=zvec.VectorSchema(
  6.         "embedding",           # 向量字段名
  7.         zvec.DataType.VECTOR_FP32,  # 数据类型
  8.         384                      # 向量维度(取决于嵌入模型)
  9.     ),
  10.     fields=[
  11.         zvec.FieldSchema("title", zvec.DataType.STRING),
  12.         zvec.FieldSchema("content", zvec.DataType.STRING),
  13.     ]
  14. )
  15. # 创建并打开集合
  16. collection = zvec.create_and_open(
  17.     path="./my_search_db",
  18.     schema=schema
  19. )
复制代码

步骤2:生成文本嵌入并插入数据

使用 sentence-transformers 将文本转为向量,然后存入zvec:
  1. from sentence_transformers import SentenceTransformer
  2. # 加载轻量级嵌入模型(384维)
  3. model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
  4. # 示例文档
  5. documents = [
  6.     {"id": "doc1", "title": "Rust入门指南", "content": "Rust是一门系统编程语言,注重安全和性能..."},
  7.     {"id": "doc2", "title": "Python异步编程", "content": "asyncio是Python标准库中的异步I/O框架..."},
  8.     {"id": "doc3", "title": "向量数据库对比", "content": "zvec、Milvus、Pinecone都是流行的向量数据库..."},
  9. ]
  10. # 批量插入
  11. for doc in documents:
  12.     embedding = model.encode(doc["content"]).tolist()
  13.     collection.insert([
  14.         zvec.Doc(
  15.             id=doc["id"],
  16.             vectors={"embedding": embedding},
  17.             fields={
  18.                 "title": doc["title"],
  19.                 "content": doc["content"]
  20.             }
  21.         )
  22.     ])
  23. print(f"已插入 {len(documents)} 条文档")
复制代码

步骤3:执行语义搜索

输入查询文本,zvec会自动找到语义最相近的文档:
  1. def semantic_search(query, top_k=3):
  2.     # 将查询转为向量
  3.     query_vec = model.encode(query).tolist()
  4.    
  5.     # 执行向量搜索
  6.     results = collection.query(
  7.         zvec.VectorQuery("embedding", vector=query_vec),
  8.         topk=top_k
  9.     )
  10.    
  11.     print(f"\n查询:'{query}'\n{'='*50}")
  12.     for i, r in enumerate(results, 1):
  13.         print(f"{i}. [{r['fields']['title']}] 相似度: {r['score']:.4f}")
  14.         print(f"   {r['fields']['content'][:80]}...\n")
  15. # 测试搜索
  16. semantic_search("如何学习系统编程")
  17. semantic_search("Python并发处理")
复制代码

步骤4:混合检索(向量+全文)

zvec v0.5.0 支持混合检索,同时匹配语义相似度和关键词:
  1. # 先创建全文索引(只需执行一次)
  2. collection.create_index(
  3.     "content_fts",
  4.     zvec.IndexType.FULL_TEXT,
  5.     field="content"
  6. )
  7. # 混合查询
  8. results = collection.query(
  9.     zvec.MultiQuery([
  10.         zvec.VectorQuery("embedding", vector=query_vec, weight=0.7),
  11.         zvec.TextQuery("content", text="Python 异步", weight=0.3)
  12.     ]),
  13.     topk=5
  14. )
复制代码

三、完整可运行代码
  1. #!/usr/bin/env python3
  2. """
  3. zvec 语义搜索引擎 - 完整示例
  4. 依赖: pip install zvec sentence-transformers
  5. """
  6. import zvec
  7. from sentence_transformers import SentenceTransformer
  8. # 1. 初始化
  9. schema = zvec.CollectionSchema(
  10.     name="docs",
  11.     vectors=zvec.VectorSchema("embedding", zvec.DataType.VECTOR_FP32, 384),
  12.     fields=[
  13.         zvec.FieldSchema("title", zvec.DataType.STRING),
  14.         zvec.FieldSchema("content", zvec.DataType.STRING),
  15.     ]
  16. )
  17. collection = zvec.create_and_open(path="./search_db", schema=schema)
  18. model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
  19. # 2. 插入数据
  20. docs = [
  21.     {"id": "1", "title": "Rust所有权机制", "content": "Rust通过所有权系统管理内存,无需垃圾回收器..."},
  22.     {"id": "2", "title": "Python装饰器详解", "content": "装饰器是Python的高阶函数,用于扩展函数功能..."},
  23.     {"id": "3", "title": "Docker容器化部署", "content": "Docker通过容器技术实现应用隔离和快速部署..."},
  24. ]
  25. for d in docs:
  26.     vec = model.encode(d["content"]).tolist()
  27.     collection.insert([zvec.Doc(
  28.         id=d["id"],
  29.         vectors={"embedding": vec},
  30.         fields={"title": d["title"], "content": d["content"]}
  31.     )])
  32. # 3. 搜索
  33. query = "内存管理技术"
  34. qvec = model.encode(query).tolist()
  35. results = collection.query(zvec.VectorQuery("embedding", vector=qvec), topk=3)
  36. print(f"查询: {query}")
  37. for r in results:
  38.     print(f"  {r['fields']['title']} (score: {r['score']:.3f})")
复制代码

四、常见问题



五、总结

通过本教程,你学会了:


zvec的最大优势是极简——pip安装、几行代码就能跑起来,非常适合快速原型和中小型项目。如果你的应用需要海量数据(十亿级以上),可以考虑Milvus或Pinecone;但对于大多数场景,zvec完全够用。

下一步建议:尝试用zvec搭建一个个人知识库搜索,或者给现有项目加上语义搜索能力。有问题欢迎在楼下讨论!

---
参考资料:





欢迎光临 闲社 (https://fzgmgmantis.xianshe.com/) Powered by Discuz! X5.0