LLM之RAG实战(四十一)| 使用LLamaIndex和Gemini构建高级搜索引擎

news2024/11/14 14:11:46

       Retriever 是 RAG(Retrieval Augmented Generation)管道中最重要的部分。在本文中,我们将使用 LlamaIndex 实现一个结合关键字和向量搜索检索器的自定义检索器,并且使用 Gemini大模型来进行多个文档聊天。

通过本文,我们将了解到如下内容:

  • 深入了解 RAG 管道中 Retriever 和 Generator 组件在上下文生成响应中的作用;
  • 学习集成关键字矢量搜索技术以开发自定义检索器,从而提高 RAG 应用程序中搜索的准确性;
  • 熟练掌握使用 LlamaIndex 进行数据摄取,提供给LLMs上下文信息;
  • 了解自定义检索器在通过混合搜索机制减轻LLM响应中的幻觉方面的重要性;
  • 探索高级检索器实现,例如rerank和 HyDE,以增强 RAG 中的文档相关性;
  • 了解如何在 LlamaIndex 中集成 Gemini LLM 和嵌入,以生成响应和存储数据,从而提高 RAG 功能;
  • 开发自定义检索器配置的决策技能,包括在 AND 和 OR 操作之间进行选择以优化搜索结果。

一、retriever的重要性

       要开发自定义retriever,确定最适合我们需求的retriever类型至关重要。这里,我们将实现一个集成关键字搜索和矢量搜索的混合搜索。

       矢量搜索根据相似性或语义搜索来识别用户查询的相关文档,而关键字搜索则根据术语出现的频率来查找文档。使用 LlamaIndex 可以通过两种方式实现这种集成。为混合搜索生成自定义检索器时,一个重要的决策是在使用 AND 或 OR 操作之间进行选择:

  • AND 操作:此方法检索包含所有指定术语的文档,使其更具限制性,但确保高度相关性。可以将其视为关键字搜索和矢量搜索之间的结果交集;
  • OR 操作:此方法检索包含任何指定术语的文档,从而增加结果的广度,但可能会降低相关性。可以将其视为关键字搜索和矢量搜索之间的结果联合。

二、构建自定义retriever

       现在让我们使用 LlamaIndex 构建自定义retriever,大致需要如下步骤:

2.1 安装所需的包

       在我们的例子中,使用 LlamaIndex 来构建自定义检索器,使用 Gemini 来构建嵌入模型和LLM推理,并使用 PyPDF 来构建数据连接器,因此,需要安装所需的库。

!pip install llama-index!pip install llama-index-multi-modal-llms-gemini!pip install llama-index-embeddings-gemini

2.2 设置Google API密钥

       利用 Google Gemini 作为大型语言模型来生成响应,并作为嵌入模型,使用 LlamaIndex 将数据转换和存储在vector数据库或内存中。

