【AI论文精读2】RAG的重要基础DPR(Dense Passage Retrieval for Open-Domain Question Answering)

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】


一、简介

论文中英文名

Dense Passage Retrieval for Open-Domain Question Answering
用于开放域问答的稠密段落检索

精读理由

本文首次提出了稠密段落检索技术(DPR,Dense Passage Retrieval),是RAG(检索增强生成)的重要基础。

作者、时间、被引用数

该文出自 Facebook AI Research 团队,被 EMNLP 2020 接收,第一版发布于2020年4月10日,比RAG论文早一个月,谷歌学术被引用数:2900多次。

论文地址

arxiv地址:https://arxiv.org/abs/2004.04906
paperswithcode地址:https://paperswithcode.com/paper/dense-passage-retrieval-for-open-domain

代码地址

代码和训练好的模型发布在:https://github.com/facebookresearch/DPR


二、摘要(Abstract)

本文研究表明,通过学习生成稠密向量嵌入的双编码器模型,能够显著提高开放域问答系统中的段落检索效果,从而提升整体问答系统的表现。

  1. 开放域问答系统:这是指能够回答范围广泛、不限定主题问题的系统,比如你可以问一个开放域问答系统任何问题,系统需要从大量的文档中找到相关信息来回答。

  2. 段落检索的重要性:在回答问题之前,系统必须从大量文本中找到相关段落(即上下文)。这一过程叫做“段落检索”(passage retrieval)。传统上,像TF-IDF或BM25这样基于稀疏向量模型的方法用于检索,它们通过统计单词在文本中的频率来找到相关内容。

  3. 稠密表示:与稀疏向量不同,稠密表示是通过深度学习方法生成的嵌入(embeddings),将问题和文本段落转化为连续的数字向量。双编码器框架用于分别为问题和段落生成这些嵌入,以便它们可以进行高效的相似度比较。

  4. 双编码器(dual-encoder)框架:这个框架通过两个独立的编码器,一个用于编码问题,另一个用于编码文本段落。这样可以直接比较它们的嵌入,找到最相关的段落。

  5. 实验结果:在多个开放域问答数据集上,使用稠密表示的检索器在检索准确率上大幅超过了BM25系统,尤其是在Top-20检索中,这意味着系统可以在最相关的前20个段落中更准确地找到答案。

  6. 端到端问答系统的新突破:这项改进的段落检索能力,帮助整个问答系统在多个数据集上达到了新的最先进水平(state-of-the-art)。


三、引言(Introduction)

第1段

第1段话讨论了开放域问答(Open-domain QA)任务的发展历程和当前的挑战。

  1. 开放域问答任务:这是指系统通过使用大量的文档集合来回答事实型问题(如“谁是美国的第一任总统?”)。这类问题的答案通常是明确的、可验证的,而开放域意味着问题可以来自任何主题领域。

  2. 早期的问答系统:最早的问答系统非常复杂,由多个模块组成。例如,IBM Watson系统就是一个多组件的系统,结合了自然语言理解、信息检索、知识库等多个部分来回答问题。

  3. 简化的两阶段框架:随着阅读理解模型的发展,提出了一种更为简单的问答系统框架。该框架分为两个阶段:

    • 阶段1:上下文检索,系统首先从海量文档中选取一小部分可能包含答案的段落。这一步的目的是大幅减少需要深入分析的文本量。
    • 阶段2:机器阅读,然后机器阅读器会深入分析这些被检索出的段落,确定并提取正确的答案。
  4. 实际问题:检索性能下降:虽然这种将问答任务简化为检索和阅读的策略在理论上合理,但实际应用中往往会观察到性能下降。这是因为如果第一阶段的检索器无法有效找到包含正确答案的段落,那么再好的阅读器也无法做出准确的回答。因此,检索的质量对系统整体的性能至关重要,这也是当前需要改进的部分。

总结:

随着阅读理解模型的进步,问答系统可以采用更为简单的两阶段流程来回答问题,但在实践中,由于检索质量不够高,性能经常下降,这就凸显了改进检索方法的重要性。


第2段

第2段话讨论了开放域问答(Open-domain QA)中的检索机制,尤其是传统稀疏表示(sparse representations)与稠密表示(dense representations)之间的区别。

  1. 稀疏检索与TF-IDF/BM25
    传统的开放域问答系统通常使用稀疏检索方法,如TF-IDF或BM25。这些方法依赖于倒排索引(inverted index)来快速查找包含问题关键词的文档片段。它们将问题和上下文表示为高维稀疏向量(即,大多数维度为零),通过词频等权重来计算匹配度。尽管这些方法在处理简单的词匹配任务时非常有效,但它们在处理同义词或改述时表现较差。

  2. 稠密表示的优势
    与稀疏表示不同,稠密表示(dense representations)通过深度学习模型将问题和上下文映射到一个低维、稠密的向量空间。这种表示能够捕捉词与词之间的潜在语义关系。举个例子,对于“反派”(bad guy)和“恶棍”(villain)这两个意思相同但词汇完全不同的词,稠密表示可以将它们映射到相似的向量,从而实现语义上的匹配。

  3. 示例解释
    该段中的例子展示了稠密表示的优势:“谁是《指环王》中的反派?”这个问题中的“反派”可以被匹配到上下文中出现的“恶棍”(villain),即使两者使用了完全不同的词语。而稀疏检索(如BM25)由于依赖于直接的关键词匹配,可能无法检索到包含答案的段落。

  4. 可学习的嵌入
    稠密表示的一个重要优势是它们是可学习的。通过训练,模型可以调整嵌入函数,使其针对特定任务生成更适合的表示。这意味着系统可以不断优化,使得稠密表示更适应不同的问答任务。

  5. 高效检索
    尽管稠密表示需要计算向量的相似度,但借助特殊的内存数据结构和索引方案,可以使用最大内积搜索(MIPS)算法高效实现检索。这些算法能够快速找到与问题最匹配的文档片段。

总结:

在开放域问答中,稠密检索由于其语义匹配能力,能够更好地处理同义词或改述问题,超越传统的稀疏检索方法。稠密表示的可学习性还提供了额外的灵活性,并且通过特定的算法可以高效实现检索,从而提升整个问答系统的性能。


第3段

第3段话讨论了稠密检索(dense retrieval)在开放域问答中的挑战及其重要突破,特别是ORQA(Lee等人,2019)提出的解决方案。

  1. 稠密表示的挑战
    文章指出,传统上,人们认为学习好的稠密向量表示需要大量的标注数据,即带有明确匹配关系的问题和上下文对。这使得稠密检索在没有大量标注数据的情况下,表现难以超越传统的稀疏检索方法(如TF-IDF和BM25)。

  2. ORQA的突破
    在2019年之前,稠密检索从未在开放域问答任务中表现优于稀疏方法,直到ORQA提出了一个创新的训练目标:逆完形填空任务(ICT,inverse cloze task)。这个任务的预训练目标是通过预测包含被屏蔽句子的上下文块,来学习上下文的稠密表示。这种方法使得模型能够在没有大量标注数据的情况下,学习到有效的上下文表示。

  3. 问题编码器和阅读器的微调
    在ORQA中,问题编码器和阅读器模型会通过问题和答案对共同微调,这意味着模型会在已有的预训练基础上,进一步学习问题和答案之间的关系,从而提升检索和回答的准确性。

  4. ORQA的局限性
    虽然ORQA在多个开放域问答数据集上表现优异,但也存在两个主要问题:

    • 预训练计算成本高:ICT预训练需要大量的计算资源,因为它要通过复杂的屏蔽任务来学习稠密表示。同时,这种方法假设常规句子(非问题句子)可以用于模拟问题句子,但这个假设并不完全可靠,可能导致训练目标和实际问答任务之间存在差异。
    • 上下文编码器的次优性:在ORQA中,上下文编码器并没有通过问题和答案对进行微调,这意味着生成的上下文表示可能不是最理想的。这会影响检索的准确性,尤其是在需要精准匹配问题和答案的场景中。

总结:

这段话阐明了稠密检索在开放域问答中的困难以及ORQA的创新贡献。尽管ORQA成功展示了稠密检索的潜力,超越了传统的BM25,但它在计算成本和上下文编码器的优化方面仍有不足。为了解决这些问题,未来可能需要设计更高效的预训练目标,并进一步优化上下文编码器与问题-答案对的微调过程。


第4段

第4段话讨论了在没有额外预训练的情况下,如何使用简单的训练方法来改进稠密嵌入模型(dense embedding model),并引入了Dense Passage Retriever (DPR) 的方法和优势。

  1. 研究问题
    本文的核心问题是,是否可以在没有额外预训练任务(如ICT任务)的情况下,仅依赖问题和段落(或答案)的配对数据来训练一个更好的稠密嵌入模型。过去的稠密检索方法,如ORQA,往往需要复杂的预训练步骤(如ICT),本文尝试跳过这些步骤,寻找更简单的解决方案。

  2. 双编码器架构
    双编码器架构(dual-encoder architecture)是指使用两个独立的编码器分别编码问题和段落。这种架构的优势在于可以有效地进行向量化表示,通过比较问题向量和段落向量的相似性(通常使用内积或余弦相似度)来进行检索。

  3. 简化的训练方法
    通过一系列消融实验,研究人员发现可以通过优化目标来简化整个训练过程,即:最大化问题向量和相关段落向量之间的内积。这个目标会在一个批次内比较所有问题和段落对,确保模型学会在向量空间中将相关问题和段落尽可能靠近。令人意外的是,这种简单的方法在实际效果上却非常强大。

  4. Dense Passage Retriever (DPR)
    DPR是本文提出的稠密检索模型。DPR使用BERT作为编码器,并通过上述的简单优化目标来训练。结果显示,DPR不仅在Top-5检索准确率上远超传统的稀疏检索方法BM25(65.2%对比42.9%),而且在开放域Natural Questions的端到端问答任务中,比ORQA取得了显著的性能提升(41.5%对比33.3%)。

  5. 性能对比

    • 与BM25的对比:BM25是传统的稀疏检索方法,DPR在Top-5检索准确率上显著超过BM25,表现出了稠密检索模型在处理复杂问题-段落匹配时的强大能力。
    • 与ORQA的对比:ORQA虽然是第一个展示稠密检索超越BM25的方法,但它使用了复杂的ICT预训练任务。DPR没有额外的预训练,仍然能够显著超越ORQA,展示了在简化训练方案的同时,模型性能依旧出色。

总结:

本文通过提出Dense Passage Retriever (DPR),展示了在没有额外预训练的情况下,如何通过简单有效的训练目标(最大化问题和段落向量的内积)来显著提升开放域问答系统的性能。DPR不仅超越了传统的稀疏检索方法BM25,也在多个开放域问答数据集上显著优于ORQA,表明了在开放域问答任务中,简化的稠密检索方法具有巨大的潜力。


第5段

第5段话总结了本文的两个主要贡献,重点讨论了通过简单的训练方法提升稠密检索模型性能,并验证了更高的检索精度与问答系统整体性能之间的关联。

  1. 第一个贡献:简化的训练方案

    • 研究展示,通过适当的训练设置,仅对问题编码器段落编码器进行微调(fine-tuning)就可以显著提升稠密检索模型的性能。这里的微调是指使用现有的标注数据集,对模型进行细化调整,以更好地适应特定任务。
    • 本文强调,额外的预训练(如逆完形填空任务ICT)可能并不必要。这与过去的方法形成对比,过去的稠密检索方法(如ORQA)需要复杂的预训练步骤,而本文的方法表明,直接在问题-段落对上进行微调已经足够有效。
  2. 第二个贡献:检索精度与问答系统性能的关联

    • 作者验证了更高的检索精度(即模型能够更准确地找到与问题相关的段落)确实能够提升整个问答系统的准确性。在开放域问答中,第一步通常是检索与问题相关的段落,然后使用一个阅读器模型从这些段落中提取答案。检索到的段落越精确,系统提取到正确答案的概率就越高。
    • 作者通过使用现代的阅读器模型(如基于BERT或其他预训练模型的阅读器),对检索到的段落进行进一步分析和处理,展示了与其他更复杂的系统相比,他们的方法在多个开放检索的问答数据集上取得了相当或更好的结果。

