稀疏向量 milvus存储检索RAG使用案例

参考:
https://milvus.io/docs/hybrid_search_with_milvus.md

milvus使用不方便:
1)离线计算向量很慢BGEM3EmbeddingFunction
2)milvus安装环境支持很多问题,不支持windows、centos等

在线demo:
https://colab.research.google.com/drive/1OGvOyJH2NUQB1Ft3rqAFLQ_5Dzi8aHk_?usp=sharing

暂时只能在linux ubuntu或mac上使用,因为windows、centos暂时不支持milvus_lite:https://github.com/milvus-io/milvus/issues/34854

安装:

pip install --upgrade pymilvus "pymilvus[model]"  -i https://pypi.tuna.tsinghua.edu.cn/simple

environs-9.5.0 milvus-lite-2.4.10 milvus-model-0.2.5 onnxruntime-1.16.3 pymilvus-2.4.6

数据:

 wget http://qim.fs.quoracdn.net/quora_duplicate_questions.tsv

代码:

##data
import pandas as pdfile_path = "quora_duplicate_questions.tsv"
df = pd.read_csv(file_path, sep="\t")
questions = set()
for _, row in df.iterrows():obj = row.to_dict()questions.add(obj["question1"][:512])questions.add(obj["question2"][:512])if len(questions) > 500:  # Skip this if you want to use the full datasetbreakdocs = list(questions)print(docs[0])# bge m3
from milvus_model.hybrid import BGEM3EmbeddingFunctionef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
dense_dim = ef.dim["dense"]docs_embeddings = ef(docs)
##创建向量库
from pymilvus import (connections,utility,FieldSchema,CollectionSchema,DataType,Collection,
)connections.connect(uri="./milvus.db")fields = [# Use auto generated id as primary keyFieldSchema(name="pk", dtype=DataType.VARCHAR, is_primary=True, auto_id=True, max_length=100),# Store the original text to retrieve based on semantically distanceFieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512),# Milvus now supports both sparse and dense vectors,# we can store each in a separate field to conduct hybrid search on both vectorsFieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR),FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=dense_dim),
]
schema = CollectionSchema(fields)col_name = "hybrid_demo"
if utility.has_collection(col_name):Collection(col_name).drop()
col = Collection(col_name, schema, consistency_level="Strong")sparse_index = {"index_type": "SPARSE_INVERTED_INDEX", "metric_type": "IP"}
col.create_index("sparse_vector", sparse_index)
dense_index = {"index_type": "AUTOINDEX", "metric_type": "IP"}
col.create_index("dense_vector", dense_index)
col.load()#插入数据
for i in range(0, len(docs), 50):batched_entities = [docs[i : i + 50],docs_embeddings["sparse"][i : i + 50],docs_embeddings["dense"][i : i + 50],]col.insert(batched_entities)
print("Number of entities inserted:", col.num_entities)##数据查询from pymilvus import (AnnSearchRequest,WeightedRanker,
)def dense_search(col, query_dense_embedding, limit=10):search_params = {"metric_type": "IP", "params": {}}res = col.search([query_dense_embedding],anns_field="dense_vector",limit=limit,output_fields=["text"],param=search_params,)[0]return [hit.get("text") for hit in res]def sparse_search(col, query_sparse_embedding, limit=10):search_params = {"metric_type": "IP","params": {},}res = col.search([query_sparse_embedding],anns_field="sparse_vector",limit=limit,output_fields=["text"],param=search_params,)[0]return [hit.get("text") for hit in res]def hybrid_search(col,query_dense_embedding,query_sparse_embedding,sparse_weight=1.0,dense_weight=1.0,limit=10,
):dense_search_params = {"metric_type": "IP", "params": {}}dense_req = AnnSearchRequest([query_dense_embedding], "dense_vector", dense_search_params, limit=limit)sparse_search_params = {"metric_type": "IP", "params": {}}sparse_req = AnnSearchRequest([query_sparse_embedding], "sparse_vector", sparse_search_params, limit=limit)rerank = WeightedRanker(sparse_weight, dense_weight)res = col.hybrid_search([sparse_req, dense_req], rerank=rerank, limit=limit, output_fields=["text"])[0]return [hit.get("text") for hit in res]query = input("Enter your search query: ")
print(query)query_embeddings = ef([query])dense_results = dense_search(col, query_embeddings["dense"][0])
sparse_results = sparse_search(col, query_embeddings["sparse"][[0]])
hybrid_results = hybrid_search(col,query_embeddings["dense"][0],query_embeddings["sparse"][[0]],sparse_weight=0.7,dense_weight=1.0,
)

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540909.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop 常用生态组件