如果没有Google API Key,可以在这里(http://ai.google.dev/)申请。

from getpass import getpassGOOGLE_API_KEY = getpass("Enter your Google API:")

2.3 加载数据并创建文档节点

       在 LlamaIndex 中,数据加载是使用 SimpleDirectoryLoader 完成的。首先,需要创建一个文件夹并将任何格式的数据上传到此数据文件夹中。在我们的示例中,我们将把一个 PDF 文件上传到 data 文件夹中。加载文档后,将文档拆分为更小的段,将其解析为节点。节点是在 LlamaIndex 框架中定义的数据架构。

       最新版本的 LlamaIndex 更新了其代码结构,现在包括节点解析器、嵌入模型和LLM设置中的定义。

from llama_index.core import SimpleDirectoryReaderfrom llama_index.core import Settingsdocuments = SimpleDirectoryReader('data').load_data()nodes = Settings.node_parser.get_nodes_from_documents(documents)

2.4 设置嵌入模型和大型语言模型

        Gemini 有各种型号,包括 gemini-pro、gemini-1.0-pro、gemini-1.5、视觉模型等。这里,我们将使用默认模型并提供 Google API Key。对于 Gemini 中的嵌入模型,我们目前使用的是 embedding-001。

from llama_index.embeddings.gemini import GeminiEmbeddingfrom llama_index.llms.gemini import GeminiSettings.embed_model = GeminiEmbedding(    model_name="models/embedding-001", api_key=GOOGLE_API_KEY)Settings.llm = Gemini(api_key=GOOGLE_API_KEY)

2.5 定义Storage context,并存储数据

       一旦数据被解析为节点,LlamaIndex 就会提供一个存储上下文,它提供默认的文档存储,用于存储数据的向量嵌入。此存储上下文将数据保留在内存中,以便以后对其进行索引。

from llama_index.core import StorageContextstorage_context = StorageContext.from_defaults()storage_context.docstore.add_documents(nodes)

       为了构建自定义检索器以执行混合搜索,我们需要创建两个索引。第一个可以执行向量搜索的向量索引,第二个可以执行关键字搜索的关键字索引。为了创建索引,我们需要存储上下文和节点文档,以及嵌入模型和LLM的默认设置。

from llama_index.core import SimpleKeywordTableIndex, VectorStoreIndexvector_index = VectorStoreIndex(nodes, storage_context=storage_context)keyword_index = SimpleKeywordTableIndex(nodes, storage_context=storage_context)

2.6 构建自定义Retriever

       要使用 LlamaIndex 构建用于混合搜索的自定义检索器,我们首先需要定义架构,尤其是配置合适的节点。需要矢量索引检索器和关键字检索器来执行混合搜索,是通过指定模式(AND 或 OR)来实现这两种检索器的组合,集成这两种技术以最大限度地减少幻觉。

       一旦节点配置好后,我们就可以使用 vector 和 keyword 检索器查询每个节点 ID 的数据。然后,根据所选模式,最终确定自定义检索器。

from llama_index.core import QueryBundlefrom llama_index.core.schema import NodeWithScorefrom llama_index.core.retrievers import (    BaseRetriever,    VectorIndexRetriever,    KeywordTableSimpleRetriever,)from typing import Listclass CustomRetriever(BaseRetriever):    def __init__(        self,        vector_retriever: VectorIndexRetriever,        keyword_retriever: KeywordTableSimpleRetriever,        mode: str = "AND") -> None:               self._vector_retriever = vector_retriever        self._keyword_retriever = keyword_retriever        if mode not in ("AND", "OR"):            raise ValueError("Invalid mode.")        self._mode = mode        super().__init__()    def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:        vector_nodes = self._vector_retriever.retrieve(query_bundle)        keyword_nodes = self._keyword_retriever.retrieve(query_bundle)        vector_ids = {n.node.node_id for n in vector_nodes}        keyword_ids = {n.node.node_id for n in keyword_nodes}        combined_dict = {n.node.node_id: n for n in vector_nodes}        combined_dict.update({n.node.node_id: n for n in keyword_nodes})        if self._mode == "AND":            retrieve_ids = vector_ids.intersection(keyword_ids)        else:            retrieve_ids = vector_ids.union(keyword_ids)        retrieve_nodes = [combined_dict[r_id] for r_id in retrieve_ids]        return retrieve_nodes

2.7 定义retriever

       定义好自定义检索器类后,我们需要实例化检索器并合成查询引擎。响应合成器用于根据用户查询和给定的文本块集生成LLM响应。Response Synthesizer 的输出是一个 Response 对象,该对象将自定义检索器作为参数之一。

from llama_index.core import get_response_synthesizerfrom llama_index.core.query_engine import RetrieverQueryEnginevector_retriever = VectorIndexRetriever(index=vector_index, similarity_top_k=2)keyword_retriever = KeywordTableSimpleRetriever(index=keyword_index)# custom retriever => combine vector and keyword retrievercustom_retriever = CustomRetriever(vector_retriever, keyword_retriever)# define response synthesizerresponse_synthesizer = get_response_synthesizer()custom_query_engine = RetrieverQueryEngine(    retriever=custom_retriever,    response_synthesizer=response_synthesizer,)

2.8 运行自定义检索查询引擎

       最后,我们已经开发好了自定义的retriever,它可以显著减少幻觉。为了测试其有效性,我们使用一个包括上下文的提示和一个不包括上下文的提示来评估生成的响应。

query = "what does the data context contain?"print(custom_query_engine.query(query))print(custom_query_engine.query("what is science?")

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

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

相关文章

人工智能在三级淋巴结:肿瘤浸润淋巴细胞领域的系统研究进展|顶刊速递·24-07-08

小罗碎碎念 本期文献主题:人工智能在三级淋巴结/肿瘤浸润淋巴细胞领域的系统分析 关于三级淋巴结和肿瘤浸润淋巴细胞的文献,会是接下来的分析重点,期间也会穿插临床文献&项目复现的推文。 另外再说点科研道路上的题外话,也算是…

Python 爬虫 tiktok API接口获取tiktok用户关注列表

此接口可获取tiktok用户关注列表。若有需要,请点击文末链接联系我们。 详细采集页面如下https://www.tiktok.com/quanap_official 请求API http://api.xxxx.com/tt/user/following?user_id7252644648840381445&count10&offset0&tokentest 请求参数 返…

拿客户电脑,半小时完成轮播组件开发!被公司奖励500!

故事背景 原文链接:拿客户电脑,用豆包IDE逆天改命完成需求紧急开发!被公司奖励500! 前几天,业务拉了一个大客户,客户需要先看我们做的样本项目(类似于官网首页),然后才会…

更新GCC版本问题处理(Could not resolve host: mirrorlist.centos.org;)更换SCL配置源/SCL后yum使用不了

SCL: 在 Linux 系统中,更新 GCC(GNU Compiler Collection)编译器需要使用 Software Collections (SCL) 库的原因主要有以下几点: https://wiki.centos.org/AdditionalResources/Repositories/SCLhttps://wiki.centos…

游戏开黑语音-使用云服务器部署teamspeak服务(系统Ubuntu 20.04 LTS)

目录 前置物品服务器调整及部署1.重装系统2.换源3.下载teamspeak服务端并部署 连接服务器参考 前置物品 一台云服务器(系统:Ubuntu 20.04 LTS) 服务器调整及部署 1.重装系统 在腾讯云官网的主机控制台内,选择重装系统 (由于之前为了快速和…

重庆交通大学数学与统计学院携手泰迪智能科技共建的“智能工作室”

2024年7月4日,重庆交通大学数学与统计学院与广东泰迪智能科技股份有限公司携手共建的“智能工作室”授牌仪式在南岸校区阳光会议室举行。此举标志着数统学院与广东泰迪公司校企合作新篇章的开启,也预示着学院在智能科技教育领域的深入探索和实践。 广东…

电源中电感底部需要铺地平面吗?

感有交变电流,电感底部铺铜会在地平面上产生涡流,涡流效应会影响功率电感的电感量,涡流也会增加系统的损耗,同时交变电流产生的噪声会增加地平面的噪声,会影响其他信号的稳定性。 在EMC方面来看,在电感底部…

作为产品经理,如何用大模型给我们赋能?非常详细,收藏我这篇就够了

作为一名产品经理,如果您考虑转行至大模型领域,您将能够将产品管理技能与大模型技术相结合,从而在产品开发和创新方面获得一系列好处。以下是转行大模型对产品经理的一些潜在益处: 更深入的技术理解:了解大模型技术将…

deepspeed huggingface传入参数 optimizer和lr_scheduler测试

Trainer中 首先: WarmupDecayLR --lr_scheduler_type linear WarmupLR --lr_scheduler_type constant_with_warmup 1 TrainArgument不传lr_scheduler_type、optim,warmup_steps15 ds config文件中定义如下: 注意:如果不在Trai…

java-spring boot光速入门教程(超详细!!)

目录 一、引言 1.1 初始化配置 1.2 整合第三方框架 1.3 后期维护 1.4 部署工程 1.5 敏捷式开发 二、SpringBoot介绍 spring boot 2.1 搭建一个spring boot工程 2.2 使用idea创建项目 2.3 在线创建姿势 2.4 项目的目录结构 2.5 项目的运行方式 2.6 yml文件格式 2…

无线麦克风哪个品牌音质最好,揭秘手机收音麦克风哪个牌子好!

随着全球直播和短视频行业的蓬勃发展,领夹麦克风因其便携性和出色的录音质量而备受青睐。用户在各种场合下追求清晰、真实的录音效果,领夹麦克风无疑是一个理想的选择。 然而,面对市场上琳琅满目的品牌和型号,想要挑选一款性能优…

计算机网络之无线局域网

1.无线局域网工作方式 工作方式:每台PC机上有一个无线收发机(无线网卡), 它能够向网络上的其他PC机发送和接受无线电信号。 与有线以太网相似,无线局域网也是打包方式发送数据的。每块网卡都有一个永久的、唯一的ID号…

【原理+使用】DeepCache: Accelerating Diffusion Models for Free

论文:arxiv.org/pdf/2312.00858 代码:horseee/DeepCache: [CVPR 2024] DeepCache: Accelerating Diffusion Models for Free (github.com) 介绍 DeepCache是一种新颖的无训练且几乎无损的范式,从模型架构的角度加速了扩散模型。DeepCache利…

小白·使用Tesseract-OCR工具读取图片

1、直接pip安装 工具使用vscode和pycharm都可以。 这里介绍使用vscode的方法。 (1)、调出终端 (2)、安装依赖 (3)、编写代码 import pyocr import pyocr.builders from PIL import Image import re# 获取Tesseract-OCR工具 tools pyocr.get_available_tools() tool tools[…

使用 MFA 保护对企业应用程序的访问

多因素身份验证(MFA)是在授予用户访问特定资源的权限之前,使用多重身份验证来验证用户身份的过程,仅使用单一因素(传统上是用户名和密码)来保护资源,使它们容易受到破坏,添加其他身份…

C# 实现基于exe内嵌HTTPS监听服务、从HTTP升级到HTTPS 后端windows服务

由于客户需要把原有HTTP后端服务升级为支持https的服务,因为原有的HTTP服务是一个基于WINDOWS服务内嵌HTTP监听服务实现的,并不支持https, 也不像其他IIS中部署的WebAPI服务那样直接加载HTTPS证书,所以这里需要修改原服务支持https和服务器环…

Java基础-Java中的常用类(上)

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 String类 创建字符串 字符串长度 连接字符串 创建格式化字符串 String 方法 System类 常用方法 方…

谨慎投稿!这本EI期刊正在被“劫持”!

Journsl ofTisniin lniversity Seience and Technology《天津大学学报(自然科学与工程技术版)》创刊于l955年,月刊,全国核心期刊,天津市一级期刊。该刊是由天津大学主办的综合性学术刊物,主要刊登自然科学和…

【第三版 系统集成项目管理工程师】第4章 信息系统架构

持续更新。。。。。。。。。。。。。。。 【第三版】系统集成项目管理工程师 考情分析4.1架构基础4.1.1指导思想(非重点) P1364.1.2设计原则(非重点) P1364.1.3建设目标(非重点) P1374.1.4总体框架 P138练习…

SaaS产品和独立部署型产品有什么区别,该怎么选择?

随着云计算和软件服务的多样化,产品形式主要划分SaaS型(开通即用)和独立部署(完整交付)两种模式,那么SaaS产品和独立部署产品有哪些区别,我们在选择产品的时候应该如何去抉择?本文我…