RAG 查询检索模块 - 检索 - Pinecone 混合检索方案

2024-06-07 15:04

本文主要是介绍RAG 查询检索模块 - 检索 - Pinecone 混合检索方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

虽然向量检索有助于检索给定查询的语义相关块,但它有时在匹配特定关键字词方面缺乏准确性。

为了解决这个问题,混合检索是一种解决方案。该策略充分利用了矢量搜索和关键字搜索等不同检索技术的优势,并将它们智能地组合在一起。使用这种混合方法,您仍然可以匹配相关的关键字,同时保持对查询意图的控制。 混合搜索的案例,可以参考 Pinecone 的入门指南

Pinecone 混合检索方案

该博客讨论了混合搜索的概念和实现,混合搜索结合了矢量搜索(密集检索)和传统搜索方法的优势,以提高信息检索性能,尤其是在缺乏用于微调模型的特定领域数据的情况下。

  • 矢量搜索与传统搜索: 当使用特定领域的数据集对模型进行微调时,矢量搜索在检索相关信息方面表现出色。然而,由于缺乏经过微调的模型,矢量搜索在处理“域外”任务时显得力不从心。传统的搜索方法,如 BM25,可以处理新的领域,但在提供类似人类的智能检索方面能力有限。

混合搜索解决方案: 该博客介绍了一种将密集(向量)和稀疏(传统)搜索方法结合为混合搜索方法的解决方案。这种方法旨在利用矢量搜索的性能潜力,同时保持传统搜索对新领域的适应性。

实现过程

使用支持单一稀疏密集索引的 Pinecone 演示了混合搜索的实施。这种方法简化了结合密集和稀疏搜索引擎所需的工程设计工作,并允许通过 alpha 参数轻松调整密集和稀疏结果之间的权重。

在这里插入图片描述

步骤 1:数据集准备

本博客将介绍如何为混合搜索准备一个数据集(使用 Hugging Face Datasets 的 pubmed_qa 数据集),包括创建数据的密集和稀疏向量表示。

from datasets import load_dataset  # !pip install datasets
pubmed = load_dataset('pubmed_qa','pqa_labeled',split='train'
)
pubmed

数据格式如下所示:

Dataset({ features: ['pubid', 'question', 'context', 'long_answer', 'final_decision'], num_rows: 1000 })

步骤 2:稀疏向量

稀疏向量嵌入是通过标记化逻辑创建的,博客选择了一种使用 Hugging Face Transformers 的 BERT 标记化器的直接方法。

from transformers import BertTokenizerFast  # !pip install transformers# load bert tokenizer from huggingface
tokenizer = BertTokenizerFast.from_pretrained('bert-base-uncased'
)
# tokenize the context passage
inputs = tokenizer(contexts[0], padding=True, truncation=True,max_length=512
)

由于我们只进行 tokenize,因此需要 input_ids,并将输入 ID 表示转换为整数 ID 值的唯一单词或子词 token。Pinecone 期望接收字典格式的稀疏向量。例如,向量:

[0, 2, 9, 2, 5, 5]
# 将会转换为
{ "0": 1, "2": 2, "5": 2, "9": 1 }

每个 token 由字典中的单个 key 表示,并且其频率由相应的 value 来计数。作者对 input_ids 应用相同的转换,如下所示:

from collections import Counter# convert the input_ids list to a dictionary of key to frequency values
sparse_vec = dict(Counter(input_ids))
sparse_vec
{101: 1, 16984: 1, 3526: 2, 2331: 2, 1006: 10, ... }

可以将所有这些逻辑重新格式化为两个函数:

  • build_dict:将输入 ID 转换为字典;
  • generate_sparse_vectors:处理标记化和字典创建。
def build_dict(input_batch):# store a batch of sparse embeddingssparse_emb = []# iterate through input batchfor token_ids in input_batch:indices = []values = []# convert the input_ids list to a dictionary of key to frequency valuesd = dict(Counter(token_ids))for idx in d:indices.append(idx)values.append(d[idx])sparse_emb.append({'indices': indices, 'values': values})# return sparse_emb listreturn sparse_embdef generate_sparse_vectors(context_batch):# create batch of input_idsinputs = tokenizer(context_batch, padding=True,truncation=True,max_length=512, special_tokens=False)['input_ids']# create sparse dictionariessparse_embeds = build_dict(inputs)return sparse_embeds

generate_sparse_vectors 函数中指定 special_tokens=False 来删除特殊 token 101、102、103和0。这些都是 BERT Transformer 模型明确要求的 token,但在构建稀疏向量时没有任何意义。

步骤 3:密集向量

密集向量嵌入使用 sentence transformer 模型(“multi-qa-MiniLM-L6-cos-v1”)生成,可为每个上下文生成 384 维密集向量。

# !pip install sentence-transformers
from sentence_transformers import SentenceTransformer# load a sentence transformer model from huggingface
model = SentenceTransformer('multi-qa-MiniLM-L6-cos-v1'
)emb = model.encode(contexts[0])
emb.shape

步骤 4:创建稀疏密集索引

该博客详细介绍了如何在 Pinecone 中创建和使用稀疏密集索引,包括使用稀疏向量和密集向量倒插数据。

import pinecone  # !pip install pinecone-clientpinecone.init(api_key="YOUR_API_KEY",  # app.pinecone.ioenvironment="YOUR_ENV"  # find next to api key in console
)
# choose a name for your index
index_name = "hybrid-search-intro"# create the index
pinecone.create_index(index_name = index_name,dimension = 384,  # dimensionality of dense modelmetric = "dotproduct",pod_type = "s1"
)

要使用启用稀疏-密集的索引,必须将 pod_type 设置为 s1 或 p1,并将 metric 设置为使用点积。

步骤 5:进行查询

混合搜索中的查询包括查询的密集向量和稀疏向量表示。该博客演示了如何执行查询和调整 alpha 参数,以平衡密集和稀疏搜索结果的影响。

在这里插入图片描述

def hybrid_scale(dense, sparse, alpha: float):# check alpha value is in rangeif alpha < 0 or alpha > 1:raise ValueError("Alpha must be between 0 and 1")# scale sparse and dense vectors to create hybrid search vecshsparse = {'indices': sparse['indices'],'values':  [v * (1 - alpha) for v in sparse['values']]}hdense = [v * alpha for v in dense]return hdense, hsparsedef hybrid_query(question, top_k, alpha):# convert the question into a sparse vectorsparse_vec = generate_sparse_vectors([question])[0]# convert the question into a dense vectordense_vec = model.encode([question]).tolist()# scale alpha with hybrid_scaledense_vec, sparse_vec = hybrid_scale(dense_vec, sparse_vec, alpha)# query pinecone with the query parametersresult = pinecone.query(vector=dense_vec,sparse_vector=sparse_vec[0],top_k=top_k,include_metadata=True)# return search results as jsonreturn result

文章结论

混合搜索通过与传统搜索方法相结合,为克服矢量搜索在域外场景中的局限性提供了一种很有前途的方法。这篇博客为实现混合搜索提供了全面的指导,通过智能地结合矢量和传统搜索方法,强调了混合搜索在改进各领域信息检索方面的潜力。

原始链接

https://www.pinecone.io/learn/hybrid-search-intro/

这篇关于RAG 查询检索模块 - 检索 - Pinecone 混合检索方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039515

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

ural 1026. Questions and Answers 查询

1026. Questions and Answers Time limit: 2.0 second Memory limit: 64 MB Background The database of the Pentagon contains a top-secret information. We don’t know what the information is — you

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>