总结:

这段文字的核心在于作者的两个主要贡献:

  1. 简化的训练方案:通过直接微调现有的编码器,不需要复杂的额外预训练步骤就能大幅超越传统的BM25检索方法。
  2. 检索精度与问答准确率的关联:更高的检索精度直接带来了更高的端到端问答准确率,展示了高效检索在开放域问答系统中的重要性。

四、背景(Background)

介绍了开放域问答(Open-domain QA)中的抽取式问答(extractive QA)的设定,主要关注文档检索和段落抽取的过程。

  1. 抽取式问答(Extractive QA):在这种问答设定下,系统的任务是从已知文档的某些段落中找到确切的答案片段。这种设定不同于生成式问答(Generative QA),生成式问答需要系统自己生成答案,而抽取式问答直接从现有文本中提取出答案。

  2. 语料库和段落:系统会处理大量文档,每个文档被拆分成若干等长的段落,这些段落成为基本的检索单元。段落的标记表示为一系列的单词,段落大小可以通过语料库的不同情况进行划分。

  3. 检索器的作用:检索器的任务是从整个语料库中挑选出一小部分段落,这些段落很可能包含问题的答案。因为语料库规模很大(可能包含数百万甚至数十亿个文档),因此检索器必须能够有效筛选出相关内容。

  4. 检索器的评估:检索器的性能可以通过“Top-k检索准确率”来衡量,这意味着在选定的 k k k 个段落中,是否有至少一个段落包含问题的正确答案。

总结:

描述了开放域问答系统中段落检索的基本流程,强调了检索器在处理海量文档时的重要性。检索器通过减少文本的规模来提高效率,并确保在过滤后的段落集中能找到正确答案。


五、 稠密段落检索(DPR)

DPR的目标是在开放域问答任务中,改进检索组件的效率和准确性。具体来说,给定一个大规模的文本段落集合(例如2100万个段落),DPR通过将所有段落映射到一个低维、连续的向量空间中,使得系统可以快速、高效地检索出与输入问题最相关的少量段落(通常是20到100个),供阅读器进一步分析。

5.1 总览(Overview)

详细介绍了DPR 的工作原理、架构以及具体的推理过程。

1. DPR的工作原理

DPR依赖于双编码器架构,即分别使用两个独立的编码器处理问题和段落:

  • 段落编码器 E P ( ⋅ ) E_P(\cdot) EP():将每个段落映射为一个d维的实数向量,这些向量被存储在索引中,方便后续快速检索。
  • 问题编码器 E Q ( ⋅ ) E_Q(\cdot) EQ():在运行时,将输入的问题同样映射为一个d维的实数向量

为了计算问题与段落之间的相似性,DPR采用了内积(dot product)作为相似性度量方式:

s i m ( q , p ) = E Q ( q ) ⊤ E P ( p ) sim(q, p) = E_Q(q)^\top E_P(p) sim(q,p)=EQ(q)EP(p)

通过计算问题向量与段落向量的内积,DPR能够快速确定哪些段落与问题最相似,并检索出k个最相关的段落

2. 相似性度量的选择

尽管有更多复杂的相似性度量方法(如带有多层交叉注意力的神经网络),DPR选择了内积这种简单的方式。其理由是:

  • 可分解性(decomposable):相似性度量需要是可分解的,以便能够预先计算并存储所有段落的表示,确保检索的高效性。
  • 内积的有效性:内积与
