使用LangChain和Llama-Index实现多重检索RAG

大家好,在信息检索的世界里,查询扩展技术正引领着一场效率革命。本文将介绍这一技术的核心多查询检索,以及其是如何在LangChain和Llama-Index中得到应用的。

1.查询扩展

查询扩展是一种信息检索技术,通过在原始查询的基础上增加相关或同义的词汇和短语来优化搜索结果。这种方法能够丰富查询的语义,提高检索系统的准确性和相关性。

在查询扩展的众多策略中,多查询检索是其中的一种。它通过生成多个相关的查询请求,从而拓宽搜索范围,帮助用户更全面地获取所需信息。这种技术尤其适用于处理复杂的查询需求,能够有效提高信息检索的效率和质量。

2.机制

系统在接到查询请求后,会先通过高级语言模型生成一个与原查询相近的新查询。这个新查询随后用于在Llama-Index中检索相关文档,从而获取与原查询高度相关的信息,增强上下文理解,确保结果更精准、更符合用户的实际需求。

图片

2次LLM交互:为精确生成查询,流程包括向大型语言模型(LLM)并行发出两次请求:初次使用gpt3模型,之后可能提升至gpt4或其他高级模型,以获取更丰富的查询结果。

3.实现方法

3.1 LangChain

loader = UnstructuredPDFLoader(FILE_NAME)
docs = loader.load()

text_splitter = SentenceTransformersTokenTextSplitter()
texts = text_splitter.split_documents(docs)

emb = OpenAIEmbeddings(openai_api_key=openai.api_key)
vec_db = Chroma.from_documents(documents=texts, embedding=emb)

lc_model = ChatOpenAI(openai_api_key=openai.api_key, temperature=1.5)
base_retriever = vec_db.as_retriever(k=K)
final_retriever = MultiQueryRetriever.from_llm(base_retriever, lc_model)

tmpl = """
You are an assistant to answer a question from user with a context.

Context:
{context}

Question:
{question}

The response should be presented as a list of key points, after creating the title of the content,
    formatted in HTML with appropriate markup for clarity and organization.
"""
prompt = ChatPromptTemplate.from_template(tmpl)
chain = {"question": RunnablePassthrough(), "context": final_retriever} \
        | prompt \
        | lc_model \
        | StrOutputParser() \

result = chain.invoke("Waht is the doc talking about?")

MultiQueryRetriever 通过提供一套完整的类库,简化了任务执行过程。其核心机制是配备一个基础检索器,能够自动产生最多三个定制化的查询。这一过程中,检索操作的安全性和封装性得到了保障。

3.2 Llama-Index

实现Llama-Index颇具挑战,因为要求我们不仅要手动创建“生成的查询”,还得自行实现这些查询的检索流程。面对多个查询的需求,这里采用了必要的协程机制来确保过程的顺利进行。

vector_index: BaseIndex = VectorStoreIndex.from_documents(
    docs,
    service_context=service_context, 
    show_progress=True,
)

base_retriever = vector_index.as_retriever(similarity_top_k=K)

class MultiQueriesRetriever(BaseRetriever):
    def __init__(self, base_retriever: BaseRetriever, model:OpenAI):
        self.template = PromptTemplate("""You are an AI language model assistant. Your task is to generate Five
    different versions of the given user question to retrieve relevant documents from a vector
    database. By generating multiple perspectives on the user question, your goal is to help
    the user overcome some of the limitations of the distance-based similarity search.
    Provide these alternative questions seperated by newlines.
    Original question: {question}""")
        self._retrievers = [base_retriever]
        self.base_retriever = base_retriever
        self.model = model
    
    def gen_queries(self, query) -> List[str]:
        gen_queries_model = OpenAI(model="gpt-3-turbo", temperature=1.5)
        prompt = self.template.format(question=query)
        res = self.model.complete(prompt)
        return res.text.split("\n")

    async def run_gen_queries(self,generated_queries: List[str]) -> List[NodeWithScore]:
        tasks = list(map(lambda q: self.base_retriever.aretrieve(q), generated_queries)) 
        res = await tqdm.gather(*tasks)
        return res[0]

    def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:
        return list()

    async def _aretrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:
        query = query_bundle.query_str
        generated_queries = self.gen_queries(query)
        query_res = await self.run_gen_queries(generated_queries)
        return query_res


    
