DRAGIN: 基于大型语言模型信息需求的动态检索增强生成

原文:towardsdatascience.com/dragin-dynamic-retrieval-augmented-generation-based-on-the-information-needs-of-large-language-dbdb9aabc1ef?source=collection_archive---------2-----------------------#2024-12-05

传统 RAG 与动态 RAG

https://medium.com/@atisharajpurohit?source=post_page---byline--dbdb9aabc1ef--------------------------------https://towardsdatascience.com/?source=post_page---byline--dbdb9aabc1ef-------------------------------- Atisha Rajpurohit

·发表于 Towards Data Science ·阅读时间 9 分钟·2024 年 12 月 5 日

在本文中,我探讨了研究论文《DRAGIN:基于大型语言模型信息需求的动态检索增强生成》中解释的基本概念,作者是** Weihang Su、Yichen Tang、Qingyao Ai、Zhijing Wu 和 Yiqun Liu。这篇论文可以在 这里* 访问。*

引言 — 让我们来看一个短故事!

假设你正在解决一个问题。刚开始时,你 只有一次机会 向你的教授请教。这意味着在开始时理解问题的整体范围非常重要。如果是一个简单的问题,可能没问题——你提问、获得清晰的答案,然后继续前进。

现在,假设这个问题 变得更加复杂。你越深入探讨,就会有 更多问题 !不幸的是,你不能再回去问你的教授,因为所有问题都必须在一开始就提出来。这使得问题的解决变得更加困难。

但如果,假设, 你被允许 每当发现一个扩展问题范围的新问题时都可以回去请教教授呢?这种方法允许你在问题发展时迭代地导航复杂性,每当问题有新发展时都可以请求指导。 这就是 DRAGIN(动态 RAG)与传统 RAG 的本质区别。

考虑到我们的任务、问题和世界变得如此复杂且多维, 这种动态方法的需求比以往任何时候都更为迫切!

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7924a1b2e6c2c88c65926dbc4ca8f2ea.png

图片来自Unsplash

大型语言模型改变了我们获取信息的方式。我们正处于一个阶段,在这个阶段,我们搜索信息的方式已经永远改变。现在,我们不需要再寻找多个链接并处理信息来回答问题,我们可以直接向 LLM 提问!

然而,仍然存在一些问题:

  1. 幻觉:生成虚假信息

  2. 过时/陈旧:无法获取最新的信息

  3. 专有信息:无法访问专门知识

为了解决上述问题,**检索增强生成(RAG)**作为一种有前景的解决方案应运而生。它的工作原理是通过访问并结合 LLM 生成准确回答所需的相关外部信息。

然而,传统的 RAG 方法依赖于单轮检索,这意味着信息生成开始时只进行一次外部信息检索。这对于简单的任务来说效果很好,但我们对 LLM 的需求和要求正变得越来越复杂、多步骤,并且需要更长的回答。

在这些情况下,单轮检索效果不好,需要进行多轮检索。当我们谈到多次检索时,接下来的两个问题是:

何时 进行检索, 检索什么 ?为了解决这些问题,已经设计了多种 RAG 方法:

固定检索方法:

IRCoT(固定句子 RAG) [1]:为每个生成的查询进行检索,最新的句子用作查询。

RETRO [2] 和 IC-RALM [3] (固定长度 RAG):定义一个滑动窗口,每生成n个 token 就触发一次检索模块。

但我们不是在检索 太频繁 了吗?这会导致检索到可能不必要的信息吗?这会引入噪声,并可能危及 LLM 输出的质量,违背了提高准确性的初衷。这些规则仍然是 静态 的,我们需要思考 动态 的检索方式。

动态检索方法:

FLARE [4] (低置信度 RAG):当 LLM 对下一个 token 的置信度(生成概率)低于某个阈值时,会动态进行检索。所以,FLARE 是基于不确定性触发检索的。

为了确定检索什么,LLM 通常会限制自己基于最近生成的几个 token 或句子来形成查询。这些查询生成方法在任务变得更加复杂且 LLM 的信息需求涵盖整个上下文时可能无法奏效!

最后,让我们来看看本次的明星:DRAGIN!

DRAGIN(基于信息需求的动态检索增强生成):

这种方法专门用于决定何时以及检索什么信息,以满足 LLM 的信息需求。因此,它通过两个框架优化了信息检索的过程。正如作者在论文中所解释的,DRAGIN 有两个关键框架:

I. RIND(实时信息需求检测):什么时候检索?

它会考虑 LLM 对自身内容的不确定性、每个标记的影响以及每个标记的语义

II. QFS(基于自注意力的查询构建):要检索什么?

查询构建利用了 LLM 在整个上下文中的自注意力,而不仅仅是最后几个标记或句子。

DRAGIN 框架的示意图

为了说明上述框架,论文使用了一个关于‘爱因斯坦简要介绍’的查询示例。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4a52907f87cb4494167079dfde05162d.png

图 1:DRAGIN 框架的示意图,摘自研究论文

解释:

提供输入: 系统被查询提供一些关于爱因斯坦的介绍。

处理开始: 系统根据它已知的信息开始生成响应。它使用 RIND 模块来决定是否有足够的信息,或者是否需要查找更多信息。

检查所需信息(RIND): 系统将查询分解成更小的部分(标记),例如“职位”、“在”、“大学”等。它检查哪些部分(标记)需要更多信息。例如,“大学”可能需要额外的数据,因为它不够具体。

触发检索: 如果像“大学”这样的标记被认为重要且不明确,系统会触发检索以收集关于它的外部信息。在这种情况下,它会查找有关爱因斯坦和大学的相关数据。

制定查询(QFS): 系统使用自注意力机制来确定哪些词语在形成精确查询时最为相关。例如,它可能会选择“爱因斯坦”、“1903”和“找到工作”作为关键部分。

这些关键词用于构建查询,例如“爱因斯坦 1903 找到一份工作”,该查询将发送给外部源获取信息。

获取和添加信息: 外部源提供所需的详细信息。例如,它可能返回:“在 1903 年,爱因斯坦在瑞士专利局找到了一份工作。”系统将这些新信息融入到回答中。

继续生成: 根据新信息,系统继续生成更完整、更准确的回答。例如,它现在可能会说:“在 1903 年,爱因斯坦在瑞士专利局找到了一份工作。这使他能够有稳定的收入。”

重复过程: 如果识别到更多需求,过程将重复: 检查、检索和整合信息 直到响应完整且准确。这个过程确保系统能够动态地填补知识空白,并通过结合已知信息和检索到的外部信息,提供详细且准确的答案。

RAG 的详细方法

文中提到的框架有:

A. 实时信息需求检测 (RIND) : 检索是基于令牌的不确定性、对其他令牌的影响以及每个令牌的语义重要性来触发的。

i. 定量化每个 LLM 生成的令牌的不确定性。通过计算令牌在词汇表中的概率分布的来实现这一点。考虑输出序列 T = {t1,t2,…tn},其中每个 ti 表示位置 i 的一个单独令牌。对于任何令牌 ti,熵的计算公式如下:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c2d74a24d50aa33f9bf4cd886114bf7c.png

其中 pi(v) 表示生成令牌 v 在词汇表中所有令牌中的概率。

ii. 通过利用自注意力分数来计算每个令牌对后续令牌的影响。对于令牌 t,识别最大注意力值

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0dd60c04c99fd38b31718ece5d1fe3ed.png

iii. 每个令牌 ti语义贡献,采用二进制指示器。这会过滤掉停用词。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/83700fa2c321943eb4530d4cb99dffd4.png

结合不确定性、重要性和语义,RIND 计算一个分数,如果这个分数大于预定义的阈值,则触发检索。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7029f1628a5da2ff0d470da41943d9ef.png

B. 基于自注意力的查询制定(QFS)

一旦触发检索,下一步是从外部数据库中制定高效的查询,以继续生成 LLM。在现有的动态 RAG 框架中,查询是使用 LLM 生成的最后一句话或最后一个令牌来制定的。这种狭窄的范围没有捕捉到实时信息需求的必要性。它检查的是完整的上下文。

假设 RIND 识别到位置 i 的令牌 ti,需要外部知识并触发检索。

由于令牌 ti 是基于所有前置令牌的知识生成的,因此从现在起查看已生成的完整内容来制定查询是有意义的。它使用以下步骤:

步骤 1:提取最后一个 Transformer 层中每个令牌 ti 的注意力分数。

步骤 2:按降序排列注意力分数,以识别前n个分数。(这基本上是识别最重要的令牌)。

步骤 3:从词汇表中找到这些令牌对应的词,并按照原始顺序排列。(这通过注意力分数和令牌恢复了语言结构)。

第 4 步:使用与这些顶部n个标记相关的词构造查询Qi

C. 检索后继续生成

一旦 RIND 识别出需要外部知识的位置i,并且 QFS 生成查询 Qi 以使用现成的检索模型(例如,BM25)提取信息。

它从文档Di1Di2Di3中找到了相关信息。通过截断 LLM 的输出,它整合了位置i上的相关信息。然后,使用以下设计的提示模板整合这些检索到的知识。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/56da182d3b34f09b8a8c32282f39938d.png

用于整合外部检索信息的设计提示模板。

局限性

正如本文所述,本文的主要局限性在于它依赖自注意力机制来处理实时信息需求检测(RIND)和基于自注意力的查询生成(QFS)。虽然所有源 LLM 都可以获得自注意力分数,但对于某些不提供自注意力分数的 API,这种方法不可行。

值得考虑的一点是对推理时间延迟和成本的影响:在论文中,作者指出这些影响仅仅是微乎其微,因为不完美的标记子序列会迅速被检测到,进一步的生成会被中断,直到进行修正。

结论

DRAGIN 框架使我们能够比传统的 RAG 框架走得更远。它允许我们根据生成的信息需求执行多次检索。它是一个优化的多次检索框架!

我们对 LLM 的需求和要求变得越来越大且复杂,在我们希望准确检索信息且仅需适量检索的情况下,DRAGIN 框架提供了解决方案。

总结,DRAGIN:

为检索的数量找到了完美的平衡。

生成高度上下文感知的检索查询。

生成来自 LLM 的内容,准确度更高!

非常感谢您的阅读,若想更详细了解本研究论文,请观看我的视频!

参考文献:

[1] Harsh Trivedi, Niranjan Balasubramanian, Tushar Khot, and Ashish Sabharwal. 2022. Interleaving retrieval with chain-of-thought reasoning for knowledge-intensive multi-step questions. arXiv preprint arXiv:2212.10509.

[2] Sebastian Borgeaud, Arthur Mensch, Jordan Hoffmann, Trevor Cai, Eliza Rutherford, Katie Millican, George Bm Van Den Driessche, Jean-Baptiste Lespiau, Bogdan Damoc, Aidan Clark, et al. 2022.

[3] Ori Ram, Yoav Levine, Itay Dalmedigos, Dor Muhlgay, Amnon Shashua, Kevin Leyton-Brown, and Yoav Shoham. 2023. In-context retrieval-augmented language models. arXiv preprint arXiv:2302.00083.

[4] Zhengbao Jiang, Frank F Xu, Luyu Gao, Zhiqing Sun, Qian Liu, Jane Dwivedi-Yu, Yiming Yang, Jamie Callan, and Graham Neubig. 2023. Active retrieval augmented generation. arXiv preprint arXiv:2305.06983.

<think>好的,我现在需要帮用户解决使用清华大学镜像源创建名为dragain的Conda环境,并指定Python版本为3.9的问题。首先,我得回忆一下Conda配置镜像源的步骤,以及创建环境时可能遇到的常见问题。 用户提到想使用清华镜像,所以第一步应该是配置Conda的镜像源。根据用户提供的引用[2],正确的做法是通过conda config命令添加清华的各个频道,然后设置显示频道URL。这些命令应该能帮助用户添加必要的镜像源,替换默认的源,从而加速下载。 接下来,用户需要创建名为dragain的环境,Python版本3.9。根据引用[3]和引用[4],创建环境的基本命令是conda create -n dragain python=3.9。但有时候可能会遇到网络问题,比如SSL验证失败或者连接问题。这时候可能需要关闭SSL验证,如引用[4]提到的conda config --set ssl_verify false,不过用户可能更希望优先使用镜像源而不是关闭安全设置。 另外,用户可能在创建环境时如果镜像源没有正确配置,会遇到Solving environment失败的问题,如引用[5]中的情况。这时候需要确保镜像源已经正确添加,并且没有拼写错误。同时,检查网络连接是否正常,或者是否需要使用代理。 还有一个需要注意的地方是,用户可能混淆了环境名称,比如在示例中用户写的是dragain和dragin,需要确认正确的环境名称。同时,Python版本是否正确,3.9是否存在对应的包。 总结步骤应该是:首先配置清华镜像源,然后执行创建环境的命令,如果遇到问题,再考虑关闭SSL验证或者检查网络设置。同时,提醒用户激活环境和验证安装是否成功,这样用户能确认环境是否创建正确。 在生成相关问题的时候,需要考虑用户可能遇到的后续问题,比如如何激活环境,如何安装包,或者如何删除环境,这些都是常见的后续操作。此外,镜像源配置的其他方法或者错误处理也是用户可能需要的帮助点。</think>### 分步解答 1. **配置清华镜像源** 打开终端(cmd或Anaconda Prompt),依次执行以下命令添加清华镜像源: ```bash conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2 conda config --set show_channel_urls yes ``` 这会覆盖默认的conda源,加速包下载[^2]。 2. **创建Conda环境** 执行以下命令创建名为`dragain`的环境,并指定Python 3.9: ```bash conda create -n dragain python=3.9 ``` 输入`y`确认安装依赖包。 3. **验证环境** 创建完成后,激活环境: ```bash conda activate dragain ``` 检查Python版本: ```bash python --version ``` 4. **常见问题处理** - **网络连接失败**:若出现`CondaHTTPError`,尝试关闭SSL验证: ```bash conda config --set ssl_verify false ``` 然后重试创建环境[^4]。 - **镜像源失效**:确保镜像URL使用`https`协议(清华源已启用HTTPS)。 --- ### 完整操作示例 ```bash # 步骤1:配置镜像源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2 conda config --set show_channel_urls yes # 步骤2:创建环境 conda create -n dragain python=3.9 # 步骤3:激活环境 conda activate dragain ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值