链载Ai

标题: 使用Qwen-Agent将上下文记忆扩展到百万量级 [打印本页]

作者: 链载Ai    时间: 1 小时前
标题: 使用Qwen-Agent将上下文记忆扩展到百万量级


TLDR:Qwen开发了一个Agent(智能体)用于理解包含百万字词的文档,虽然仅使用Qwen2模型的8k上下文,但效果超过RAG和长序列原生模型。我们还利用此智能体合成长上下文数据,用于训练长上下文的Qwen模型。

引言

近期,能够原生处理数百万字输入的大型语言模型(LLMs)成为了一种趋势。大部分工作集中在模型架构调整,如位置编码扩展或线性注意力机制等。然而,准备足够长度的微调数据作为讨论较少但同样重要的议题,却鲜少被提及。

我们采取以下方法准备数据:

  1. 利用一个较弱的8k上下文聊天模型构建一个相对强大的智能体,能够处理1M的上下文。

  2. 随后,使用该智能体合成微调数据,并应用自动化过滤确保数据质量。

  3. 最终,使用合成数据对预训练模型进行微调,得到一个强大的1M上下文聊天模型。

本博客主要聚焦于第一步,后续步骤的详情将在未来几周或几个月内揭晓。

构建智能体

我们构建的智能体包含三个复杂度级别,每一层都建立在前一层的基础上。

级别一:检索

处理100万字上下文的一种朴素方法是简单采用增强检索生成(RAG)。RAG将上下文分割成较短的块,每块不超过512个字,然后仅保留最相关的块在8k字的上下文中。挑战在于如何精准定位最相关的块。经过多次尝试,我们提出了一种基于关键词的解决方案:

我们也尝试了基于向量的检索,但在大多数情况下,它带来的改进并不显著,不足以抵消部署单独向量模型所带来的额外复杂性。

https://github.com/QwenLM/Qwen-Agent/blob/main/examples/assistant_rag.py

级别二:分块阅读

上述RAG方法很快速,但常在相关块与用户查询关键词重叠程度不足时失效,导致这些相关的块未被检索到、没有提供给模型。尽管理论上向量检索可以缓解这一问题,但实际上效果有限。为了解决这个局限,我们采用了一种暴力策略来减少错过相关上下文的几率:

https://github.com/QwenLM/Qwen-Agent/blob/main/examples/parallel_doc_qa.py

级别三:逐步推理

在基于文档的问题回答中,一个典型的挑战是多跳推理。例如,考虑回答问题:“与第五交响曲创作于同一世纪的交通工具是什么?”模型首先需要确定子问题的答案,“第五交响曲是在哪个世纪创作的?”即19世纪。然后,它才可以意识到包含“自行车于19世纪发明”的信息块实际上与原始问题相关的。

工具调用(也称为函数调用)智能体或ReAct智能体是经典的解决方案,它们内置了问题分解和逐步推理的能力。因此,我们将前述级别二的智能体(Lv2-智能体)封装为一个工具,由工具调用智能体(Lv3-智能体)调用。工具调用智能体进行多跳推理的流程如下:

向Lv3-智能体提出一个问题。
while (Lv3-智能体无法根据其记忆回答问题) {
Lv3-智能体提出一个新的子问题待解答。
Lv3-智能体向Lv2-智能体提问这个子问题。
将Lv2-智能体的回应添加到Lv3-智能体的记忆中。
}
Lv3-智能体提供原始问题的最终答案。

例如,Lv3-智能体最初向Lv2-智能体提出子问题:“贝多芬的第五交响曲是在哪个世纪创作的?”收到“19世纪”的回复后,Lv3-智能体提出新的子问题:“19世纪期间发明了什么交通工具?”通过整合Lv2-智能体的所有反馈,Lv3-智能体便能够回答原始问题:“与第五交响曲创作于同一世纪的交通工具是什么?”

实验

我们在两个针对256k上下文设计的基准测试上进行了实验:

我们比较了以下方法:

实验结果说明了以下几点:

总的来说,如果得到恰当的训练,32k-模型理应优于所有其他方案。然而,实际上由于训练不足,32k-模型的表现不及4k-智能体。

最后,我们还对该智能体进行了100万个字词的压力测试(在100万个字词的大海中寻找一根针),并发现它能够正常运行。然而,我们仍然缺乏一个更贴近真实使用场景的可靠基准来系统量化它在100万字词任务上的表现。

结语

我们在本文中介绍了利用智能体扩展模型上下文记忆的关键思路。一旦智能体准备就绪,如何合成数据便显而易见。例如,我们可以招募志愿者与智能体互动,并记录结果来构建微调数据集。此外,我们还可以利用智能体对其他方法生成的数据进行交叉验证,以确保数据质量。此外,用智能体的结果去微调模型,这个思路也适用于其他领域,比如提升模型解决大规模任务的能力。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5