摘要:以下是一个使用Milvus和Flask构建简易向量数据库的步骤指南,模仿《从零构建向量数据库》的核心思路,但基于 Milvus 实现:
以下是一个使用 Milvus 和 Flask 构建简易向量数据库的步骤指南,模仿《从零构建向量数据库》的核心思路,但基于 Milvus 实现:
1. 环境准备
安装依赖
bash
pip install pymilvus flask sentence-transformers
pymilvus: Milvus 的 Python SDKflask: 轻量级 Web 框架sentence-transformers: 用于生成文本向量(如 BERT 模型)启动 Milvus 服务
使用 Docker 快速启动 Milvus 单机版:bash
docker run -d --name milvus \
-p 19530:19530 \
-p 9091:9091 \
milvusdb/milvus:latest
2. 构建 Flask 应用框架
创建 app.py 文件,初始化 Flask 和 Milvus 连接:
python
from flask import Flask, request, jsonify
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility
from sentence_transformers import SentenceTransformer
app = Flask(__name__)
# 连接 Milvus
connections.connect(host='localhost', port='19530')
# 初始化文本向量模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 定义集合(Collection)结构
collection_name = "book_chapters"
dim = 384 # 模型输出维度
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=500),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
schema = CollectionSchema(fields, description="Book chapters vector search")
collection = Collection(collection_name, schema)
# 创建索引
index_params = {
"index_type": "IVF_FLAT",
"metric_type": "L2",
"params": {"nlist": 128}
}
collection.create_index("embedding", index_params)
3. 实现核心功能
插入数据 API
python
@app.route('/insert', methods=['POST'])
def insert_data:
text = request.json['text']
# 生成向量
embedding = model.encode(text).tolist
# 插入 Milvus
data = [
[text],
[embedding]
]
mr = collection.insert(data)
return jsonify({"status": "success", "id": mr.primary_keys[0]})
搜索 API
python
@app.route('/search', methods=['POST'])
def search:
query_text = request.json['query']
top_k = request.json.get('top_k', 5)
# 生成查询向量
query_embedding = model.encode(query_text).tolist
# 执行搜索
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(
data=[query_embedding],
anns_field="embedding",
param=search_params,
limit=top_k,
output_fields=['text']
)
# 整理结果
ret =
for hits in results:
for hit in hits:
ret.append({
"id": hit.id,
"text": hit.entity.get('text'),
"distance": hit.distance
})
return jsonify(ret)
4. 运行与测试
启动 Flask
bash
export FLASK_APP=app.py
flask run --port 5000
插入测试数据
bash
curl -X POST http://localhost:5000/insert \
-H "Content-Type: application/json" \
-d '{"text": "机器学习的基本概念包括监督学习和无监督学习"}'
执行搜索
bash
curl -X POST http://localhost:5000/search \
-H "Content-Type: application/json" \
-d '{"query": "什么是监督学习", "top_k": 3}'
5. 扩展优化方向
数据预处理:添加文本清洗/分块逻辑持久化存储:将原始文本存入关系型数据库,Milvus 只存向量性能优化:Ø 调整 Milvus 索引参数(nlist/nprobe)
Ø 使用 GPU 加速向量生成
API 增强:Ø 添加 JWT 认证
Ø 支持批量插入
前端界面:使用 Vue/React 构建搜索界面关键概念说明
组件作用Milvus负责向量存储与相似性搜索Sentence-BERT将文本转换为高维向量Flask提供 REST API 接口层IVF_FLAT 索引平衡精度与速度的典型索引类型这个实现保留了向量数据库的核心功能(向量存储、相似性搜索),同时利用 Milvus 简化了底层实现。可根据具体需求扩展为完整应用系统。
来源:老客数据一点号