专栏名称: 计算机视觉深度学习和自动驾驶
讨论计算机视觉、深度学习和自动驾驶的技术发展和挑战
目录
相关文章推荐
普象工业设计小站  ·  亚洲顶流表情包女孩20岁了,最新近照惊艳曝光 ... ·  19 小时前  
普象工业设计小站  ·  视频退出键在哪里?!水果版定格动画,越看越魔性! ·  昨天  
普象工业设计小站  ·  笑得停不下来!艺术家给小动物们P上长长的小手 ... ·  2 天前  
51好读  ›  专栏  ›  计算机视觉深度学习和自动驾驶

使用Qwen-Agent将上下文记忆扩展到百万量级

计算机视觉深度学习和自动驾驶  · 公众号  ·  · 2024-06-11 09:05

正文

原文:使用Qwen-Agent将上下文记忆扩展到百万量级

https://qwenlm.github.io/zh/blog/qwen-agent-2405/

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

引言

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

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

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

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

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

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

构建智能体

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

级别一:检索

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

  • 步骤1:指导聊天模型将用户查询中的指令信息与非指令信息分开。例如,将用户查询"回答时请用2000字详尽阐述,我的问题是,自行车是什么时候发明的?请用英文回复。"转化为{"信息": ["自行车是什么时候发明的"], "指令": ["回答时用2000字", "尽量详尽", "用英文回复"]}。

  • 步骤2:要求聊天模型从查询的信息部分推导出多语言关键词。例如,短语"自行车是什么时候发明的"会转换为{"关键词_英文": ["bicycles", "invented", "when"], "关键词_中文": ["自行车", "发明", "时间"]}。

  • 步骤3:运用BM25这一传统的基于关键词的检索方法,找出与提取关键词最相关的块。

流程图:检索

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

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

级别二:分块阅读

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

  • 步骤1:对于每个512字块,让聊天模型评估其与用户查询的相关性,如果认为不相关则输出"无", 如果相关则输出相关句子。这些块会被并行处理以避免长时间等待。

  • 步骤2:然后,取那些非"无"的输出(即相关句子),用它们作为搜索查询词,通过BM25检索出最相关的块(总的检索结果长度控制在8k上下文限制内)。

  • 步骤3:最后,基于检索到的上下文生成最终答案,这一步骤的实现方式与通常的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上下文设计的基准测试上进行了实验:

  • NeedleBench,一个测试模型是否能在充满大量无关句子的语境中找到最相关句子的基准,类似于“大海捞针”。回答一个问题可能需要同时找到多根“针”,并进行多跳逐步推理。

  • LV-Eval是一个要求同时理解众多证据片段的基准测试。我们对LV-Eval原始版本中的评估指标进行了调整,因为其匹配规则过于严苛,导致了许多假阴性结果。

我们比较了以下方法:







请到「今天看啥」查看全文