Hadoop核心组件 安装 Hadoop 时,通常会自动包含以下几个关键核心组件,特别是如果使用了完整的 Hadoop 发行版(如 Apache Hadoop、Cloudera 或 Hortonworks 等)。这些组件构成了 Hadoop 的核心: 1. HDFS(H…

-bash: apt-get: command not found -bash: yum: command not found

1. 现象: 1.1. 容器内使用apt-get, yum 提示命令未找到 1.2. dockerfile制作镜像时候,使用apt-get, yum同样报此错误。 2.原因: 2.1. linux 分为: 1. RedHat系列: Redhat、Centos、Fedora等 2. Debian系列&#xff1a…

ABAP-Swagger 一种公开 ABAP REST 服务的方法

ABAP-Swagger An approach to expose ABAP REST services 一种公开 ABAP REST 服务的方法 Usage 1: develop a class in ABAP with public methods 2: implement interface ZIF_SWAG_HANDLER, and register the public methods(example method zif_swag_handler~meta) 3: …

初体验《SpringCloud 核心组件Eureka》

文章目录 1.案例准备1.1 案例说明1.2 案例数据库准备1.3 环境搭建1.3.1. 创建一个空的项目1.3.2. 创建Maven工程1.3.3. 配置父工程依赖,SpringCloud版本以及对应的SpringBoot版本1.3.4. 创建公共模块1.3.5. 创建用户模块工程1.3.5.1 引入依赖以及配置文件1.3.5.2 在…

C/C++通过CLion2024进行Linux远程开发保姆级教学

目前来说,对Linux远程开发支持相对比较好的也就是Clion和VSCode了,这两个其实对于C和C语言开发都很友好,大可不必过于纠结使用那个,至于VS和QtCreator,前者太过重量级了,后者更是不用说,主要用于…

解决 GitLab CI/CD 中的 `413 Request Entity Too Large` 错误

解决 GitLab CI/CD 中的 413 Request Entity Too Large 错误 在使用 GitLab CI/CD 时,我们可能会遇到 413 Request Entity Too Large 的错误提示。通常,这是因为 GitLab Runner 在上传工件(artifacts)到 GitLab 服务器时&#xf…

基于 C语言的 Modbus RTU CRC 校验程序

一、CRC校验原理 Modbus RTU是一种常用于工业设备通信的协议,它基于串行通信,如RS-232或RS-485。在Modbus RTU中,CRC(循环冗余校验)是一种常用的错误检测机制,用于确保数据在传输过程中的完整性和准确性。 …

ChatCADChatCAD+:Towards a Universal and Reliable Interactive CAD using LLMs

ChatCAD(论文链接:[2302.07257] ChatCAD: Interactive Computer-Aided Diagnosis on Medical Image using Large Language Models (arxiv.org)) 网络流程图: 辅助阅读: 基于大型语言模型的医学图像交互式计算机辅助诊…

kafka 生产者拦截器

生产者拦截器 kafka 消息发送到Broker 之前大概需要经过 生产者拦截器 、序列化器、分区器等一系列处理。本文主要介绍生产者拦截器 生产者拦截器可以在消息发送之前对消息进行拦截。它可以改变消息内容,包括key , value ,topic 等任何信息 通常不推荐修改key , to…

ansible远程自动化运维、常用模块详解

一、ansible是基于python开发的配置管理和应用部署工具;也是自动化运维的重要工具;可以批量配置、部署、管理上千台主机;只需要在一台主机配置ansible就可以完成其它主机的操作。 1.操作模式: 模块化操作,命令行执行…

VirtualFlow算例 | 水库大坝溃坝数值模拟

为充分利用水资源,人们在天然河流上修建了水库大坝,以达到调控洪水、发电、灌溉、供水、通航、旅游、渔业养殖等目的,水库大坝对人类社会和经济的发展起到了极其重要的推动作用,但是一旦由于某种原因发生溃坝失事,对下游所造成的生命和财产损…

鸿蒙开发(HarmonyOS)组件化浅谈

众所周知,现在组件化在移动开发中是很常见的,那么组件化有哪些好处: 1. 提高代码复用性:组件化允许将应用程序的不同功能模块化,使得这些模块可以在不同的项目中重复使用,从而提高开发效率并减少重复工作。…

MySQL-DDL/DML(数据定义/操作语言)

数据定义语言(DDL-Data Definition Language) 代表关键字:create ,drop,alter 数据操作语言(DML-Data Manipulation Language) 代表关键字:insert,delete,update 1、表的操作 1.1 创建表 create table 表名(字段1,字段2,字段3.....字段n) [charset字符集][type表类…

使用蒙特卡洛模拟和并查集求解渗透阈值

代码由C语言编写 我使用了三个类&#xff0c;分别如下 第一个类&#xff0c;实现了并查集的基本操作。 #pragma once#include<iostream> #include<vector> using namespace std;class UnionFind { public:vector<int> parent; // 用于存储父节点vector<…

生物信息常用编辑器:轻量高效的VS Code

在生物信息学中&#xff0c;编写和调试代码是日常工作的一部分&#xff0c;选择一个合适的编辑器能极大提升效率。Visual Studio Code&#xff08;简称VS Code&#xff09;是一款轻量、灵活且功能强大的代码编辑器&#xff0c;广受开发者欢迎。本文将为大家介绍VS Code的主要功…

50.面向对象进阶训练-学生类

//定义一个长度为3的数组&#xff0c;存储1-3名学生对象作为初始数据 //学生属性&#xff1a;学号 姓名 年龄&#xff0c;其中学号姓名各不相同 //要求&#xff1a;1.再次添加一个学生对象&#xff0c;并在添加的时候进行学号的唯一性判断//2.添加完毕之后&#xff0c;遍历所有…

企业急于采用人工智能,忽视了安全强化

对主要云提供商基础设施上托管的资产的安全分析显示&#xff0c;许多公司为了急于构建和部署 AI 应用程序而打开安全漏洞。常见的发现包括对 AI 相关服务使用默认且可能不安全的设置、部署易受攻击的 AI 软件包以及不遵循安全强化指南。 这项分析由 Orca Security 的研究人员进…

重回极简:华为如何走向全面智能化?

“人类发现地球只是宇宙一员的时候&#xff0c;也是我们距离群星最遥远的时候。” 这个来自天文领域的喟叹&#xff0c;今天同样出现在行业与企业的智能化之路上。在这个时代坐标上&#xff0c;AI大模型技术极速成熟&#xff0c;AIGC和AI Agent等应用受到了各个行业的巨大期待。…

SpringBoot 数据库表结构文档生成

官方地址&#xff1a;https://github.com/pingfangushi/screw screw 螺丝钉&#xff0c;支持以下数据库 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB&#xff08;2016&#xff09; 生产文档支持 html word markdown 开始 添加依赖 <!-- 螺丝钉 --><…

PyCharm部分快捷键冲突问题

1.问题起因 今天在用PyCharm&#xff0c;编写python程序的时候&#xff0c;发现快捷间冲突&#xff0c;随后在CSDN上查找了一些资料&#xff0c;博主第一个说是搜狗输入法冲突&#xff0c;经过其内容尝试之后发现并不是这样啊&#xff0c;然后我有进行了一些资料案例的查询&am…