使用LOTR合并检索提高RAG性能

RAG结合了两个关键元素:检索和生成。它首先使用语义搜索等高级技术来浏览大量数据,包括文本、图像、音频和视频。RAG的本质在于它能够检索相关信息,然后作为下一阶段的基础。生成组件利用大型语言模型的能力,解释这些数据块,制作连贯的、类似人类的响应。与传统的生成模型相比,这个过程确保RAG系统可以提供更细致和准确的输出。

“Lost in the Middle”

在RAG中“LIM”问题相当具有挑战性。斯坦福大学和加州大学伯克利分校等大学的研究强调了这一问题,这与人们经常记住购物清单上的第一个和最后一个项目,但忘记中间的项目类似。语言模型人一样很擅长识别他们正在分析的文本的开头或结尾的信息,但他们往往会忽略中心的关键细节。

为了解决这个问题,我们一般都是用下面的方法:

1、避免使用单一知识库,对不同类型的文档只使用一个知识库可能会混淆检索模型。他们可能很难根据主题或上下文找到正确的信息。

2、使用多个矢量存储,为不同类型的文档创建单独的数据存储区域(称为矢量存储)。这有助于更有效地组织信息。

3、使用一个称为Merge retriver的工具合并来自这些不同VectorStores的数据。这有助于汇集来自不同来源的相关信息。

4、使用长上下文重新排序(LOTR)重新排序,这确保了模型对文本中间的数据给予同等的关注,而不仅仅是在开头或结尾。

通过使用上面这些技术,可以确保数据的所有部分(包括中间部分)都得到了适当的检索并用于生成响应。这些步骤有助于改进RAG系统的性能,使它们更有效地处理和解释大量不同的信息源。

LOTR(合并检索器)

本文主要介绍LOTR

LOTR: Lord of the retrivers,也称为mergerretriver,它将检索器列表作为输入,并将它们的get_relevance _documents()方法的结果合并到单个列表中。合并的结果将是与查询相关的文档列表,这些文档是被不同的检索器排序过的。

MergerRetriever类可以通过几种方式用于提高文档检索的准确性:它结合多个检索器的结果,这有助于减少结果偏差的风险。并且可以对不同检索器的结果进行排序,这有助于确保首先返回最相关的文档。

我们将以医疗/医疗保健相关的RAG为例构建回答一些保健被问题的聊天机器人。

代码

安装使用的包:

 pip -q install langchain lancedb  pypdf sentence-transformers openai tiktoken

在python中导入所需的包

 from langchain.embeddings import HuggingFaceEmbeddings, OpenAIEmbeddings,HuggingFaceBgeEmbeddings
 from langchain.document_transformers import (
     EmbeddingsClusteringFilter,
     EmbeddingsRedundantFilter,
 )
 from langchain.text_splitter import RecursiveCharacterTextSplitter
 from langchain.retrievers import ContextualCompressionRetriever
 from langchain.retrievers.document_compressors import DocumentCompressorPipeline
 from langchain.retrievers.merger_retriever import MergerRetriever
 from langchain.schema import Document
 from langchain.embeddings.openai import OpenAIEmbeddings
 from langchain.document_loaders import PyPDFLoader
 from langchain.embeddings import SentenceTransformerEmbeddings
 from langchain.vectorstores import LanceDB
 import lancedb

这里我们使用openai的模型所以需要设置apikey

 import os
 os.environ["OPENAI_API_KEY"] = "sk-xxxx"

对于嵌入模型,我们有3种选择

1、Huggingface BGE嵌入,这是在MTEB排行榜上排名前面的模型。

2、NeuML/pubmedbert-base-embeddings 这个模型专注于医疗相关数据。

3、Openai embedding mode 最后可以使用Openai嵌入模型来移除相同的嵌入,这个作为后续改进,本文暂不不讨论

 #embedding models
 
 medical_health_embedding = SentenceTransformerEmbeddings(
     model_name="NeuML/pubmedbert-base-embeddings")
 
 hf_bge_embeddings = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-large-en",
                                              model_kwargs={"device":"cpu"},
                                              encode_kwargs = {'normalize_embeddings': False})
 filter_embeddings = OpenAIEmbeddings()

加载文档文件

 loader = PyPDFLoader("/content/AyurvedicHomeRemedies.pdf")
 # pages = loader.load_and_split()
 
 
 text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200)
 text = text_splitter.split_documents(loader)

将两个不同的嵌入模型实例化,并生成两个不同的索引

 # embedding 1 model - NeuML/pubmedbert-base-embeddings
 db = lancedb.connect('/tmp/lancedb')
 table = db.create_table("health embedding", data=[
     {"vector": medical_health_embedding.embed_query("Hello World"), "text": "Hello World", "id": "1"}
 ], mode="overwrite")
 
 # Initialize LanceDB retriever
 db_all = LanceDB.from_documents(text, medical_health_embedding, connection=table)
 
 
 ## embeding 2 model - 
 db_multi = lancedb.connect('/tmp/lancedb')
 table = db_multi.create_table("bge embedding", data=[
     {"vector": hf_bge_embeddings.embed_query("Hello World"), "text": "Hello World", "id": "1"}
 ], mode="overwrite")
 # Initialize LanceDB retriever
 db_multiqa = LanceDB.from_documents(text, hf_bge_embeddings, connection=table)

保存两个retriever的输出,供后续代码调用

 retriever_med = db_all.as_retriever(search_type="similarity",
                                   search_kwargs={"k": 5, "include_metadata": True}
                                   )
 retriever_bge = db_multiqa.as_retriever(search_type="similarity",
                                         search_kwargs={"k": 5, "include_metadata": True})

MergerRetriever(通常称为LOTR)通过以顺序的、循环的方式组合来自各种检索源的结果。它首先收集由每个检索器标识的相关文档,然后将这些文档合并到一个单一的内聚列表中。该列表显示与特定查询相关的文档并根据不同检索器确定的相关性对其进行排序。

为了提高合并列表的效率并避免重复,EmbeddingsRedundantFilter可以与附加的嵌入模型一起使用。这有助于从组合检索器中过滤掉任何重叠或重复的结果。还可以将文档分组到主题簇或相关内容的“中心”,从这些簇中选择与每个簇的中心主题最接近的文档进行最终结果。EmbeddingsClusteringFilter优化了这个聚类和选择过程,确保了结果集更有组织、更集中。

 lotr = MergerRetriever(retrievers=[retriever_med, retriever_bge])
 
 for chunks in lotr.get_relevant_documents("What is use of tulsi ?"):
     print(chunks.page_content)

合并的检索器中删除冗余结果。

 filter = EmbeddingsRedundantFilter(embeddings=filter_embeddings)

无论模型的体系结构是什么,当包含10个以上的检索文档时,都会有很大的性能下降。也就是说,当模型必须在长上下文中访问相关信息时,它们倾向于忽略所提供的文档。

 from re import search
 from langchain.document_transformers import LongContextReorder
 
 reordering = LongContextReorder()  
 
 pipeline = DocumentCompressorPipeline(transformers=[filter, reordering])
 compression_retriever_reordered = ContextualCompressionRetriever(
     base_compressor=pipeline, base_retriever=lotr,search_kwargs={"k": 5, "include_metadata": True}
 )
 
 docs = compression_retriever_reordered.get_relevant_documents("What is use of tulsi ?")
 print(len(docs))
 
 print(docs[0].page_content)

以上文档已经处理完毕了,我们开始加载LLM模型

 from langchain.chains import RetrievalQA
 from langchain.llms import OpenAI
 from langchain.chains import RetrievalQA
 from langchain.chat_models import ChatOpenAI
 
 llm = ChatOpenAI(openai_api_key="sk-openaiapikey")
 #check our blog for using different llms  https://github.com/lancedb/vectordb-recipes/blob/main/tutorials/chatbot_using_Llama2_&_lanceDB
 
 qa = RetrievalQA.from_chain_type(
       llm=llm,
       chain_type="stuff",
       retriever = compression_retriever_reordered,
       return_source_documents = True
 )

