RAG知识库之多表示索引

news/2024/11/20 21:28:05/文章来源:https://www.cnblogs.com/softlin/p/18286530

      在朴素RAG中通常会对文档、文本进行分块后进行文档嵌入,对所有文件、文本都没有经过采用Chunk方法可能有时候效果不是和好,尽管有着各种分块策略有针对大文件的、针对小文件的策略,但都难免可能会造成上下文语义丢失。
      分块通常有两个非常重要的参数chunk_sizechunk_overlap,分别代表块大小与块与块之间的重叠量,并不好确定这两个值的具体数字,只能通过不断实验确定该值。

基本原理

      在分块效果不好时或许可以试试多表示索引(Multi-representation indexing),在多表示索引中并不会对整个文档分块后进行文档嵌入。而是通过为每个文档都生成一个文档摘要,为每个文档摘要与文档生成一个唯一ID,将摘要与ID关联嵌入到Vectorstore中,将ID与文档关联存储到独立文档存储中。

      在用户提问时会先根据提出的问题先在多向量检索器中检索相似度最高的文档摘要,获取的文档摘要后也得到了所关联的id,再拿文档id到文档存储中获取所对应的完整文档。
      此文档作为用户提问问题的上下文,同时将问题与文档上下文提交到LLM。

      经过多表示索引的使用嵌入空间大小下降很多,相似度搜索性能也会提升,使用完整文档用作上下文LLM响应的准确性也会有所提高。

      适用于小文档结构,当文档太大时会超出LLM上下文长度,超大文档并不适用多表示索引。

代码示例

def loadDocs():loader = WebBaseLoader("https://www.hinews.cn/news/system/2024/07/04/033173743.shtml")docs = loader.load()loader = WebBaseLoader("https://www.hinews.cn/news/system/2024/07/04/033173745.shtml")docs.extend(loader.load())return docsdef processSummaries():chain = ({"doc": lambda x: x.page_content}| ChatPromptTemplate.from_template("请总结以下文档:\n\n{doc}")| llm| StrOutputParser())docs=loadDocs()summaries = chain.batch(docs, {"max_concurrency": 5})return summaries,docsdef get_retriever():summaries, docs= processSummaries()docstore = init_docstore() vectorstore = Chroma(collection_name="summaries", embedding_function=initEmbedding())#创建用于映射概要与文档的id数组doc_ids = [str(uuid.uuid4()) for _ in docs]#创建概要文档并关联ID summary_docs = [Document(page_content=s, metadata={"doc_id": doc_id}) for s, doc_id in zip(summaries, doc_ids)]#创建多向量检索器retriever = MultiVectorRetriever(vectorstore=vectorstore,byte_store=docstore,id_key="doc_id",search_kwargs={'k': 1})#将概要文档添加到向量存储retriever.vectorstore.add_documents(summary_docs)#文档与id关联lists = list(zip(doc_ids, docs))#文档添加到检索器的文档存储中retriever.docstore.mset(lists)return retriever

      创建好多向量检索器后即可使用该检索器,或配合RetrievalQA使用:

query="机场在哪里"
retriever= get_retriever()
retriever.invoke(query)#问答链
qa_chain = RetrievalQA.from_chain_type(llm, retriever=retriever, chain_type_kwargs={"prompt": PROMPT})
resp =qa_chain.invoke(query)

      从多向量检索器的实现源码可看到,其先从vectorstore中查询到相似度最高的N个概要文档,然后获取概要文档ID,根据ID去查询完整文档。

sub_docs = await self.vectorstore.asimilarity_search(query, **self.search_kwargs)
ids = []
for d in sub_docs:if self.id_key in d.metadata and d.metadata[self.id_key] not in ids:ids.append(d.metadata[self.id_key])
docs = await self.docstore.amget(ids)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Halcon学习笔记(3):WPF 框架搭建,MaterialDesign+Prism

目录前言环境Nuget安装新建WPF 类库项目初始化PrismApp启动页初始化重写MainView 前言 其实我更喜欢CommunityToolkit.mvvm+HandyControl。但是因为找工作,你不能去抗拒新事物。这里就当体验一下完整的流程好了。 环境windows 11 .net core 8.0Nuget安装新建WPF 类库项目新建项…

Halcon 学习笔记(2):Halcon+WPF导入

目录前言.net core 8.0.net core 8.0新功能,打开文件夹和打开文件HSmartWindowControlWPFSystem.Drawing.Common重置拉伸关闭拖拽和缩放文件导出 前言 这里补充一下Halcon导入到WPF的要求 .net core 8.0 Halcon是支持.net core 8.0导入的 .net core 8.0新功能,打开文件夹和打…

数据血缘系列(1)—— 为什么需要数据血缘?

大家好,我是独孤风。在当今数据驱动的商业环境中,数据治理成为企业成功的关键因素之一。本文我们详细探讨下为什么需要数据血缘,并说明数据血缘如何帮助企业解决关键问题,特别是在不同行业中的实际应用。 本文为《数据血缘分析原理与实践 》一书读书笔记,部分观点参考自书…

camunda开源工作流快速入门(一):部署camunda流程平台

本教程将指导您使用 Camunda 7.19版本(支持JDK1.8的最新的Camunda 版本)进行建模和实施您的第一个工作流。在本指南中,您将快速体验Camunda的核心功能,包括:流程设计器、自动化流程、人工任务流程、表单设计器、DMN决策表(规则引擎)等。本教程将指导您使用 Camunda 7.19…

清理引导程序Kingdee.BOS.DeskClient.Shell.exe中不要的地址

如下图,删除配置文件DeskAppManager中对应的配置项即可。

一分钟内!利用AI做出指定角色、指定动作的影片!AI现可精准控制表情、动作,主角可以是你自己!

AI可以根据提供的起始和结束帧图片自动生成动画视频,包括指定角色、表情、动作,并且能够控制效果。AI可以根据提供的起始和结束帧图片自动生成动画视频,包括指定角色、表情、动作,并且能够控制效果。 AI能够捕捉图片的细节和物理逻辑,生成稳定背景的动态视频。 可以先通过…

使用Terminal.Gui构建功能强大的.NET控制台应用

前言 前段时间分享了一个库帮你轻松的创建漂亮的.NET控制台应用程序 - Spectre.Console的文章教程,然后就有小伙伴提问:.NET控制台应用需要应对强交互性的场景,有什么好的解决方案?,今天大姚给大家分享一款适用于.NET的跨平台终端 UI 工具包,帮助大家快速构建功能强大的.…

Tita 是如何帮助企业更好推进 OKR 的?

OKR 有四个固有特性:“公开透明”、“敏捷开放”、“上下对齐”和“社交互动”。一个便捷能支持OKR四大特性以及同行评议的IT工具是非常必要的,这是大规模开展OKR的一个前提,Tita 是如何支持到这四大特性的呢?公开透明默认情况下OKR 是全公开的,对所有人均可见。 1.在 Tit…

读人工智能全传06逻辑编程

读人工智能全传06逻辑编程1. 现代逻辑 1.1. 到了20世纪初,现代逻辑的基本框架已经大致建立起来,当时确立的逻辑运算系统,直至如今仍然能够支撑数学家几乎所有的逻辑推理工作 1.1.1. 这个系统被称为一阶逻辑,一阶逻辑是数学和推理的通用语言 1.1.2. 这个框架涵盖了亚里士多德…

自动推理笔记

啊我居然回来用了,难绷命题逻辑(还记得我吗?) 命题公式 由若干布尔变量和运算符($\neg, \cap, \cup, \rightarrow, \leftrightarrow$)得到的公式 有一些命题,我们能否从中得到另一个命题 将问题转化成更“正式”的问题 使用自动化程序解决“正式”的问题 通过形式化,可…

Springmvc中转发和重定向

配置IndexControllerpackage com.powernode.springmvc.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView;@Controller public class Inde…

编译过程简介

编译过程一般可以分为6步:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化。整个过程词法分析:扫描器扫描代码之后,将代码生成一个个token 语法分析:语法分析器对token进行语法分析,最后生成一个语法树对于不同的编程语言,可以共用一个语法分析器,因为只…