使用Milvus和Flask构建向量数据库

360影视 日韩动漫 2025-05-14 14:55 1

摘要:以下是一个使用Milvus和Flask构建简易向量数据库的步骤指南,模仿《从零构建向量数据库》的核心思路,但基于 Milvus 实现:

以下是一个使用 MilvusFlask 构建简易向量数据库的步骤指南,模仿《从零构建向量数据库》的核心思路,但基于 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 简化了底层实现。可根据具体需求扩展为完整应用系统。

来源:老客数据一点号

相关推荐