结合 BERT 模型 和 Milvus 向量数据库,通过一个 Python 示例 分步骤讲解如何实现「文本相似度搜索」。
整个过程分为:文本向量化 → 存储到 Milvus → 相似度搜索。
1️⃣ 环境准备
安装必要的库:
pip install pymilvus transformers torch
2️⃣ 流程图解
BERT 模型
↓ 将文本转为向量
Milvus 数据库(存储所有向量)
↓ 输入问题文本
Milvus 搜索相似向量 → 返回最相似的答案
3️⃣ 完整代码示例(分步骤解析)
步骤1:使用 BERT 将文本转换为向量
from transformers import AutoTokenizer, AutoModel
import torch
# 加载 BERT 模型和分词器
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
def text_to_vector(text):
# 文本分词并编码
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=128)
# 获取 BERT 输出
with torch.no_grad():
outputs = model(**inputs)
# 取 [CLS] 位置的向量作为文本表征
vector = outputs.last_hidden_state[:, 0, :].numpy().squeeze()
return vector
# 示例:将文本转为 768 维向量
text = "Milvus is a vector database for AI applications."
vector = text_to_vector(text)
print(vector.shape) # 输出 (768,)
步骤2:连接 Milvus 并创建集合(Collection)
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection
# 连接 Milvus 服务器
connections.connect(host="localhost", port="19530")
# 定义集合结构
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=500),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768) # 维度与 BERT 输出一致
]
schema = CollectionSchema(fields, description="Text similarity search with BERT")
collection_name = "bert_demo"
# 创建集合(类似数据库表)
collection = Collection(name=collection_name, schema=schema)
# 创建向量索引(加速搜索)
index_params = {
"index_type": "IVF_FLAT",
"metric_type": "L2",
"params": {"nlist": 128}
}
collection.create_index(field_name="vector", index_params=index_params)
步骤3:插入数据到 Milvus
# 示例文本数据
texts = [
"Milvus is an open-source vector database.",
"BERT is a pre-trained language model.",
"Vector databases accelerate AI applications.",
"Similarity search is used in recommendation systems."
]
# 批量转换为向量并插入
vectors = [text_to_vector(text) for text in texts]
data = [
texts, # 文本字段
vectors # 向量字段
]
# 插入数据
collection.insert(data)
collection.flush() # 确保数据持久化
print(f"已插入 {collection.num_entities} 条数据") # 输出 4
步骤4:执行相似度搜索
# 将搜索语句转换为向量
query_text = "What is Milvus used for?"
query_vector = text_to_vector(query_text)
# 加载集合到内存(首次搜索需要)
collection.load()
# 执行搜索
search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
results = collection.search(
data=[query_vector],
anns_field="vector",
param=search_params,
limit=3, # 返回前3个相似结果
output_fields=["text"] # 同时返回文本字段
)
# 解析结果
for hits in results:
for hit in hits:
print(f"相似度得分: {hit.distance:.4f}, 文本: {hit.entity.get('text')}")
# 示例输出:
# 相似度得分: 0.15, 文本: Milvus is an open-source vector database.
# 相似度得分: 0.28, 文本: Vector databases accelerate AI applications.
# 相似度得分: 1.34, 文本: Similarity search is used in recommendation systems.
4️⃣ 技术栈协作原理
- BERT:将文本语义编码为高维向量(768/1024 维)
Milvus:
- 存储所有文本的向量
- 通过近似最近邻(ANN)算法快速搜索
- 返回相似度最高的结果
5️⃣ 典型应用场景
- 智能问答系统:搜索与用户问题最相似的预存答案
- 内容推荐:根据文章内容推荐相似文章
- 语义查重:检测文本的语义相似性
- 法律文档检索:快速找到相关判例
6️⃣ 性能优化技巧
- 批量处理:插入数据时使用批量操作(如每次插入1000条)
- 索引选择:根据数据规模选择
IVF_PQ
(压缩索引)或HNSW
(高性能图索引) - 量化压缩:使用 FP16 甚至 INT8 量化减少存储空间
- 预处理:对文本进行清洗和关键词提取,提升向量质量
[推荐] dblens 数据库管理和开发工具
https://sourceforge.net/projects/dblens-for-mysql
"传统开发:埋头写DDL;dblens时代:抬头看全景"
"你的DDL,从此不再‘盲目设计’"
dblens 数据库管理和开发工具(dblens for mysql)
- 🔧 可视化索数据库表设计操作
- 💡 智能 SQL 开发:支持语法高亮、代码补全
- 📊 AI 快速设计表、视图、函数、事件、存储过程
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。