微信扫码
与创始人交个朋友
我要投稿
Qwen Team
摘要:之前介绍过千问1.5技术报告,本周千问2发布了,带来很多惊喜。与这周清华智谱GLM4-9B开源发布类似,不过Qwen2家族产品更丰富。QWen2支持27种语言数据集(与加拿大Cohere Aya26种语言数据集媲美,超过Mistral),显示了中国大模型厂家以清华智谱、千问、零一等参与全球AI产业竞争及服务中国企业出海出境及国家一带一路战略决心和企业格局。千问2的特点是持续提升Qwen的代码及数学能力。在代码方面,将CodeQwen1.5的融入Qwen2的研发中,实现了在多种编程语言上的显著效果提升。在数学方面,大规模且高质量的数据帮助Qwen2-72B-Instruct实现了数学解题能力的飞升。Qwen2-72B-Instruct能够完美处理128k上下文长度内的信息抽取任务。Qwen2-7B-Instruct完美地处理长达128k的上下文;Qwen2-57B-A14B-Instruct则能处理64k的上下文长度;而该系列中的两个较小模型则支持32k的上下文长度。除了长上下文模型,QWen还开源了一个智能体解决方案,用于高效处理100万tokens级别的上下文。也看到Qwen还在训练更大的模型,继续探索模型及数据的Scaling Law。此外,QWen2团队还将把Qwen2扩展成多模态模型,融入视觉及语音的理解。在不久的将来,QWen2团队还会继续开源新模型。最后期待QWen团队发布QWen2的公开技术报告。
目录
1QWEN2简介
2QWEN模型基础信息
3模型评测
4千问2的亮点
5使用QWEN2
6模型许可
7QWEN2的下一步是什么?
8QWEN引用
9附录QWEN2系列预训练语言模型评测
10附录1-使用QWEN智能体将上下文记忆扩展到百万量级
11附录2 千问智能体技术安装和实现细节
历经数月努力, QWen2团队发布了Qwen系列模型从Qwen1.5到Qwen2的重大升级。这一次,QWen2团队为大家带来了很多惊喜:
5个尺寸的预训练和指令微调模型, 包括Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B;
在中文英语的基础上,训练数据中增加了27种语言相关的高质量数据;
多个评测基准上的领先表现;
代码和数学能力显著提升;
增大了上下文长度支持,最高达到128K tokens(Qwen2-72B-Instruct)。
目前,千问2已在Hugging Face和魔搭上同步开源。
Qwen2系列包含5个尺寸的预训练和指令微调模型,其中包括Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B和Qwen2-72B。如下表所示:
在Qwen1.5系列中,只有32B和110B的模型使用了GQA。这一次,所有尺寸的模型都使用了GQA,以便让大家体验到GQA带来的推理加速和显存占用降低的优势。针对小模型,由于embedding参数量较大,QWen2团队使用了tie embedding的方法让输入和输出层共享参数,增加非embedding参数的占比。
上下文长度方面,所有的预训练模型均在32K tokens的数据上进行训练,并且QWen2团队发现其在128K tokens时依然能在PPL评测中取得不错的表现。然而,对指令微调模型而言,除PPL评测之外还需要进行大海捞针等长序列理解实验。在该表中,QWen2团队根据大海捞针实测结果,列出了各个指令微调模型所支持的最大上下文长度。而在使用YARN这类方法时,Qwen2-7B-Instruct和Qwen2-72B-Instruct均实现了长达128K tokens上下文长度的支持。
QWen2团队投入了大量精力研究如何扩展多语言预训练和指令微调数据的规模并提升其质量,从而提升模型的多语言能力。尽管大语言模型本身具有一定的泛化性,QWen2团队还是针对性地对除中英文以外的27种语言进行了增强:
地区 | 语言 |
西欧 | 德语、法语、西班牙语、葡萄牙语、 意大利语、荷兰语 |
东欧及中欧 | 俄语、捷克语、波兰语 |
中东 | 阿拉伯语、波斯语、希伯来语、土耳其语 |
东亚 | 日语、韩语 |
东南亚 | 越南语、泰语、印尼语、马来语、老挝语、缅甸语、宿务语、高棉语、菲律宾语 |
南亚 | 印地语、孟加拉语、乌尔都语 |
此外,QWen2团队针对性地优化了多语言场景中常见的语言转换(code switch)问题,模型当前发生语言转换的概率大幅度降低。QWen2团队使用容易触发语言转换现象的提示词进行测试,观察到Qwen2系列模型在此方面能力的显著提升。
相比Qwen1.5,Qwen2在大规模模型实现了非常大幅度的效果提升。QWen2对Qwen2-72B进行了全方位的评测。在针对预训练语言模型的评估中,对比当前最优的开源模型,Qwen2-72B在包括自然语言理解、知识、代码、数学及多语言等多项能力上均显著超越当前领先的模型,如Llama-3-70B以及Qwen1.5最大的模型Qwen1.5-110B。这得益于其预训练数据及训练方法的优化。
持续投入提升Qwen的代码及数学能力。在代码方面,QWen2团队成功将CodeQwen1.5的经验融入Qwen2的研发中,实现了在多种编程语言上的显著效果提升。而在数学方面,大规模且高质量的数据帮助Qwen2-72B-Instruct实现了数学解题能力的飞升。
下图展示了QWen2团队在Needle in a Haystack测试集上的结果。值得注意的是,Qwen2-72B-Instruct能够完美处理128k上下文长度内的信息抽取任务。结合其本身强大的性能,只要有充足的算力,它一定能成为你处理长文本任务的首选!
此外,Qwen2系列中的其他模型的表现也十分突出:Qwen2-7B-Instruct几乎完美地处理长达128k的上下文;Qwen2-57B-A14B-Instruct则能处理64k的上下文长度;而该系列中的两个较小模型则支持32k的上下文长度。
除了长上下文模型,QWen2团队还开源了一个智能体解决方案,用于高效处理100万tokens级别的上下文。更多详细信息,请参见QWen2团队关于该主题的博客文章,见附录1。
下表展示了大型模型在四种多语言不安全查询类别(非法活动、欺诈、色情、隐私暴力)中生成有害响应的比例。测试数据来源于Jailbreak,并被翻译成多种语言进行评估。QWen2团队发现Llama-3在处理多语言提示方面表现不佳,因此没有将其纳入比较。通过显著性检验(P值),发现Qwen2-72B-Instruct模型在安全性方面与GPT-4的表现相当,并且显著优于Mistral-8x22B模型。
现在,模型均已开源在Hugging Face和ModelScope上。欢迎查阅模型卡了解具体用法和更多关于模型的信息,如特性、指标等。
长时间以来,来自开源生态的朋友们一致支持着Qwen的发展,包括微调(Axolotl、Llama-Factory、Firefly、Swift、XTuner)、量化(AutoGPTQ、AutoAWQ、Neural Compressor)、部署(vLLM、SGL、SkyPilot、TensorRT-LLM、OpenVino、TGI)、本地运行(MLX、Llama.cpp、Ollama、LM Studio)、Agent及RAG(检索增强生成)框架(LlamaIndex, CrewAI, OpenDevin)、评测(LMSys, OpenCompass, Open LLM Leaderboard)、模型二次开发(Dolphin, Openbuddy)。想了解更多关于如何在三方框架中使用Qwen,欢迎阅读各项目的官方文档以及QWen2团队的官方文档了解更多用法!
当然,这里还有很多一直帮助QWen2团队的朋友们未被提及。QWen2团队真诚地感谢大家的支持,QWen2团队也希望社区的合作能够携手推动开源AI的发展。
此次采用不同的模型许可。除了Qwen2-72B依旧使用此前的Qianwen License外,其余模型,包括Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B以及Qwen2-57B-A14B在内,均采用Apache 2.0的许可。希望本次开放程度的提升能够加速Qwen2在全球各地的落地及商业应用。
Qwen还在训练更大的模型,继续探索模型及数据的Scaling Law。此外,QWen2团队还将把Qwen2扩展成多模态模型,融入视觉及语音的理解。在不久的将来,QWen2团队还会继续开源新模型。
不久后QWen2团队将推出Qwen2的技术报告。
@article{qwen2,
title={Qwen2 Technical Report},
year={2024}
}
对预训练模型的评估主要集中在自然语言理解、通用问题回答、代码、数学、科学知识、推理、多语言能力等能力上。
评测数据集包括:
英语任务: MMLU (5-shot)、MMLU-Pro (5-shot)、GPQA (5shot)、Theorem QA (5-shot)、BBH (3-shot)、HellaSwag (10-shot)、Winogrande (5-shot)、TruthfulQA (0-shot)以及ARC-C (25-shot)
代码任务: EvalPlus (0-shot) (HumanEval、MBPP, HumanEval+、MBPP+)、MultiPL-E (0-shot) (Python、C++、JAVA、PHP、TypeScript、C#、Bash和JavaScript)
数学任务: GSM8K (4-shot)、MATH (4-shot)
中文任务: C-Eval(5-shot)、CMMLU (5-shot)
多语言任务: Multi-Exam (M3Exam 5-shot、IndoMMLU 3-shot、ruMMLU 5-shot、mMMLU 5-shot)、Multi-Understanding (BELEBELE 5-shot、XCOPA 5-shot、XWinograd 5-shot、XStoryCloze 0-shot、PAWS-X 5-shot)、Multi-Mathematics (MGSM 8-shot)、Multi-Translation (Flores-101 5-shot)
Qwen2-72B
Qwen Team
10.1千问智能体 QWen Agent
长话短说: QWen2团队开发了一个智能体用于理解包含百万字词的文
档,虽然仅使用Qwen2模型的8k上下文,但效果超过RAG和长序列原生模型。QWen2团队还利用此智能体合成长上下文数据,用于训练长上下文的Qwen模型。
近期,能够原生处理数百万字输入的大型语言模型(LLMs)成为了一种趋势。大部分工作集中在模型架构调整,如位置编码扩展或线性注意力机制等。然而,准备足够长度的微调数据作为讨论较少但同样重要的议题,却鲜少被提及。
QWen2团队采取以下方法准备数据:
利用一个较弱的8k上下文聊天模型构建一个相对强大的智能体,能够处理1M的上下文。
随后,使用该智能体合成微调数据,并应用自动化过滤确保数据质量。
最终,使用合成数据对预训练模型进行微调,得到一个强大的1M上下文聊天模型。
本博客主要聚焦于第一步,后续步骤的详情将在未来几周或几个月内揭晓。
QWen2团队构建的智能体包含三个复杂度级别,每一层都建立在前一层的基础上。
处理100万字上下文的一种朴素方法是简单采用增强检索生成(RAG)。RAG将上下文分割成较短的块,每块不超过512个字,然后仅保留最相关的块在8k字的上下文中。 挑战在于如何精准定位最相关的块。经过多次尝试,QWen2团队提出了一种基于关键词的解决方案:
步骤1:指导聊天模型将用户查询中的指令信息与非指令信息分开。例如,将用户查询"
回答时请用2000字详尽阐述,我的问题是,自行车是什么时候发明的?请用英文回复。"
转化为{"
信息": ["自行车是什么时候发明的"], "指令": ["回答时用2000字", "尽量详尽", "用英文回复"]}
。
步骤2:要求聊天模型从查询的信息部分推导出多语言关键词。例如,短语"自行车是什么时候发明的"
会转换为{"关键词_英文": ["bicycles", "invented", "when"], "关键词_中文": ["自行车", "发明", "时间"]}
。
步骤3:运用BM25这一传统的基于关键词的检索方法,找出与提取关键词最相关的块。
RAG CODE
上述RAG方法很快速,但常在相关块与用户查询关键词重叠程度不足时失效,导致这些相关的块未被检索到、没有提供给模型。尽管理论上向量检索可以缓解这一问题,但实际上效果有限。 为了解决这个局限,QWen2团队采用了一种暴力策略来减少错过相关上下文的几率:
步骤1:对于每个512字块,让聊天模型评估其与用户查询的相关性,如果认为不相关则输出"
无"
, 如果相关则输出相关句子。这些块会被并行处理以避免长时间等待。
步骤2:然后,取那些非"
无"
的输出(即相关句子),用它们作为搜索查询词,通过BM25检索出最相关的块(总的检索结果长度控制在8k上下文限制内)。
步骤3:最后,基于检索到的上下文生成最终答案,这一步骤的实现方式与通常的RAG相同。
在基于文档的问题回答中,一个典型的挑战是多跳推理。例如,考虑回答问题:“与第五交响曲创作于同一世纪的交通工具是什么?”模型首先需要确定子问题的答案,“第五交响曲是在哪个世纪创作的?”即19世纪。然后,它才可以意识到包含“自行车于19世纪发明”的信息块实际上与原始问题相关的。
工具调用(也称为函数调用)智能体或ReAct智能体是经典的解决方案,它们内置了问题分解和逐步推理的能力。因此,QWen2团队将前述级别二的智能体(Lv2-智能体)封装为一个工具,由工具调用智能体(Lv3-智能体)调用。工具调用智能体进行多跳推理的流程如下:
向Lv3-智能体提出一个问题。
while (Lv3-智能体无法根据其记忆回答问题) {
Lv3-智能体提出一个新的子问题待解答。
Lv3-
智能体向Lv2-智能体提问这个子问题。
将Lv2-智能体的回应添加到Lv3-智能体的记忆中。
}
Lv3-
智能体提供原始问题的最终答案。
QWen2团队在两个针对256k上下文设计的基准测试上进行了实验:
NeedleBench,一个测试模型是否能在充满大量无关句子的语境中找到最相关句子的基准,类似于“大海捞针”。回答一个问题可能需要同时找到多根“针”,并进行多跳逐步推理。
LV-Eval是一个要求同时理解众多证据片段的基准测试。QWen2团队对LV-Eval原始版本中的评估指标进行了调整,因为其匹配规则过于严苛,导致了许多假阴性结果。
QWen2团队比较了以下方法:
32k-模型:这是一个7B对话模型,主要在8k上下文样本上进行微调,并辅以少量32k上下文样本。为了扩展到256k上下文,QWen2团队采用了无需额外训练的方法,如基于RoPE的外推。
4k-RAG:使用与32k-模型相同的模型,但采取了Lv1-智能体的RAG策略。它仅检索并处理最相关的4k上下文。
4k-智能体:同样使用32k-模型的模型,但采用前文描述的更复杂的智能体策略。该智能体策略会并行处理多个片段,但每次请求模型时至多只使用模型的4k上下文。
实验结果说明了以下几点:
在短上下文场景中,4k-RAG的表现可能不如32k-模型。这可能是由于RAG方案难以检索到正确的信息或理解多个片段造成的。
相反,随着文档长度的增加,4k-RAG越发表现出超越32k-模型的趋势。这一趋势表明32k-模型在处理长上下文方面并没有训练到最优的状态。
值得注意的是,4k-智能体始终表现优于32k-模型和4k-RAG。它分块阅读所有上下文的方式使它能够避免原生模型在长上下文上训练不足而带来的限制。
总的来说,如果得到恰当的训练,32k-模型理应优于所有其他方案。然而,实际上由于训练不足,32k-模型的表现不及4k-智能体。
最后,QWen2团队还对该智能体进行了100万个字词的压力测试(在100万个字词的大海中寻找一根针),并发现它能够正常运行。然而,QWen2团队仍然缺乏一个更贴近真实使用场景的可靠基准来系统量化它在100万字词任务上的表现。
QWen2团队在本文中介绍了利用智能体扩展模型上下文记忆的关键思路。一旦智能体准备就绪,如何合成数据便显而易见。例如,QWen2团队可以招募志愿者与智能体互动,并记录结果来构建微调数据集。此外,QWen2团队还可以利用智能体对其他方法生成的数据进行交叉验证,以确保数据质量。此外,用智能体的结果去微调模型,这个思路也适用于其他领域,比如提升模型解决大规模任务的能力。
QWen2团队的开源RAG(检索增强生成)和智能体框架Qwen-Agent,脱胎自QWen2团队便利日常开发的内部工具,近期正在迅速发展。QWen2团队已在该框架中开源了上述长上下文智能体的实现。
QWen2团队期望在不久的将来,提供处理长上下文能力更强的模型,以及更加用户友好的基础设施框架。
@misc{qwen-agent-2405,
title = {Generalizing an LLM from 8k to 1M Context using Qwen-Agent},
url = {https://qwenlm.github.io/blog/qwen-agent-2405/},
author = {Qwen Team},
month = {May},
year = {2024}
}
Qwen-Agent是基于 Qwen 的指令、工具使用、规划和内存能力开发 LLM 应用程序的框架。它还附带了示例应用程序,例如浏览器助手、代码解释器和自定义助手。
Install the stable version from PyPI:
pip install -U qwen-agent或者,您可以从源安装最新的开发版本:
git clone https://github.com/QwenLM/Qwen-Agent.git
cd Qwen-Agent
pip install -e ./
(可选)如果需要内置 GUI 支持,请安装以下可选依赖项:
pip install -U "gradio>=4.0" "modelscope-studio>=0.2.1"
可以使用阿里云的 DashScope 提供的模型服务,也可以使用开源的 Qwen 模型部署和使用您自己的模型服务。
如果您选择使用 DashScope 提供的模型服务,请确保将环境变量 DASHSCOPE_API_KEY
设置为唯一的DashScope API 密钥。
或者,如果您希望部署和使用自己的模型服务,请按照 Qwen2 的 README 中提供的说明部署兼容 OpenAI 的API 服务。具体而言,请参阅 vLLM 部分了解高吞吐量 GPU 部署,或参阅 Ollama 部分了解本地 CPU (+GPU) 部署。
Qwen-Agent提供原子组件,如 LLM(继承自 BaseChatModel 类
并带有函数调用)和 Tools(继承自 BaseTool 类
),以及高级组件,如 Agent(派生自 Agent 类
)。
以下示例说明了创建能够读取 PDF 文件和使用工具以及合并自定义工具的代理的过程:
import pprint
import urllib.parse
import json5
from qwen_agent.agents import Assistant
from qwen_agent.tools.base import BaseTool, register_tool
# Step 1 (Optional): Add a custom tool named `my_image_gen`.
@register_tool('my_image_gen')
class MyImageGen(BaseTool):
# The `description` tells the agent the functionality of this tool.
description = 'AI painting (image generation) service, input text description, and return the image URL drawn based on text information.'
# The `parameters` tell the agent what input parameters the tool has.
parameters = [{
'name': 'prompt',
'type': 'string',
'description': 'Detailed description of the desired image content, in English',
'required': True
}]
def call(self, params: str, **kwargs) -> str:
# `params` are the arguments generated by the LLM agent.
prompt = json5.loads(params)['prompt']
prompt = urllib.parse.quote(prompt)
return json5.dumps(
{'image_url': f'https://image.pollinations.ai/prompt/{prompt}'},
ensure_ascii=False)
# Step 2: Configure the LLM you are using.
llm_cfg = {
# Use the model service provided by DashScope:
'model': 'qwen-max',
'model_server': 'dashscope',
# 'api_key': 'YOUR_DASHSCOPE_API_KEY',
# It will use the `DASHSCOPE_API_KEY' environment variable if 'api_key' is not set here.
# Use a model service compatible with the OpenAI API, such as vLLM or Ollama:
# 'model': 'Qwen2-7B-Chat',
# 'model_server': 'http://localhost:8000/v1', # base_url, also known as api_base
# 'api_key': 'EMPTY',
# (Optional) LLM hyperparameters for generation:
'generate_cfg': {
'top_p': 0.8
}
}
# Step 3: Create an agent. Here we use the `Assistant` agent as an example, which is capable of using tools and reading files.
system_instruction = '''You are a helpful assistant.
After receiving the user's request, you should:
- first draw an image and obtain the image url,
- then run code `request.get(image_url)` to download the image,
- and finally select an image operation from the given document to process the image.
Please show the image using `plt.show()`.'''
tools = ['my_image_gen', 'code_interpreter'] # `code_interpreter` is a built-in tool for executing code.
files = ['./examples/resource/doc.pdf'] # Give the bot a PDF file to read.
bot = Assistant(llm=llm_cfg,
system_message=system_instruction,
function_list=tools,
files=files)
# Step 4: Run the agent as a chatbot.
messages = [] # This stores the chat history.
while True:
# For example, enter the query "draw a dog and rotate it 90 degrees".
query = input('user query: ')
# Append the user query to the chat history.
messages.append({'role': 'user', 'content': query})
response = []
for response in bot.run(messages=messages):
# Streaming output.
print('bot response:')
pprint.pprint(response, indent=2)
# Append the bot responses to the chat history.
messages.extend(response)
除了使用内置的代理实现(如类助手
)之外,还可以通过继承类 Agent 来开发自己的代理实现。更多用法示例请参考 examples 目录。
函数调用(又名工具调用)吗?
是的。LLM 类提供函数调用。此外,一些代理类也基于函数调用功能构建,例如 FnCallAgent 和 ReActChat。
如何对涉及 1M 代币的超长文档进行问答?
QWen2团队发布了一个快速的 RAG 解决方案,以及一个昂贵但具有竞争力的代理,用于对超长文档进行问答。它们在两个具有挑战性的基准测试中成功地超越了原生长上下文模型,同时效率更高,并且在涉及 1M 代币上下文的单针“大海捞针”压力测试中表现完美。有关技术详细信息,请参阅博客 。
from qwen_agent.agents import Assistant
from qwen_agent.gui import WebUI
def test():
bot = Assistant(llm={'model': 'qwen-plus'})
messages = [{'role': 'user', 'content': [{'text': '介绍图一'}, {'file': 'https://arxiv.org/pdf/1706.03762.pdf'}]}]
for rsp in bot.run(messages):
print(rsp)
def app_gui():
# Define the agent
bot = Assistant(llm={'model': 'qwen-plus'},
name='Assistant',
description='使用RAG检索并回答,支持文件类型:PDF/Word/PPT/TXT/HTML。')
chatbot_config = {
'prompt.suggestions': [
{
'text': '介绍图一'
},
{
'text': '第二章第一句话是什么?'
},
]
}
WebUI(bot, chatbot_config=chatbot_config).run()
if __name__ == '__main__':
# test()
app_gui()
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-28
2024-04-26
2024-08-21
2024-04-11
2024-07-09
2024-08-13
2024-07-18
2024-10-25
2024-07-01
2024-06-17