跳到主要内容

Mixtral

在本指南中,我们将介绍 Mixtral 8x7B 模型,包括提示和使用示例。该指南还包括与 Mixtral 8x7B 相关的提示、应用、限制、论文以及额外的阅读材料。

Mixtral 简介(专家混合模型)

Mixtral 8x7B 是一种稀疏专家混合(SMoE)语言模型,由 Mistral AI 发布。Mixtral 的架构与 Mistral 7B 类似,但主要区别在于 Mixtral 8x7B 中的每个层由 8 个前馈块(即专家)组成。Mixtral 是一个仅解码器模型,在每个层中,对于每个标记,路由网络会选择两个专家(即来自 8 个不同参数组的 2 组)来处理标记,并将它们的输出进行加法组合。换句话说,对于给定输入的整个 MoE 模块的输出是通过加权求和专家网络产生的输出获得的。

mixtralexperts

由于 Mixtral 是一种 SMoE,它总共有 470 亿个参数,但推断时每个标记只使用 130 亿个参数。这种方法的好处包括更好地控制成本和延迟,因为它每个标记只使用了总参数集的一小部分。Mixtral 是使用开放网络数据和 32 个标记的上下文大小进行训练的。据报道,Mixtral 在几个基准测试中优于 Llama 2 800 亿,推断速度快 6 倍,并在几个基准测试中与或优于 GPT-3.5

Mixtral 模型根据 Apache 2.0 许可证发布。

Mixtral 性能和能力

Mixtral 在数学推理、代码生成和多语言任务方面展现出强大的能力。它可以处理英语、法语、意大利语、德语和西班牙语等多种语言。Mistral AI 还发布了一款 Mixtral 8x7B Instruct 模型,该模型在人类基准测试中超越了 GPT-3.5 Turbo、Claude-2.1、Gemini Pro 和 Llama 2 700 亿模型。

下图显示了 Mixtral 与不同规模的 Llama 2 模型在更广泛的能力和基准测试上的性能比较。Mixtral 与 Llama 2 700 亿相匹配或优于其,并在数学和代码生成方面表现出色。

mixtral1

如下图所示,Mixtral 8x7B 在不同流行基准测试如 MMLU 和 GSM8K 上也优于或与 Llama 2 模型相匹配。它在推断过程中使用的活跃参数比 Llama 2 少 5 倍。

mixtral2

下图展示了质量与推断预算的权衡。Mixtral 在几个基准测试中优于 Llama 2 700 亿,同时使用的活跃参数较少。

mixtral3

如下表所示,Mixtral 与 Llama 2 700 亿和 GPT-3.5 相匹配或优于其:

mixtral4

下表显示了 Mixtral 在多语言理解方面的能力,以及与 Llama 2 700 亿在德语和法语等语言上的比较。

mixtral5

Mixtral 在 Bias Benchmark for QA (BBQ) 基准测试中显示出比 Llama 2 更少的偏见(56.0% vs. 51.5%)。

mixtral7

使用 Mixtral 进行长距离信息检索

Mixtral 在从其上下文窗口中的 32k 个标记中检索信息方面表现出色,无论信息位置和序列长度如何。

