信息检索(四):Generation-Augmented Retrieval for Open-Domain Question Answering


原文链接:https://aclanthology.org/2021.acl-long.316/
(2021)


摘要

我们提出生成增强检索(GAR)来回答开放域问题,它通过启发式发现的相关上下文的文本生成来增强查询,而无需外部资源作为监督。我们证明,生成的上下文极大地丰富了查询的语义,并且具有稀疏表示的 GAR (BM25) 实现了与 DPR 等最先进的密集检索方法相当或更好的性能(Karpukhin 等人,2020)。我们表明,为查询生成不同的上下文是有益的,因为融合它们的结果始终会产生更好的检索准确性。此外,由于稀疏表示和稠密表示通常是互补的,GAR 可以轻松地与 DPR 结合以实现更好的性能。当配备提取阅读器时,GAR 在提取 QA 设置下在 NQ 和 TriviaQA 数据集上实现了最先进的性能,并且在使用相同的生成阅读器时始终优于其他检索方法。

1. 引言

开放域问答(OpenQA)旨在回答没有预先指定域的事实问题,并且有许多实际应用。在 OpenQA 中,经常使用大量文档(例如维基百科)来寻找与问题相关的信息。最常见的方法之一是使用检索器-阅读器架构(Chen et al, 2017),它首先使用问题作为查询来检索一小部分文档,然后读取检索到的文档以提取(或生成)答案。检索器至关重要,因为检查整个文档集合中的每一条信息(例如数百万维基百科段落)是不可行的,并且检索准确性限制了(提取)阅读器的性能。

早期的 OpenQA 系统(Chen 等人,2017)使用经典的检索方法,例如具有稀疏表示的 TF-IDF 和 BM25。稀疏方法轻量级且高效,但无法执行语义匹配,并且无法检索没有词汇重叠的相关段落。最近,基于密集表示的方法(Guu 等人,2020;Karpukhin 等人,2020)学习将查询和段落嵌入到潜在向量空间中,在该空间中可以测量超出词汇重叠的文本相似性。密集检索方法可以检索语义相关但词汇不同的段落,并且通常比稀疏方法获得更好的性能。然而,密集模型的计算成本更高,并且会遭受信息丢失,因为它们将整个文本序列压缩为固定大小的向量,不能保证精确匹配(Luan et al, 2020)。

最近有一些关于其他检索任务的文本生成查询重构的研究,例如,将查询重写为上下文无关的(Y u et al, 2020; Lin et al, 2020; V akulenko et al, 2020)或结构良好的(Liu et al, 2019)。然而,这些方法需要特定于任务的数据(例如,对话上下文、格式错误的查询)或外部资源,例如释义数据(Zaiem 和 Sadat,2019;Wang 等人,2020),而这些数据不能或不能很好地转移到 OpenQA 。此外,有些依赖于耗时的训练过程,如强化学习 (RL)(Nogueira 和 Cho,2017;Liu 等人,2019;Wang 等人,2020),这对于 OpenQA 来说效率不够(第 2 节中的更多讨论)。

在本文中,我们提出了生成增强检索(GAR),它通过预训练语言模型(PLM)的文本生成来增强查询。与之前重新表述查询的研究不同,GAR 不需要外部资源或通过 RL 的下游反馈作为监督,因为它不会重写查询,而是通过启发式发现的相关上下文对其进行扩展,这些上下文从 PLM 中获取并提供更丰富的背景信息(表2)。例如,通过提示 PLM 在给定查询的情况下生成相关段落的标题并将生成的标题附加到查询中,检索该相关段落就会变得更加容易。直观上,生成的上下文明确表达了原始查询中未呈现的搜索意图。因此,与具有原始查询密集表示的最先进方法(Karpukhin 等人,2020;Guu 等人,2020)相比,具有稀疏表示的 GAR 实现了相当甚至更好的性能,同时更加轻量级和高效在训练和推理方面(包括生成模型的成本)(第 6.4 节)。

具体来说,我们通过添加相关上下文来扩展查询(问题)。
1)我们以问题作为输入,以各种可自由访问的 域内上下文作为输出(例如答案、答案所属的句子以及包含答案的段落的标题) 进行 seq2seq 学习。
2)然后,我们将生成的上下文附加到问题中,作为检索的生成增强查询。 我们证明,使用来自不同生成目标的多个上下文是有益的,因为融合不同生成增强查询的检索结果一致地产生更好的检索准确性。

我们对 Natural Questions (NQ) (Kwiatkowski et al, 2019) 和 TriviaQA (Trivia) (Joshi et al, 2017) 数据集进行了广泛的实验。
结果揭示了 GAR 的四大优势:
1)GAR 与 BM25 相结合,比使用原始查询或现有无监督查询扩展(QE)方法的相同 BM25 模型取得了显着的收益。
2)具有稀疏表示的 GAR (BM25) 实现了与当前最先进的检索方法相当甚至更好的性能,例如使用密集表示的 DPR (Karpukhin et al, 2020)。
3)由于 GAR 使用稀疏表示来测量词汇重叠,因此它与密集表示是互补的:通过融合 GAR 和 DPR 的检索结果,我们始终获得比单独使用任何一种方法更好的性能。
4)当使用相同的提取阅读器时,GAR 在端到端 QA 性能 (EM) 上优于 DPR:NQ 上的 EM=41.8(与 DPR 结合时为 43.8),Trivia 上的 62.7,创造了新的提取 OpenQA 的sota结果。当使用相同的生成阅读器时,GAR 在生成设置下也优于其他检索方法:NQ 上的 EM=38.1(与 DPR 结合时为 45.3),Trivia 上的 62.2。

贡献
(1) 我们提出了生成增强检索(GAR),它通过文本生成通过启发式发现的相关上下文来增强查询,而无需外部监督或耗时的下游反馈。
(2) 我们表明,与使用原始查询或现有的无监督 QE 方法相比,使用生成增强查询可以获得更好的检索和 QA 结果。
(3) 我们证明,GAR 与简单的 BM25 模型相结合,在提取性 OpenQA 的两个基准数据集上实现了新的最先进的性能,并在生成环境中取得了有竞争力的结果。

2. 相关工作

传统的查询扩展
GAR 与基于伪相关反馈的查询扩展 (QE) 方法有一些共同点(Rocchio,1971;Abdul-Jaleel 等,2004;Lv 和 Zhai,2010),因为它们都使用相关上下文&#x

### 关于 LightRAG 的代码实现 LightRAG 是一种将图结构引入文本索引的方法,旨在通过构建图结构捕捉实体间的复杂关系。这种方法允许系统更高效地处理复杂的多跳查询,特别是在涉及多个文档段落的情况下[^1]。 尽管目前没有直接提及具体的 LightRAG 实现细节或官方代码库的信息,但从其描述来看,可以推测其实现有赖于以下几个关键技术点: #### 1. 图结构的构建 为了支持高效的多跳查询,LightRAG 需要先构建一个基于实体和关系的图结构。这种图可以通过以下方式实现: - 使用 Python 中的 `networkx` 库来创建和操作图数据结构。 - 将实体作为节点,关系作为边存储在图中。 以下是简单的图构建示例代码: ```python import networkx as nx # 创建有向图 G = nx.DiGraph() # 添加节点(实体) G.add_node("Entity_A", type="Person") G.add_node("Entity_B", type="Location") # 添加边(关系) G.add_edge("Entity_A", "Entity_B", relation="visited") # 输出图信息 print(G.nodes(data=True)) print(G.edges(data=True)) ``` #### 2. 文本索引与检索 LightRAG 结合了双层次检索模式,这意味着它可能依赖某种形式的倒排索引来加速文本匹配过程。具体来说,可以利用 Elasticsearch 或 FAISS 来完成这一部分功能。 FAISS 示例代码如下: ```python import faiss import numpy as np # 构建索引 dimension = 128 # 嵌入维度 index = faiss.IndexFlatL2(dimension) # 插入嵌入向量 vectors = np.random.rand(100, dimension).astype('float32') index.add(vectors) # 查询最近邻 query_vector = np.random.rand(1, dimension).astype('float32') distances, indices = index.search(query_vector, k=5) print(indices) ``` #### 3. 多跳推理机制 对于多跳查询的支持,通常需要设计递归式的查询逻辑或者借助 Transformer 编码器解码器架构进行上下文理解。这部分可以从 RAG (Retrieval-Augmented Generation) 系统的设计思路出发[^2]。 假设我们已经有了预训练的语言模型,则可以在 PyTorch 上搭建基础框架: ```python from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tokenizer = AutoTokenizer.from_pretrained("facebook/rag-token-base") model = AutoModelForSeq2SeqLM.from_pretrained("facebook/rag-token-base") def generate_response(contexts, question): inputs = tokenizer([question], return_tensors="pt") with tokenizer.as_target_tokenizer(): targets = tokenizer([""], return_tensors="pt")["input_ids"] outputs = model.generate( context_input_ids=contexts, **inputs ) response = tokenizer.decode(outputs[0], skip_special_tokens=True) return response contexts = ... # 提供从数据库检索到的相关段落 question = "What is the capital of France?" response = generate_response(contexts, question) print(response) ``` 虽然上述代码片段并未完全针对 LightRAG 进行定制化开发,但它展示了如何结合外部知识源增强生成能力的核心理念。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值