文档概要索引 便捷优化检索功能的新选用

当天引见了一种全新的 LlamaIndex 数据结构:文档摘要索引。将形容它如何比传统语义搜查提供更好的检索功能,并经过一个示例启动了演示。

背景

大型言语模型 (LLM) 的外围用例之一是针对自己的数据启动问答。为此,咱们将 LLM 与“检索”模型配对,该模型可以对常识语料库口头消息检索,并经常使用 LLM 对检索到的文本口头照应分解。这个全体框架称为检索增强生成(RAG)。

目前,大少数构建 LLM 驱动的 QA 系统的用户偏差于口头以下操作:

因为各种要素,这种方法的检索功能有限。

现有方法的局限性

经常使用文本块启动嵌入检索存在一些限度。

参与主要字过滤器是增强检索结果的一种方法。但这也带来了一系列应战。咱们须要充沛确定每个文档的正确主要字,无论是手动还是经过 NLP 主要字提取/主题标志模型。此外,咱们还须要从查问中充沛推断出正确的主要字。

文档概要索引

文档概要索引,它将提取/索引每个文档的非结构化文本摘要。此索引可以协助增强现有检索方法之外的检索功能。它有助于索引比单个文本块更多的消息,并且比主要字标签具备更多的语义含意。它还准许更灵敏的检索方式:咱们可以启动 LLM 检索和基于嵌入的检索。

上班原理

在构建时期,咱们会提取每个文档,并经常使用 LLM 从每个文档中提取摘要,还将文档拆分为文本块(节点)。摘要和节点都存储在咱们的文档存储形象中。咱们保养从摘要到源文档/节点的映射。

在查问时期,咱们依据摘要检索与查问关系的文档,经常使用以下方法:

留意,这种文档摘要检索方法(即使驳回基于嵌入的方法)与基于嵌入的文本块检索不同。文档摘要索引的检索类会检索任何选定文档的一切节点,而不是前往节点级别的关系块。

存储文档摘要还可以成功基于 LLM 的检索。咱们不用一开局就将整个文档提供应 LLM,而是先让 LLM 审核扼要的文档摘要,看看它能否与查问关系。这应用了 LLM 的推理才干,这些才干比基于嵌入的查找更先进,但防止了将整个文档提供应 LLM 的老本/提前。

更多

带摘要的文档检索可以看作是一切文档中的语义搜查和强力摘要之间的“两边地带”。咱们依据给定查问的摘要关系性查找文档,而后前往与检索到的文档相对应的一切“节点”。

咱们为什么要这样做?这种检索方法经过在文档级别检索高低文,为用户提供了比文本块上的 top-k 更多的高低文。然而,它也是一种比主题建模更灵敏/智能化的方法;无需再担忧您的文天性否具备正确的主要字标签!

代码示例

上方展现局部构建代码,完整代码地址:

from llama_index import (SimpleDirectoryReader,LLMPredictor,ServiceContext,ResponseSynthesizer)from llama_index.indices.document_summary import GPTDocumentSummaryIndexfrom langchain.chat_models import ChatOpenAI# load docs, define service context...# build the indexresponse_synthesizer = ResponseSynthesizer.from_args(response_mode="tree_summarize", use_async=True)doc_summary_index = GPTDocumentSummaryIndex.from_documents(city_docs,service_cnotallow=service_context,response_synthesizer=response_synthesizer)

一旦索引建设,咱们就可以取得任何给定文档的摘要:

summary = doc_summary_index.get_document_summary("Boston")

接上去,让咱们看一个基于 LLM 的索引检索示例。

from llama_index.indices.document_summary import DocumentSummaryIndexRetrieverretriever = 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_cnotallow=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.0Toronto ( (listen) tə-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 enginefrom llama_index.query_engine import RetrieverQueryEngine# configure response synthesizerresponse_synthesizer = ResponseSynthesizer.from_args()# assemble query enginequery_engine = RetrieverQueryEngine(retriever=retriever,response_synthesizer=response_synthesizer,)# queryresponse = query_engine.query("What are the sports teams in Toronto?")print(response)

原文链接:​ ​​ ​

您可能还会对下面的文章感兴趣: