我有一个json结构的标准问答对,想通过 BAAI/bge-large-zh-v1.5 将问答对转为向量存储在 milvus 中,然后 另一个系统会提问然后输出回答,这个系统的回答需要和我的
泛域名ssl证书 239元1年送1个月、单域名39元1年,Sectigo(原Comodo证书)全球可信证书,强大的兼容性,高度安全性,如有问题7天内可退、可开发票
加微信VX 18718058521 备注SSL证书
【腾讯云】2核2G4M云服务器新老同享99元/年,续费同价
为了实现您的需求,我们需要分几个步骤来操作:
准备环境:确保安装了必要的库,如
transformers
(用于加载模型),milvus
(用于存储向量),以及json
(用于处理JSON数据)。加载模型:使用
transformers
库加载BAAI/bge-large-zh-v1.5
模型,并准备将文本转换为向量。处理JSON数据:从JSON文件中读取问答对,并使用模型将每个问题转换为向量。
存储向量到Milvus:将转换后的向量存储到Milvus数据库中。
查询与匹配:当新查询到来时,将其转换为向量,然后在Milvus中搜索最相似的向量,并返回对应的答案。
以下是一个简化的代码示例,展示了如何实现上述步骤:
步骤 1: 安装必要的库
首先,确保安装了以下Python库:
pip install transformers milvus pymilvus
步骤 2-4: 加载模型、处理JSON并存储到Milvus
from transformers import AutoTokenizer, AutoModel from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType import json # 加载模型和分词器 tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-large-zh-v1.5") model = AutoModel.from_pretrained("BAAI/bge-large-zh-v1.5") # 连接到Milvus connections.connect(host='localhost', port='19530') # 假设JSON文件结构如下:[{"question": "问题", "answer": "答案"}] with open('qa_pairs.json', 'r', encoding='utf-8') as f: qa_pairs = json.load(f) # 创建Milvus集合 if not Collection.has_collection("qa_vectors"): field_schemas = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True), FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768) # 假设向量维度为768 ] collection_schema = CollectionSchema(fields=field_schemas, description="Question Answer Vectors") Collection.create_collection("qa_vectors", schema=collection_schema) # 存储向量 collection = Collection("qa_vectors") for idx, qa in enumerate(qa_pairs): inputs = tokenizer(qa['question'], return_tensors="pt", padding=True, truncation=True, max_length=512) with torch.no_grad(): outputs = model(**inputs) vector = outputs.last_hidden_state[:, 0, :].numpy() # 取CLS token的向量 collection.insert([idx, vector.tolist()]) # 关闭Milvus连接 connections.disconnect()
步骤 5: 查询与匹配
def find_answer(question): # 连接到Milvus connections.connect(host='localhost', port='19530') collection = Collection("qa_vectors") # 将新问题转换为向量 inputs = tokenizer(question, return_tensors="pt", padding=True, truncation=True, max_length=512) with torch.no_grad(): outputs = model(**inputs) query_vector = outputs.last_hidden_state[:, 0, :].numpy() # 在Milvus中搜索最相似的向量 search_params = {"metric_type": "L2", "params": {"nprobe": 10}} results = collection.search(query_vectors=[query_vector.tolist()], anns_field="vector", top_k=1, params=search_params) # 提取答案 if results and results[0]: answer = qa_pairs[results[0][0].id]['answer'] print(f"Answer: {answer}") else: print("No similar question found.") # 关闭Milvus连接 connections.disconnect() # 示例查询 find_answer("请问如何学习Python?")
注意:
确保Milvus服务正在运行,并且您已经设置了正确的连接参数。
上述代码中的向量维度(768)和模型输出可能需要根据您实际使用的模型进行调整。
torch
需要被导入,但在上面的代码示例中未显示导入语句。确保在代码顶部添加import torch
。对于大型数据集,考虑使用批量处理和优化搜索参数以提高性能。