mr = MultiQueriesRetriever(base_retriever, li_model)

final_res = await RetrieverQueryEngine(mr).aquery(query_text)

重要的是通过继承BaseRetriever类,将其功能与基础检索器相融合,以便根据生成的查询来检索相应的信息。由于这些生成的查询是通过协程机制来实现的,因此需要对_aretrieve方法进行重写。这部分内容就不再展开详细说明了。

3.3 子问题查询引擎

Llama-Index包含一个名为SubQuestionQueryEngine的类,它基本上能够满足我们的需求。这个类的特点是将复杂查询分解成多个子问题,而不是创建一个与原查询“相似”的新查询。根据文档说明,可以通过以下代码来使用这个类:

query_engine_tools = [
    QueryEngineTool(
        query_engine=vector_query_engine,
        metadata=ToolMetadata(
            name="pg_essay",
            description="Paul Graham essay on What I Worked On",
        ),
    ),
]

query_engine = SubQuestionQueryEngine.from_defaults(
    query_engine_tools=query_engine_tools,
    use_async=True,
)

response = query_engine.query(
    "How was Paul Grahams life different before, during, and after YC?"
)

SubQuestionQueryEngine的工作原理是将复杂的原始查询拆分成多个子问题,每个子问题都针对特定的数据源。这些子问题的答案不仅提供了必要的上下文信息,还为构建最终答案做出了贡献。每个子问题专门设计用来从相应的数据源中抽取关键信息。综合这些子问题的答案,可以得到对原始查询的完整回应。

此外,SubQuestionQueryEngine能够将一个复杂的查询细化为多个子问题,并为每个子问题指定相应的查询引擎进行处理。一旦所有子问题都得到解答,这些答案将被汇总并传递给响应合成器,以生成最终的答案。SubQuestionQueryEngine根据SubQuestion中的tool_name属性来确定应该使用哪个QueryEngineTool来处理每个子问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python辅助QQ登入

python辅助QQ登入 import pyautogui import time import random from pyautogui import ImageNotFoundException# 生成随机等待时间,范围在1到3秒之间 random_time random.uniform(1, 3)def find_and_click(image_path, moveFalse, execute_nextTrue):try:image_l…

达梦数据库:安装达梦数据库客户端并配置python调用

前言 本文主要介绍了达梦数据库的客户端安装方案、python调用方案。本文使用的达梦数据库版本为 V8,如果使用的是其他版本,操作可能会有些许差异。 下载 前往官网安装:产品下载 | 达梦数据库 根据自己的系统版本进行选择,而后点击…

基于SpringBoot的“论坛管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“论坛管理系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 论坛管理系统结构图 前台首页功能界面图 用户登录…

高速公路信息化大会 | 云轴科技ZStack分享云原生超融合在高速公路行业的应用

近日,作为第二十六届高速公路信息化大会分论坛之一,由中国公路学会邀请、英特尔支持和协办《第四届英特尔智慧化方案助力高速新基建升级论坛》在合肥顺利召开。来自智慧交通建设领域的创新企业和技术专家共聚一堂,围绕改扩建高速公路提升和数…

Odoo|手把手教你Odoo集成drools,完成物料规则配置与报价单自动审核!

一、背景介绍 在实际业务中,售前根据客户需求选择相应的产品和对应的物料来生成报价单。然而,在填写报价单的过程中,可能会出现物料漏选或数量不准确的情况,这会对后续备货和生产效率造成重大影响。此外,由于产品和物料…

安装docker的PHP环境NLMP环境在国产deepin操作系统上

1: 先安装docker 安装完后执行,权限设置 sudo usermod -aG docker $USER或者sudo usermod -aG docker kentrl#添加当前用户到Docker用户组中 sudo newgrp docker#更新用户组数据,必须执行否则无效 sudo systemctl restart docker 先看目录结构: 2:按照目录结构挂载磁盘,…

渐进式交付实践:通过 Argo Rollouts 和 FSM Gateway 实现金丝雀发布

渐进式交付(Progressive delivery)是一种软件发布策略,旨在更安全、更可控地将新版本软件逐步推出给用户。它是持续交付的进一步提升,允许开发团队在发布新版本时拥有更细粒度的控制,例如可以根据用户反馈、性能指标和…

