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

相关文章

一张图读懂人工智能

三、人工智能和多式联运 AI产品的发展趋势,以及语言模型的应急能力和广泛应用。视频探讨了人工智能和人类的优劣势,以及未来的发展方向。视频提出了一种积极的心态,认为人工智能可以成为我们的同事,帮助我们提高效率和能力。二、大型语言模型的训练过程和应用场景,包括文本到文本、图像到文本、语音转录等多个方面。同时也提到了不同模型的能力和成本。一、生成人工智能的概念和应用,以及如何使用大型语言模型进行聊天和创造原创内容。五、如何使用生成人工智能作为招聘公司的工具,以及如何有效地使用生成人工智能来制作有用结果的提示。

基于YOLOv8深度学习+Pyqt5的电动车头盔佩戴检测系统

该系统利用深度学习技术,通过训练YOLOv8模型来识别电动车骑行者是否佩戴头盔,并在检测到未佩戴头盔的情况下发出警报。因此,开发一种能够实时监测头盔佩戴情况的系统,对于提高骑行者的安全意识和减少交通事故具有重要作用。本文提出的基于YOLOv8的电动车头盔佩戴检测系统,能够有效地提高电动车骑行者的安全意识。YOLOv8是YOLO系列目标检测模型的最新版本,它在前代模型的基础上进行了优化,提高了检测速度和准确性。在不同的场景和光照条件下,模型均能稳定地识别出佩戴和未佩戴头盔的骑行者。wx供重浩:创享日记。

chatgpt的大致技术原理

在RLHF中,人类用户对模型生成的文本提供反馈(如打分或选择更喜欢的文本),然后模型根据这些反馈进行进一步的训练。预处理步骤包括分词(使用BPE算法将文本分解为更小的子单元,如单词或符号)、去除停用词(即那些对文本意义不大的词,如“的”、“了”等)以及其他可能的文本清洗工作。生成过程中,模型会考虑前文的上下文信息,以确保生成的文本是连贯和有意义的。通过收集大量的文本数据、建立深度学习模型、进行预训练和微调以及使用搜索算法和人类反馈强化学习等技术,ChatGPT能够生成高质量、连贯且有用的文本回复。

云计算与边缘计算:有什么区别?

云计算和边缘计算作为不同的计算范式,各自在特定场景中发挥着独特的作用。它们的区别体现在数据处理位置、延迟、可用性以及应用场景等方面。然而,随着数字化时代的发展,它们也逐渐形成了协同应用的趋势,充分发挥各自的优势,提供更灵活、高效的计算体系结构。未来,随着智能化、自动化和边缘计算的边界拓展,云计算和边缘计算将进一步推动数字化转型。同时,安全性、跨边缘计算标准和环境可持续性等问题也需要在未来的发展中得到更好的解决。

ChatGPT高效提问—prompt基础

​ 设计一个好的prompt对于获取理想的生成结果至关重要。通过选择合适的关键词、提供明确的上下文、设置特定的约束条件,可以引导模型生成符合预期的回复。例如,在对话中,可以使用明确的问题或陈述引导模型生成相关、具体的回答;在摘要生成中,可以提供需要摘要的文章段落作为prompt,以确保生成的摘要准确而精炼。

二维平面阵列波束赋形原理和Matlab仿真

阵面左下角天线位于坐标原点,将坐标原点阵元设为参考阵元,计算每个阵元相对于该参考阵元的入射波程差,从而来计算每个阵元接收的回波信号。实现波束赋形的最基本的方法是对各个天线阵元的信号进行适当延迟后相加,使目标方向的信号同相叠加得到增强,而其他方向均有不同程度的削弱,该方法通常用于模拟信号.根据上述理论推导可以仿真任意平面阵列的方向图,这里对两种典型的阵列(矩形平面阵列和圆形阵列)进行Matlab仿真,其余类型的阵列在此基础上修改即可。根据上述圆形阵列公式做仿真,得到下述的三维空间方向图。

人工智能与机器学习——开启智能时代的里程碑

人工智能是指使计算机系统表现出类似于人类智能的能力。其目标是实现机器具备感知、理解、学习、推理和决策等智能行为。人工智能的发展可以追溯到上世纪50年代,随着计算机技术和算法的不断进步,人工智能得以实现。机器学习是人工智能的一个重要分支,它通过让计算机从数据中学习和改进性能,而不需要明确的编程指令。机器学习可以分为监督学习、无监督学习和强化学习三种主要类型。

【GPU】深入理解GPU硬件架构及运行机制

GPU的基本底层构成,主要是以GPU计算核心 Cores,以及Memory以及控制单元,三大组成要素组成。Core是计算的基本单元,既可以用作简单的浮点运算,又可以做一些复杂的运算例如,tensor 或者ray tracing。多个core之间通讯的方式:在特定的应用场合多个core之间是不需要的通讯的,也就是各干各的(例如 图像缩放)。但是也有一些例子,多个core之间要相互通讯配合(例如上文谈到的数组求和问题),每个core之间都可以实现交互数据是非常昂贵的,

RAG中的3个高级检索技巧

我们介绍的这些检索技术有助于提高文档的相关性。但是这方面的研究还正在进行,还有很多其他方法例如,利用真实反馈数据对嵌入模型进行微调;直接微调LLM以使其检索能力最大化(RA-DIT);探索更复杂的嵌入适配器使用深度神经网络而不是矩阵;深度和智能分块技术作者:Ahmed Besbes。

大数据深度学习卷积神经网络CNN:CNN结构、训练与优化一文全解

卷积神经网络是一种前馈神经网络,它的人工神经元可以响应周围单元的局部区域,从而能够识别视觉空间的部分结构特征。卷积层: 通过卷积操作检测图像的局部特征。激活函数: 引入非线性,增加模型的表达能力。池化层: 减少特征维度,增加模型的鲁棒性。全连接层: 在处理空间特征后,全连接层用于进行分类或回归。卷积神经网络的这些组件协同工作,使得CNN能够从原始像素中自动学习有意义的特征层次结构。随着深度增加,这些特征从基本形状和纹理逐渐抽象为复杂的对象和场景表现。

从虚拟到现实:数字孪生驱动智慧城市可持续发展

同时,我们也需要不断探索和创新数字孪生技术的应用场景和发展方向,为智慧城市的可持续发展提供更加全面和深入的支持。“方案365”2023年全新整理智慧城市、数字孪生、乡村振兴、智慧乡村、元宇宙、数据中台、智慧园区、智慧社区、智慧矿山、城市生命线、智慧水利、智慧应急、智慧校园、智慧工地、智慧农业、智慧文旅、智慧交通等300+行业全套解决方案。通过智能电表和能源管理系统,数字孪生技术可以实现对家庭、企业等各个层面的能源使用情况进行监测和优化,提高能源利用效率,推动城市的绿色发展。

如何使用人工智能优化 DevOps?

DevOps 和人工智能密不可分,影响着各种业务。DevOps 可以加快产品开发速度并简化现有部署的维护,而 AI 则可以改变整个系统的功能。DevOps团队可以依靠人工智能和机器学习来进行数据集成、测试、评估和发布系统。更重要的是,人工智能和机器学习可以以高效、快速、安全的方式改进 DevOps 驱动的流程。从开发人员实用性和业务支持的角度来看, 评估AI和ML在 DevOps 中的重要性对于企业来说是有益的。

人工智能有哪些领域?

像京东自主研发的无人仓采用大量智能物流机器人进行协同与配合,通过人工智能、深度学习、图像智能识别、大数据应用等技术,让工业机器人可以进行自主的判断和行为,完成各种复杂的任务,在商品分拣、运输、出库等环节实现自动化。人工智能在金融领域的应用主要有:智能获客、身份识别、大数据风控、智能投顾、智能客服、金融云等,该行业也是人工智能渗透最早、最全面的行业。目前,我国在ITS方面的应用主要是通过对交通中的车辆流量、行车速度进行采集和分析,可以对交通进行实施监控和调度,有效提高通行能力、简化交通管理、降低环境污染等。

【AI】人工智能复兴的推进器之神经网络

神经网络是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量节点(或神经元)相互关联构成,每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这可以看作人工神经元的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。此外,根据网络的结构和运行方式,神经网络可以分为前馈神经网络和反馈神经网络。

目标检测与测距算法在极端天气下的应用

在现代社会中,极端天气条件对人们的生活和工作带来了很大的挑战。对于一些特定领域,如交通运输、安全监控等,准确的目标检测与测距算法在极端天气下尤为重要。本文将分点概述极端天气下目标检测与测距算法的关键问题及解决办法。

AI时代架构设计新模式

本书是一本旨在帮助架构师在人工智能时代展翅高飞的实用指南。全书以ChatGPT为核心工具,揭示了人工智能技术对架构师的角色和职责进行颠覆和重塑的关键点。本书通过共计 13 章的系统内容,深入探讨AI技术在架构设计中的应用,以及AI对传统架构师工作方式的影响。通过学习,读者将了解如何利用ChatGPT这一强大的智能辅助工具,提升架构师的工作效率和创造力。本书的读者主要是架构师及相关从业人员。

深度解析 PyTorch Autograd:从原理到实践

本文深入探讨了 PyTorch 中 Autograd 的核心原理和功能。从基本概念、Tensor 与 Autograd 的交互,到计算图的构建和管理,再到反向传播和梯度计算的细节,最后涵盖了 Autograd 的高级特性。

AIGC实战——WGAN(Wasserstein GAN)

在本节中,我们学习了如何使用 Wasserstein 损失函数以解决经典 GAN 训练过程中的模式坍塌和梯度消失等问题,使得 GAN 的训练更加可预测和可靠。WGAN-GP 通过在损失函数中添加一个令梯度范数指向 1 的项,为训练过程施加 1-Lipschitz 约束。

ChatGPT的常识

ChatGPT不仅可以提供高效的服务,还可以通过模拟人类对话和表情,提高人机交互的趣味性和友好性。其次,ChatGPT可以实现个性化服务,根据用户的个性化需求和反馈不断优化和改进。用户在与ChatGPT进行交互的过程中,ChatGPT可以对用户的个性化需求进行识别和记录,从而实现个性化的服务。ChatGPT的设计理念是建立一个可以持续学习和更新的聊天机器人,可以不断地根据用户的反馈和互动进行优化和改进。同时,ChatGPT还具有很强的适应性和灵活性,可以应对不同场景和话题的要求。

人工智能时代:AIGC的横空出世

AIGC是一种新的人工智能技术,即人工智能生成内容。它是一种基于机器学习和自然语言处理的技术,能够自动产生文本、图像、音频等多种类型的内容。

【图像处理】使用各向异性滤波器和分割图像处理从MRI图像检测脑肿瘤(Matlab代码实现)

脑肿瘤是一种致命的疾病,没有MRI技术,无法可靠地检测到。为了为MRI图像的形态学操作铺平道路,我们首先使用各向异性扩散滤波器对图像进行滤波,以降低像素之间的对比度。然后,我们调整图像大小,并手动将其转换为黑白图像,通过阈值处理来初步筛选出肿瘤可能存在的区域。这个项目的更大目标是建立一个包含从不同角度拍摄的特定人类MRI图像中的肿瘤2D图像数据的数据库,并通过对这些图像进行分析来确定肿瘤的精确3D位置。尽管这个模拟程序在大多数情况下可以给出准确的结果,但对于过小的肿瘤或具有中空结构的肿瘤,它可能无法执行。
返回
顶部