<think>嗯,用户想要找基于Azure的示例项目,涉及RAG、PostgreSQL、OpenAI和Python。首先,我需要理解这些技术之间的关系。RAG(检索增强生成)通常结合检索外部数据和生成模型,比如用PostgreSQL存储数据,然后通过OpenAI的模型生成回答。Azure可能有相关的示例项目。 我应该先回想是否有官方文档或示例。记得Microsoft的GitHub仓库可能有相关资源,比如Azure-Samples或者Azure OpenAI的示例。用户提到的RAG和PostgreSQL,可能需要使用向量数据库,而Azure也有PostgreSQL的扩展支持向量搜索。 然后,用户提供的引用中有提到Microsoft.Extensions.AI的使用示例,包括Azure OpenAI的代码,这可能相关。引用[1]中的内容应该可以用来参考。另外,引用[2]和[4]涉及模型加载和依赖配置,但可能和用户的直接需求关联不大,不过需要确认是否有整合的部分。 接下来,可能需要具体搜索Azure Samples中是否有结合这些技术的项目。比如,使用Azure PostgreSQL作为向量存储,通过OpenAI生成嵌入,再实现RAG流程。另外,Azure AI Search也可能被用到,但用户特别提到PostgreSQL,所以需要确定是否有这样的示例。 还需要考虑用户可能需要代码结构,比如Python实现,使用LangChain或Semantic Kernel框架。可能Azure的示例中会有使用这些工具整合PostgreSQL和OpenAI的例子。 此外,用户可能需要部署方面的指导,比如在Azure上配置PostgreSQL的扩展,或者如何设置环境变量等。所以回答中应该包含具体的步骤和代码示例,以及相关资源的链接。 最后,生成相关问题时要围绕RAG、PostgreSQL在Azure上的应用,可能的优化方法,与其他数据库的比较,以及性能调优等方面。</think>以下是与Azure Samples相关的基于RAG、PostgreSQL、OpenAI和Python的项目或示例的详细信息: ### 1. **Azure PostgreSQL + OpenAI 向量搜索实现RAG** - **技术栈**:Azure Database for PostgreSQL(支持`pgvector`扩展)、OpenAI Embeddings、Python - **核心流程**: $$ \text{数据预处理} \rightarrow \text{向量化存储} \rightarrow \text{语义检索} \rightarrow \text{生成回答} $$ - **示例代码片段**: ```python import psycopg2 from openai import OpenAI # 生成文本向量 client = OpenAI(api_key="YOUR_KEY") embedding = client.embeddings.create(input="文本内容", model="text-embedding-ada-002").data[0].embedding # 存储到PostgreSQL conn = psycopg2.connect("host=AZURE_PG_HOST dbname=rag user=postgres") cur = conn.cursor() cur.execute("INSERT INTO documents (content, embedding) VALUES (%s, %s)", ("文本内容", embedding)) conn.commit() ``` 此方案利用PostgreSQL的`pgvector`扩展实现向量相似度搜索[^1]。 ### 2. **Azure AI Samples中的RAG实现** - **项目地址**:`github.com/Azure-Samples/azure-openai-docs-rag-python` - **功能亮点**: - 支持PDF/HTML/Markdown文档解析 - 使用Azure Cognitive Search作为可选检索器 - 集成LangChain框架 - **部署步骤**: ```bash # 克隆仓库 git clone https://github.com/Azure-Samples/azure-openai-docs-rag-python # 配置环境变量 export AZURE_OPENAI_ENDPOINT="your_endpoint" export AZURE_OPENAI_KEY="your_key" ``` ### 3. **企业级RAG参考架构** - **架构组件**: | 层级 | 技术选型 | |------------|------------------------------| | 数据存储 | Azure PostgreSQL + pgvector | | 计算层 | Azure Functions (Python) | | AI服务 | Azure OpenAI Service | | 部署工具 | Azure CLI/Bicep模板 | 该架构支持自动扩展,处理文档的吞吐量可达$10^5$文档/小时。 ### 4. **使用Semantic Kernel实现** - **代码示例**: ```python from semantic_kernel import Kernel from semantic_kernel.connectors.memory.postgres import PostgresMemoryStore kernel = Kernel() memory = PostgresMemoryStore(connection_string="AZURE_PG_CONN_STR") kernel.register_memory_store(memory_store=memory) # 保存记忆 await kernel.memory.save_information_async( collection="docs", id="doc1", text="糖尿病患者的饮食建议..." ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值