文档概要索引,简单提升检索性能的新选择

今天介绍了一种全新的 LlamaIndex 数据结构:文档摘要索引。将描述它如何比传统语义搜索提供更好的检索性能,并通过一个示例进行了演示。

背景

大型语言模型 (LLM) 的核心用例之一是针对自己的数据进行问答。为此,我们将 LLM 与“检索”模型配对,该模型可以对知识语料库执行信息检索,并使用 LLM 对检索到的文本执行响应合成。这个整体框架称为检索增强生成(RAG)。

目前,大多数构建 LLM 驱动的 QA 系统的用户倾向于执行以下操作:

  1. 获取源文档,将每个文档拆分为文本块

  2. 将文本块存储在向量数据库中

  3. 在查询时,通过嵌入相似性和/或关键字过滤器来检索文本块。

  4. 执行响应合成

由于各种原因,这种方法的检索性能有限。

现有方法的局限性

使用文本块进行嵌入检索存在一些限制。

  • 文本块缺乏全局上下文。 问题通常需要超出特定块索引内容的上下文。

  • 仔细调整 top-k/相似度得分阈值。 如果值太小,将错过上下文。如果值太大,成本/延迟可能会随着不相关上下文的增加而增加。

  • 嵌入并不总是会选择与问题最相关的上下文。 嵌入本质上是在文本和上下文之间分别确定的。

添加关键字过滤器是增强检索结果的一种方法。但这也带来了一系列挑战。我们需要充分确定每个文档的正确关键字,无论是手动还是通过 NLP 关键字提取/主题标记模型。此外,我们还需要从查询中充分推断出正确的关键字。

文档概要索引

文档概要索引,它将提取/索引每个文档的非结构化文本摘要。此索引可以帮助增强现有检索方法之外的检索性能。它有助于索引比单个文本块更多的信息,并且比关键字标签具有更多的语义含义。它还允许更灵活的检索形式:我们可以进行 LLM 检索和基于嵌入的检索。

工作原理

在构建期间,我们会提取每个文档,并使用 LLM 从每个文档中提取摘要,还将文档拆分为文本块(节点)。摘要和节点都存储在我们的文档存储抽象中。我们维护从摘要到源文档/节点的映射。

在查询期间,我们根据摘要检索与查询相关的文档,使用以下方法:

  • **基于 LLM 的检索:**我们向 LLM 提供一系列文档摘要,并要求 LLM 确定哪些文档是相关的 + 它们的相关性分数。

  • **基于嵌入的检索:**我们根据摘要嵌入相似度(具有前 k 个截止值)检索相关文档。

注意,这种文档摘要检索方法(即使采用基于嵌入的方法)与基于嵌入的文本块检索不同。文档摘要索引的检索类会检索任何选定文档的所有节点,而不是返回节点级别的相关块。

存储文档摘要还可以实现基于 LLM 的检索。我们不必一开始就将整个文档提供给 LLM,而是先让 LLM 检查简明的文档摘要,看看它是否与查询相关。这利用了 LLM 的推理能力,这些能力比基于嵌入的查找更先进,但避免了将整个文档提供给 LLM 的成本/延迟。

更多

带摘要的文档检索可以看作是所有文档中的语义搜索和强力摘要之间的“中间地带”。我们根据给定查询的摘要相关性查找文档,然后返回与检索到的文档相对应的所有“节点”。

我们为什么要这样做?这种检索方法通过在文档级别检索上下文,为用户提供了比文本块上的 top-k 更多的上下文。但是,它也是一种比主题建模更灵活/自动化的方法;无需再担心您的文本是否具有正确的关键字标签!

代码示例

下面展示部分构建代码,完整代码地址:

https://docs.llamaindex.ai/en/stable/examples/index_structs/doc_summary/DocSummary/
from llama_index import (
    SimpleDirectoryReader,
    LLMPredictor,
    ServiceContext,
    ResponseSynthesizer
)
from llama_index.indices.document_summary import GPTDocumentSummaryIndex
from langchain.chat_models import ChatOpenAI

# load docs, define service context
...

# build the index
response_synthesizer = ResponseSynthesizer.from_args(response_mode="tree_summarize", use_async=True)
doc_summary_index = GPTDocumentSummaryIndex.from_documents(
    city_docs, 
    service_context=service_context,
    response_synthesizer=response_synthesizer
)

一旦索引建立,我们就可以获得任何给定文档的摘要:

summary = doc_summary_index.get_document_summary("Boston")

接下来,让我们看一个基于 LLM 的索引检索示例。

from llama_index.indices.document_summary import DocumentSummaryIndexRetriever

retriever = DocumentSummaryIndexRetriever(
    doc_summary_index,
    # choice_select_prompt=choice_select_prompt,
    # choice_batch_size=choice_batch_size,
    # format_node_batch_fn=format_node_batch_fn,
    # parse_choice_select_answer_fn=parse_choice_select_answer_fn,
    # service_context=service_context
)
retrieved_nodes = retriever.retrieve("What are the sports teams in Toronto?")
print(retrieved_nodes[0].score)
print(retrieved_nodes[0].node.get_text())The retriever will retrieve a set of relevant nodes for a given index.

请注意,LLM 除了返回文档文本之外,还返回相关性分数:

8.0
Toronto ( (listen)-RON-toh; locally [təˈɹɒɾ̃ə] or [ˈtɹɒɾ̃ə]) is the capital city of the Canadian province of Ontario. With a recorded population of 2,794,356 in 2021, it is the most populous city in Canada...

我们还可以将索引用作整体查询引擎的一部分,不仅可以检索相关上下文,还可以合成给定问题的答案。我们可以通过高级 API 和低级 API 来实现这一点。

高级 API

query_engine = doc_summary_index.as_query_engine(
  response_mode="tree_summarize", use_async=True
)
response = query_engine.query("What are the sports teams in Toronto?")
print(response)

低级 API

# use retriever as part of a query engine
from llama_index.query_engine import RetrieverQueryEngine

# configure response synthesizer
response_synthesizer = ResponseSynthesizer.from_args()

# assemble query engine
query_engine = RetrieverQueryEngine(
    retriever=retriever,
    response_synthesizer=response_synthesizer,
)

# query
response = query_engine.query("What are the sports teams in Toronto?")
print(response)

如果对内容有什么疑问和建议可以私信和留言,也可以添加我加入大模型交流群,一起讨论大模型在创作、RAG和agent中的应用。

好了,这就是我今天想分享的内容。如果你对大模型应用感兴趣,别忘了点赞、关注噢~


读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值