基于Milvus 向量数据库和Sentence Transformer构建智能问答系统
在当今信息爆炸的时代,智能问答系统成为了提高信息获取效率的重要工具。本文将详细介绍如何使用Python结合Milvus向量数据库和Sentence Transformer模型来构建一个智能问答系统。我们将逐步解析代码,探讨背后的技术原理,以及如何优化和扩展这个系统。
一、技术栈概述
- Sentence Transformer:这是一个强大的自然语言处理模型,能够将文本句子转换为固定长度的向量表示。通过预训练和微调,它可以有效地捕捉句子的语义信息,使得语义相似的句子在向量空间中距离相近。例如,在我们的问答系统中,它负责将问题转换为向量,以便后续在向量空间中进行相似度计算。
- Milvus:作为一款高性能的向量数据库,Milvus专注于向量的存储和检索。它能够快速地在大规模向量数据集中找到与查询向量最相似的向量,大大提高了检索效率。在我们的系统中,Milvus存储了所有问题的向量表示,为快速查询相似问题提供了支持。
- 其他工具:代码中还使用了
csv
模块来读取问答数据文件,json
模块来处理和存储数据映射,torch
则为模型的运行提供了计算支持。
二、代码解析
- 数据读取
qa_pairs = []
with open('./qa.csv', newline='', encoding='utf-8') as csvfile:reader = csv.DictReader(csvfile)for row in reader:qa_pairs.append({"question": row["question"], "answer": row["answer"]})
这段代码从qa.csv
文件中读取问答对数据,将每个问题和对应的答案存储在qa_pairs
列表中。这里使用csv.DictReader
方便地将CSV文件的每一行映射为字典,便于后续处理。
2. 模型加载与设备配置
device = "cuda" if torch.cuda.is_available() else "cpu"
model = SentenceTransformer(MODEL_PATH, device=device)
代码首先判断是否有GPU可用,如果有则使用GPU加速模型运算,否则使用CPU。然后加载指定路径(MODEL_PATH
)的Sentence Transformer模型,并将其部署到相应的设备上。
3. Milvus连接与集合操作
connections.connect(alias="default",host='192.168.28.1',port='19530'
)def is_collection_exists(collection_name):from pymilvus import utilityreturn utility.has_collection(collection_name)
这段代码建立了与Milvus服务的连接,指定了连接的别名、主机和端口。is_collection_exists
函数用于检查指定名称的集合是否已经存在于Milvus中,为后续创建或加载集合提供依据。
4. 创建嵌入与索引
def create_embeddings_and_index():try:questions = [pair['question'] for pair in qa_pairs]question_embeddings = model