实现从 Milvus 中获取数据,并基于嵌入向量重新排序的功能

为了实现从 Milvus 中获取数据,并基于嵌入向量重新排序的功能,你可以参考以下步骤对原代码进行完善和修改。

关键问题和修改:

  1. Milvus 数据获取:确保 query() 能获取插入的数据,尤其是向量。确保 Collection 正确连接,并且 output_fields 中字段名匹配 Milvus 中的定义。
  2. 加载数据:插入数据后,需要通过 load() 加载数据,确保数据在 Milvus 中可见。
  3. 优化向量查询逻辑:可以考虑使用 search() 方法,而不是直接从 Milvus 查询所有数据,再计算相似度。search() 可以直接根据查询文本的向量进行向量相似度搜索。

代码修改:

import torch
from transformers import AutoTokenizer, AutoModel
import numpy as np
from pymilvus import Collection, connections


# 计算余弦相似度的函数
def cos_sim(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))


# 生成文本的嵌入向量
def embed_texts(texts, model, tokenizer):
    """
    使用 Jina-embeddings-v2 模型将文本转化为嵌入向量
    """
    inputs = tokenizer(texts, return_tensors='pt'
### Milvus 导入 CSV 数据的方法 Milvus 支持通过多种方式导入数据,其中包括直接使用 `insert()` 方法、批量插入工具(Bulk Insert),或者利用外部文件(如 CSV 或 Parquet)。以下是关于如何将 CSV 数据导入到 Milvus 的具体方法: #### 使用 Pandas 和 PyMilvus 将 CSV 转换为向量导入 可以通过 Python 库 `Pandas` 加载 CSV 文件,将其转换为适合 Milvus 插入的数据结构。 ```python import pandas as pd from pymilvus import Collection, FieldSchema, DataType, CollectionSchema, connections # 建立连接 connections.connect() # 定义集合字段 fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields=fields, description="Example collection with embeddings") collection_name = "csv_import_example" collection = Collection(name=collection_name, schema=schema) # 读取 CSV 文件 df = pd.read_csv('data.csv') # 确保 DataFrame 中有对应的列名匹配 Milvus 字段 ids = df['id'].tolist() embeddings = df[['dim_{}'.format(i) for i in range(128)]].values.tolist() # 假设嵌入列为 'dim_0' 到 'dim_127' # 插入数据 data_to_insert = [ids, embeddings] mr = collection.insert(data_to_insert) print(f"Inserted {len(ids)} records into the collection.") ``` 此脚本假设 CSV 文件中的每一行都对应一条记录,其中一列表示 ID,其余表表示向量的各个维度[^1]。 --- #### 使用 Bulk Insert 工具导入 CSV 数据 如果需要处理大规模数据集,则可以考虑使用 Milvus 提供的 Bulk Insert 功能。该功能允许用户准备特定格式的文件(支持 JSON、CSV 和其他常见格式),通过命令行或 API 执行批量化导入操作。 ##### 准备 CSV 文件 确保 CSV 文件满足以下条件: - 每一行代表一个实体。 - 各列应按照定义好的 Schema 排序。 - 如果存在主键字段(Primary Key),则需显式指定其值。 例如,对于如下 Schema: ```plaintext { "fields": [ {"name": "id", "type": "INT64", "is_primary": true}, {"name": "vector", "type": "FLOAT_VECTOR", "params": {"dim": 128}} ] } ``` 相应的 CSV 文件可能看起来像这样: ```csv id,vector_dim_0,...,vector_dim_127 1,-0.1,0.2,... 2,0.3,-0.4,... ... ``` ##### 创建配置文件 创建一个描述目标集合及其映射关系的 YAML 配置文件: ```yaml collections: - name: csv_import_example fields: id: type: INT64 file_field: id vector: type: FLOAT_VECTOR file_fields: ["vector_dim_0", ..., "vector_dim_127"] dim: 128 files: - path: /path/to/data.csv format: csv ``` ##### 执行 Bulk Load 运行以下命令启动批量加载过程: ```bash milvus_bulk_insert --config bulk_insert_config.yaml ``` 完成之后,可通过查询日志确认状态,验证数据是否成功写入 Milvus 实例[^1]。 --- #### 性能优化建议 当面对超大尺寸的数据集时,推荐采取分片策略来提升效率。例如,在实验环境中观察到不同维度和数量级下的平均耗时情况如下所示[^2]: | 维度 | 行数 | 数据大小 (MB) | 导入时间 (s) | |------|------------|---------------|--------------| | 64 | ~1M | ~130 | ~1.39 | | 128 | ~1M | ~260 | ~1.84 | | 256 | ~1M | ~526 | ~1.68 | 基于以上表格可以看出,随着维度增加,单位时间内可处理的数据规模会有所下降;因此实际应用过程中可根据硬件资源调整批次大小以平衡吞吐率与延迟表现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值