首页 > 其他分享 >RAG知识库之多表示索引

RAG知识库之多表示索引

时间:2024-07-08 08:59:20浏览次数:7  
标签:RAG docs 知识库 ids 索引 文档 doc id retriever

      在朴素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 docs
	
def 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,docs

def 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)

标签:RAG,docs,知识库,ids,索引,文档,doc,id,retriever
From: https://www.cnblogs.com/softlin/p/18286530

相关文章

  • sql 索引
    SQL中的索引分为两种,一种为聚集索引和非聚集索引,下面介绍两者的异同。一、聚集索引与非聚集索引:1、聚集索引:聚集索引的意思可以理解为顺序排列,比如一个主键自增的表即为聚集索引,即id为1的存在于第一条,id为2的存在于第二条...假使数据库中是使用数组来存放的这张表中的数据,那么......
  • LLM大模型: RAG两大核心利器 — embedding和reranker模型微调fine-tune
      要想RAG好,embedding和reranker必须给力!目前市面上流行的embedding和reranker使用的都是通用预料训练,并未针对安全这个细分领域定制,所以有必要使用安全领域的预料微调一下!目前所有的预料中,获取成本比较低、并且不需要专门投入人力标注的有两种:网上各种安全论坛的博客、各......
  • Optimize-Volume 命令用于优化指定驱动器的性能。除了 -Defrag 参数以外,还有一些其他
    Optimize-Volume命令起源于Microsoft的PowerShell环境中的一个磁盘优化工具。它主要用于对磁盘驱动器执行优化操作,包括碎片整理、TRIM操作(针对固态硬盘)、分块整理等。这些操作有助于提高磁盘性能和延长硬件寿命,特别是对于使用频繁的系统和数据驱动器来说尤为重要。在Power......
  • android中activity与fragment之间的各种跳转
    我们以音乐播放、视频播放、用户注册与登录为例【Musicfragment(音乐列表页)、Videofragment(视频列表页)、MusicAvtivity(音乐详情页)、VideoFragment(视频详情页)、LoginActivity(用户登录)、RegisterActivity(用户注册)】目录1.activity与activity之间的跳转2.activity与fragment之间......
  • MySQL联合索引最左匹配原则
    MySQL中的联合索引(也叫组合索引)遵循最左匹配原则,即在创建联合索引时,查询条件必须从索引的最左边开始,否则索引不会被使用。在联合索引的情况下,数据是按照索引第一列排序,第一列数据相同时才会按照第二列排序。例如,假设有一个表t_employees,它有一个联合索引(first_name,las......
  • MySQL使用LIKE索引是否失效的验证
    1、简单的示例展示在MySQL中,LIKE查询可以通过一些方法来使得LIKE查询能够使用索引。以下是一些可以使用的方法:使用前导通配符(%),但确保它紧跟着一个固定的字符。避免使用后置通配符(%),只在查询的末尾使用。使用COLLATE来控制字符串比较的行为,使得查询能够使用索引。下......
  • [浏览器]LocalStorage
    在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localStorage中一般浏览器支持的是5M大小,这个在不同的浏览器中localStorage会有所不同。二、localStorage的优势与局限localSto......
  • 基于Qwen2/Lllama3等大模型,部署团队私有化RAG知识库系统的详细教程(Docker+AnythingLLM
    自ChatGPT发布以来,大型语言模型(LargeLanguageModel,LLM,大模型)得到了飞速发展,它在处理复杂任务、增强自然语言理解和生成类人文本等方面的能力让人惊叹,几乎各行各业均可从中获益。然而,在一些垂直领域,这些开源或闭源的通用基础大模型也暴露了一些问题,主要体现在以下3个方面:......
  • appium自动化测试报错:Unable to launch com.facebook.WebDriverAgentRunner.maukkaki.
    嗨,我是兰若,今天在编写自动化测试用例的时候,appiuminspector报错:Unabletolaunchcom.facebook.WebDriverAgentRunner.maukkaki.xctrunner1、当时首先想到的就是检查WebDriverAgent的构建和安装是否正常,后来发现这块的安装是完全按照官方文档进行的,并且彼时我的手机上已经......
  • Mysql 索引
     在MySQL中,索引是一种数据结构,它能够帮助快速查找和检索表中的记录,从而提高查询性能。索引在数据库中类似于书籍的目录,可以快速定位到所需的内容。下面是关于MySQL索引的详细介绍,包括其概念、类型、如何使用以及如何在建表时指定索引。什么是索引索引是存储在数据库中的一......