测试结果如下:

 query ="What is use of tulsi?"
 results = qa(query)
 print(results['result'])
 
 print(results["source_documents"])
 
 ## results
 For high fever and cough, you can try the following home remedies:
 
 1. Take 1-2 grams of Pippali (Piper longum) powder with honey twice daily.
 2. Drink a warm decoction prepared from 20 ml of water and 1 gram of Laung (clove) 3-4 times daily. This can help with both dry and productive cough.
 3. Take 2 grams of Elaichi (cardamom) powder with honey 2-3 times a day.
 4. Drink plenty of warm fluids like herbal teas, soups, and warm water to stay hydrated and soothe the throat.
 5. Gargle with warm salt water to alleviate throat discomfort.
 6. Rest and get plenty of sleep to support your immune system.
 
 Remember, these remedies are for mild conditions. If your symptoms persist or worsen, it is important to consult a doctor for proper diagnosis and treatment.

通过这种方法可以使RAG获得更好的性能

总结

为了解决LIM问题并提高检索性能,对RAG系统进行增强是非常重要的。通过设置不同的VectorStores并将它们与Merge retriver结合,以及使用LongContextReorder重新排列结果,可以减少LIM问题并使检索过程更高效。此外,在合并检索器中合并特定领域的嵌入也有着关键作用。这些步骤对于确保我们不会在检索文件的过程中遗漏重要细节至关重要。

Lost in the Middle: How Language Models Use Long Contexts 论文

https://arxiv.org/abs//2307.03172

langchain的merger_retriever实现代码:

https://github.com/langchain-ai/langchain/blob/master/libs/langchain/langchain/retrievers/merger_retriever.py

本文完整代码:

https://avoid.overfit.cn/post/d252399e19e5409abf9990591523c11f

作者:Akash A Desai

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

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

相关文章

三个故事,谈谈小米汽车技术发布会

都说新年新气象,随着年末消费旺季到来,汽车市场越来越热闹了。 继蔚来12月23日公布旗舰车型ET9,华为26日发布问界M9,小米汽车首款量产车型SU7终于正式亮相。 12月28日,在小米汽车技术发布会上,小米创办人…

AIGC与计算机技术:人工智能生成内容的深度探索

AIGC与计算机技术:人工智能生成内容的深度探索 摘要:随着人工智能技术的快速发展,AIGC(人工智能生成内容)成为了计算机领域的前沿话题。本文将详细探讨AIGC的基本原理、技术应用和未来发展趋势,以及它对计…

【AIGC表情prompt】提示词练习技巧

表情类提示词练习技巧 医疗机器人,男人笑脸景深,数据,座标,12k,c4d渲染,高分辨率,,暖色调,高清对比 医疗机器人,男人微笑,景深,数据,座标&#xf…

nodejs+vue+微信小程序+python+PHP的药品销售管理系统的设计与实现-计算机毕业设计推荐

然后分析系统需要实现的功能并进行设计。梳理业务流程,并根据功能设计数据库,最后通过编码实现,药店药品出库入库管理:登记药店药品销售情况,记录药店药品出入库管理。能更好的掌握药品的一个销售情况,利于…

Python新手教程 —— Hello, World!

文章目录 Hello, World!作者自述关于本系列什么是编程语言什么是Python安装Python运行Python3解释器IDLE编写代码文件 本文复习Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与…

Java集合/泛型篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、ArrayList和linkedList的区别二、HashMap和HashTable的区别三、Collection包结构,与Collections的区别四、泛型常用特点前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…

EMQX开启MongoDB接入认证与订阅发布鉴权

背景 关于物联网平台设计一个最佳实践是:对接入平台的设备进行认证,并且对设备可以发布和订阅的主题进行权限控制。 MQTT Broker 开启对接入设备的认证与订阅发布鉴权的意义在于增强系统的安全性。通过认证,可以确保只有经过授权的设备可以连…