一键恢复备忘录,3个方法快速找回丢失记忆

备忘录是我们日常生活中一个重要的记录工具,用来记录待办事项、重要日期、提醒事项等等。然而,有时我们可能会不小心删除一些重要的备忘录,导致信息的丢失。 这时候,恢复备忘录就变得非常重要。在本文中,我们将介绍三…

IDEA报错然后pycharm闪退

pycharm闪退,在C盘的USER文件夹下有报错文件 打开一看,说内存不足 # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 14596177920 bytes for G1 virtual space # Possib…

工业控制(ICS)---modbus

Modbus Modbus,市场占有率高、出题频率高,算是最常见的题目,因为这个协议也是工控领域最常见的协议之一,主要有三类 Modbus/RTU 从机地址1B功能码1B数据字段xBCRC值2B 最大长度256B,所以数据字段最大长度252B Modbus/ASCII …

嵌入式面试-回答I2C

说明: 此文章是在阅读了一些列面试相关资料之后对于一些常见问题的整理,主要针对的是嵌入式软件面试中涉及到的问答,努力精准的抓住重点进行描述。若有不足非常欢迎指出,感谢!在总结过程中有些答案没标记参考来源&…

项目7-音乐播放器6+评论区

1.准备前端界面 前端小白:怎么为你的网页增加评论功能?(一)_为网页添加评论区怎么弄-CSDN博客 参考的上述文章的前端代码 我们从上述前端图片知道,我们数据库需要准备的字段: id,commentuserName,coomen…

JavaWeb开发02-MYSQL-DDL-DML-DQL-多表设计-多表查询-事务-索引

一、MySQL概述 通过SQL语句可以操作数据库 关系型数据库: 只要是关系型数据库就可以用SQL语句这一统一标准进行操作数据库 1.MYSQL数据模型 客户端通过SQL语句交给了数据库管理系统DBMS,进行相应操作,创建一个一个数据库,体现为一…

python3如何提取汉字

采用正则表达式的方法对字符串进行处理。 str1 "{我%$是,《速$.度\发》中 /国、人"(1)提取汉字 汉字的范围为”\u4e00-\u9fa5“,这个是用Unicode表示的。 import re res1 .join(re.findall([\u4e00-\u9fa…

力扣HOT100 - 141. 环形链表

解题思路&#xff1a; public class Solution {public boolean hasCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return true;}head head.next;}return false;} }

基于Matlab机器人工具箱对Dobot机械臂的研究

文章目录 文章目录 前言 一、Dobot Mangician 分析 二、Matlab 机器人工具箱 1. 建立模型 2. DoBot 正向运动学 3. Dobot 逆运动学 4. Dobot workpace 5. Dobot轨迹规划 三、Dobot studio 1. DoBot teaching 2. DoBot Python 程序 总结 前言 在本实验中&#xf…

第四届大数据工程与教育国际会议(BDEE 2024)即将召开!

第四届大数据工程与教育国际会议&#xff08;BDEE 2024&#xff09;将于2024年8月9-11日在泰国清迈举行。数据驱动教育变革&#xff0c;智慧点亮未来课堂&#xff01;BDEE 2024是专注于大数据工程与教育领域的重要学术会议&#xff0c;全球大数据与教育精英齐聚&#xff0c;在数…

QTableView获取可见的行数

场景 当我们需要实时刷新QTableView时&#xff0c;而此时tableView的数据量较大&#xff0c;如果全部刷新显然不合理&#xff0c;如果可以只对用户看的到的数据进行刷新那就最好了&#xff0c;经过一番摸索找到了几种方式&#xff0c;可供参考 代码 方法1 QVector<int>…

李沐48_全连接卷积神经网络FCN——自学笔记

1.FCN是用深度神经网络来做语义分割的奠基性工作。 2.它用转置卷积层来替换CNN最后的全连接层&#xff0c;从而可以实现每个像素的预测。 %matplotlib inline import torch import torchvision from torch import nn from torch.nn import functional as F from d2l import t…

Ubuntu20.4版本安装ROS教程

一、配置源 安装成功的Ubuntu系统自带的工具下载速度慢&#xff0c;不太好用&#xff0c;所以我们可以使用国内稳定高速且免费的镜像网站。 清华源&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simple 中科大&…
最新文章