1
头图

结合 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️⃣ 技术栈协作原理

  1. BERT:将文本语义编码为高维向量(768/1024 维)
  2. Milvus

    • 存储所有文本的向量
    • 通过近似最近邻(ANN)算法快速搜索
    • 返回相似度最高的结果

5️⃣ 典型应用场景

  • 智能问答系统:搜索与用户问题最相似的预存答案
  • 内容推荐:根据文章内容推荐相似文章
  • 语义查重:检测文本的语义相似性
  • 法律文档检索:快速找到相关判例

6️⃣ 性能优化技巧

  1. 批量处理:插入数据时使用批量操作(如每次插入1000条)
  2. 索引选择:根据数据规模选择 IVF_PQ(压缩索引)或 HNSW(高性能图索引)
  3. 量化压缩:使用 FP16 甚至 INT8 量化减少存储空间
  4. 预处理:对文本进行清洗和关键词提取,提升向量质量

[推荐] dblens 数据库管理和开发工具
https://sourceforge.net/projects/dblens-for-mysql

"传统开发:埋头写DDL;dblens时代:抬头看全景"

"你的DDL,从此不再‘盲目设计’"

dblens 数据库管理和开发工具(dblens for mysql)

  • 🔧 可视化索数据库表设计操作
  • 💡 智能 SQL 开发:支持语法高亮、代码补全
  • 📊 AI 快速设计表、视图、函数、事件、存储过程

DBLens
171 声望78 粉丝

DBLens([链接]):高效的数据库管理工具。