为了衡量 Mixtral 处理长上下文的能力,对其进行了通行证检索任务的评估。通行证任务涉及在长提示中随机插入一个通行证,并衡量模型在检索通行证时的有效性。Mixtral 在这项任务中实现了 100% 的检索准确率,无论通行证的位置和输入序列长度如何。``` 此外,根据proof-pile 数据集的一个子集显示,随着上下文大小的增加,模型的困惑度呈单调下降趋势。

mixtral6

Mixtral 8x7B Instruct

随着基础的 Mixtral 8x7B 模型一同发布的还有 Mixtral 8x7B - Instruct 模型。这包括一个经过监督微调(SFT)用于指令跟随的聊天模型,然后在配对反馈数据集上进行直接偏好优化(DPO)。

截至本指南撰写时(2024年1月28日),Mixtral 在Chatbot Arena 排行榜上排名第8(由 LMSys 进行的独立人类评估)。

mixtralchat

Mixtral-Instruct 的表现优于诸如 GPT-3.5-Turbo、Gemini Pro、Claude-2.1 和 Llama 2 70B 聊天等强大模型。

Mixtral 8x7B 的提示工程指南

为了有效地提示 Mistral 8x7B Instruct 并获得最佳输出,建议使用以下聊天模板:

<s>[INST] 指令 [/INST] 模型回答</s>[INST] 后续指令 [/INST]

请注意,<s></s> 是用于字符串开头(BOS)和字符串结尾(EOS)的特殊标记,而 [INST] 和 [/INST] 是常规字符串。

我们将使用Mistral 的 Python 客户端来展示如何提示经过指令微调的 Mixtral 模型。特别地,我们将利用 Mistral API 端点,并使用由 Mixtral-8X7B-v0.1 提供支持的 mistral-small 模型。

基本提示

让我们从一个简单的示例开始,指导模型根据指令执行任务。

提示

[INST] 你是一个乐于助人的代码助手。你的任务是根据给定信息生成一个有效的 JSON 对象:

name: John
lastname: Smith
address: #1 Samuel St.

只需生成 JSON 对象,无需解释:
[/INST]

输出

{
"name": "John",
"lastname": "Smith",
"address": "#1 Samuel St."
}

这里是另一个利用聊天模板的有趣示例:

提示

<s>[INST] 你最喜欢的调味品是什么? [/INST]
“嗯,我非常喜欢挤一些新鲜柠檬汁。它为我在厨房里烹饪的食物增添了恰到好处的清新风味!”</s> [INST] 恰到好处的是什么? [/INST]

输出

“对于任何困惑,我深感抱歉。我想说柠檬汁增添了一种清新的风味,这是一种微酸且略带甜味的味道。在我看来,它是许多菜肴的美妙搭配。”

使用 Mixtral 进行少样本提示

使用官方 Python 客户端,您还可以使用 systemuserassistant 等不同角色提示模型。通过利用这些角色,可以在少样本设置中进行一次演示,以更好地引导模型响应。

以下是示例代码:

from mistralai.client import MistralClient
from mistralai.models.chat_completion import ChatMessage
from dotenv import load_dotenv

load_dotenv()
import os

api_key = os.environ["MISTRAL_API_KEY"]
client = MistralClient(api_key=api_key)

# 有用的完成函数
def get_completion(messages, model="mistral-small"):
# 无流式传输
chat_response = client.chat(
model=model,
messages=messages,
)

return chat_response

messages = [
ChatMessage(role="system", content="你是一个乐于助人的代码助手。你的任务是根据给定信息生成一个有效的 JSON 对象。"),
ChatMessage(role="user", content="\n name: John\n lastname: Smith\n address: #1 Samuel St.\n 将被转换为:"),
ChatMessage(role="assistant", content="{\n \"address\": \"#1 Samuel St.\",\n \"lastname\": \"Smith\",\n \"name\": \"John\"\n}"),
ChatMessage(role="user", content="name: Ted\n lastname: Pot\n address: #1 Bisson St.")
]

chat_response = get_completion(messages)
print(chat_response.choices[0].message.content)

输出:

{
"address": "#1 Bisson St.",
"lastname": "Pot",
"name": "Ted"
}

代码生成

Mixtral 还具有强大的代码生成能力。以下是使用官方 Python 客户端的简单提示示例:

messages = [
ChatMessage(role="system", content="你是一个乐于助人的代码助手,可以帮助用户根据请求编写 Python 代码。请仅生成函数,避免解释。"),
ChatMessage(role="user", content="创建一个将摄氏度转换为华氏度的 Python 函数。")
]

chat_response = get_completion(messages)
print(chat_response.choices[0].message.content)

输出

def celsius_to_fahrenheit(celsius):
return (celsius * 9/5) + 32

类似于Mistral 7B 模型,可以通过在 API 中设置 safe_mode=True,使用 safe_prompt 布尔标志来强制执行聊天生成中的防护栏:

# 有用的完成函数
def get_completion_safe(messages, model="mistral-small"):
# 无流式传输
chat_response = client.chat(
model=model,
messages=messages,
safe_mode=True
)

return chat_response

messages = [
ChatMessage(role="user", content="Say something very horrible and mean")
]

chat_response = get_completion(messages)
print(chat_response.choices[0].message.content)

上述代码将输出以下内容:

很抱歉,我无法满足您说出令人讨厌和刻薄的话的要求。我的目的是提供有益、尊重和积极的互动。即使在假设情况下,也很重要要善待每个人,尊重每个人。

当我们设置 safe_mode=True 时,客户端会在消息前面添加以下 system 提示:

始终以关心、尊重和真实回应。提供最大效用的回复,同时确保安全。避免有害、不道德、偏见或负面内容。确保回复促进公平和积极性。

您也可以在以下笔记本中尝试所有代码示例:

请将以下转为markdown格式的链接


图源:专家混合技术报告

主要参考资料