【IEEE解刊】IF4.4实力强劲,国人占比第一,好投吗?(附中科院高分区快刊)

计算机类 • 好刊解读 今天小编带来IEEE旗下计算机领域高分好刊,如您有投稿需求,可作为重点关注!后文有相关领域真实发表案例,供您投稿参考~ 01 期刊简介 IEEE Systems Journal ✅出版社:IEEE ✅ISSN:1…

【Bootstrap学习 day4】

Bootstrap5 列表组 使用Bootstrap创建列表 可以创建三种不类型的HTML列表: 无序列表—顺序无关紧要的项目列表。无序列表中的列表标有项目符号,例如。、等ul>li有序列表—顺序确实很重要的项目列表。有序列表中的列表项用数字标记,例如1、…

docker重量级容器预警监控系统CIG

文章目录 一、介绍CIG二、CIG,compose部署2.1 docker-compose运行CIG2.2 grafana配置1.配置数据源2.选择influxdb数据源3.配置数据库的连接信息4.create dashboard5.配置数据源6.大功告成 一、介绍CIG C:CAdvisor,监控收集,默认存储最近2分钟…

MYSQL的UPDATE时锁表机制

(笔记,只为获取流量券) MySQL中,UPDATE 操作涉及到行级锁和表级锁的概念,具体取决于事务隔离级别和被更新的条件, 无索引的情况下: 当表没有索引的情况下,UPDATE 操作通常会涉及到表级锁。这是…

机器学习的一般步骤

机器学习专注于让机器从大量的数据中模拟人类思考和归纳总结的过程,获得计算模型并自动判断和推测相应的输出结果。机器学习的一般步骤可以概括为以下几个阶段: 数据收集和准备: 收集与问题相关的数据,并确保数据的质量和完整性。…

详解—数据结构—<常用排序>基本实现和代码分析

目录 一.排序的概念及其运用 1.1排序的概念 1.2排序运用​编辑 1.3 常见的排序算法​编辑 二.常见排序算法的实现 2.1 插入排序 2.1.1基本思想: 2.1.2直接插入排序: 2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序 2.2.1基本思想: …

unity 保存和加载窗口布局

这么简单的事网上一堆废话文章 右上角,Layout点开后有保存和删除 要切换布局点红框里的已经保存的布局

Go语言学习第二天

Go语言数组详解 var 数组变量名 [元素数量]Type 数组变量名:数组声明及使用时的变量名。 元素数量:数组的元素数量,可以是一个表达式,但最终通过编译期计算的结果必须是整型数值,元素数量不能含有到运行时才能确认大小…

2020年认证杯SPSSPRO杯数学建模B题(第一阶段)分布式无线广播全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 B题 分布式无线广播 原题再现: 以广播的方式来进行无线网通信,必须解决发送互相冲突的问题。无线网的许多基础通信协议都使用了令牌的方法来解决这个问题,在同一个时间段内,只有唯一一个拿到令牌…

是时候将javax替换为Jakarta了

开始 相信很多朋友在使用新版本的Spring的时候,发现了一些叫jakarta的包,看起来有点陌生。 很多时候,比较纠结不知道该导入哪一个包。 jakarta其实就是之前的javax。 主要JavaEE相关的,从之前javax名字也可以看出来&#xff0…

LeetCode刷题--- 单词搜索

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述…

启封涂料行业ERP需求分析和方案分享

涂料制造业是一个庞大而繁荣的行业 它广泛用于建筑、汽车、电子、基础设施和消费品。涂料行业生产不同的涂料,如装饰涂料、工业涂料、汽车涂料和防护涂料。除此之外,对涂料出口的需求不断增长,这增加了增长和扩张的机会。近年来,…

Livox-Mid-360 固态激光雷达ROS格式数据分析

前言: Livox-Mid-360 官方采用livox_ros_driver2ROS功能包发布ROS格式的数据,livox_ros_driver2可以把Livox原始雷达数据转化成ROS格式并以话题的形式发布出去。 下面列举一些雷达的基本概念: 点云帧:雷达驱动每次向外发送的一…
最新文章