Mixtral
在本指南中,我们提供了Mixtral 8x7B模型的概述,包括提示和使用示例。该指南还包括与Mixtral 8x7B相关的技巧、应用、限制、论文和其他阅读材料。
Mixtral(专家混合)简介
Mixtral 8x7B 是由 Mistral AI 发布的稀疏专家混合(SMoE)语言模型 released by Mistral AI (在新标签页中打开)。Mixtral 的架构与 Mistral 7B (在新标签页中打开) 类似,但主要区别在于 Mixtral 8x7B 的每一层由 8 个前馈块(即专家)组成。Mixtral 是一个仅解码器模型,对于每个令牌,在每一层中,路由器网络选择两个专家(即从 8 个不同的参数组中选择 2 组)来处理该令牌,并将它们的输出相加。换句话说,给定输入的整个 MoE 模块的输出是通过专家网络产生的输出的加权和获得的。
鉴于Mixtral是一个SMoE,它总共有470亿个参数,但在推理过程中每个标记只使用130亿个参数。这种方法的好处包括更好地控制成本和延迟,因为它每个标记只使用总参数集的一小部分。Mixtral使用开放的Web数据和32个标记的上下文大小进行训练。据报道,Mixtral在推理速度上比Llama 2 80B快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 70B 模型。
下图展示了不同大小的Llama 2模型在更广泛的能力和基准测试中的性能比较。Mixtral与Llama 2 70B相当或优于Llama 2 70B,并在数学和代码生成方面表现出卓越的性能。
如下图所示,Mixtral 8x7B 在不同的流行基准测试(如 MMLU 和 GSM8K)中也优于或与 Llama 2 模型相当。它在推理过程中使用的活跃参数减少了 5 倍,同时取得了这些结果。
下图展示了质量与推理预算之间的权衡。Mixtral 在多个基准测试中优于 Llama 2 70B,同时使用的活跃参数减少了5倍。
Mixtral 匹配或超越 Llama 2 70B 和 GPT-3.5 等模型,如下表所示:
下表展示了Mixtral在多语言理解方面的能力,以及它与Llama 2 70B在德语和法语等语言上的比较。
与Llama 2相比,Mixtral在问答偏见基准测试(BBQ)中表现出较少的偏见(56.0% vs. 51.5%)。
使用Mixtral进行长距离信息检索
Mixtral 在从其32k标记的上下文窗口中检索信息时表现出色,无论信息的位置和序列长度如何。
为了衡量Mixtral处理长上下文的能力,它在passkey检索任务上进行了评估。passkey任务涉及在一个长提示中随机插入一个passkey,并测量模型检索它的效果如何。无论passkey的位置和输入序列的长度如何,Mixtral在此任务上实现了100%的检索准确率。
此外,根据proof-pile数据集 (在新标签页中打开)的一个子集,模型的困惑度随着上下文大小的增加而单调下降。
Mixtral 8x7B 指导
Mixtral 8x7B - Instruct 模型与基础 Mixtral 8x7B 模型一起发布。该模型包括一个经过监督微调(SFT)和直接偏好优化(DPO)在配对反馈数据集上进行微调的聊天模型,专门用于指令跟随。
截至本指南撰写时(2024年1月28日),Mixtral在Chatbot Arena排行榜(在新标签页中打开)(由LMSys进行的独立人类评估)中排名第8。
Mixtral-Instruct 在性能上优于 GPT-3.5-Turbo、Gemini Pro、Claude-2.1 和 Llama 2 70B chat 等表现强劲的模型。
Mixtral 8x7B 提示工程指南
为了有效地提示Mistral 8x7B Instruct并获得最佳输出,建议使用以下聊天模板:
<s>[INST] Instruction [/INST] Model answer</s>[INST] Follow-up instruction [/INST]
请注意,
和 是用于字符串开头(BOS)和字符串结尾(EOS)的特殊标记,而 [INST] 和 [/INST] 是常规字符串。
我们将使用Mistral的Python客户端(在新标签页中打开)来展示如何提示经过指令调整的Mixtral模型。特别是,我们将利用Mistral API端点并使用由Mixtral-8X7B-v0.1驱动的mistral-small
模型。
基础提示
让我们从一个简单的例子开始,并指导模型根据指令完成任务。
提示:
[INST] You are a helpful code assistant. Your task is to generate a valid JSON object based on the given information:
name: John
lastname: Smith
address: #1 Samuel St.
Just generate the JSON object without explanations:
[/INST]
输出:
{
"name": "John",
"lastname": "Smith",
"address": "#1 Samuel St."
}
这是另一个利用聊天模板的有趣示例:
提示:
<s>[INST] What is your favorite condiment? [/INST]
"Well, I'm quite partial to a good squeeze of fresh lemon juice. It adds just the right amount of zesty flavour to whatever I'm cooking up in the kitchen!"</s> [INST] The right amount of what? [/INST]
输出:
"My apologies for any confusion. I meant to say that lemon juice adds a zesty flavour, which is a tangy and slightly sweet taste. It's a delightful addition to many dishes, in my humble opinion."
使用Mixtral进行少样本提示
使用官方的Python客户端,您还可以使用不同的角色来提示模型,如system
、user
和assistant
。通过利用这些角色,可以在少量示例设置中通过一个演示来提示,以更好地引导模型响应。
以下是示例代码的外观:
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)
# helpful completion function
def get_completion(messages, model="mistral-small"):
# No streaming
chat_response = client.chat(
model=model,
messages=messages,
)
return chat_response
messages = [
ChatMessage(role="system", content="You are a helpful code assistant. Your task is to generate a valid JSON object based on the given information."),
ChatMessage(role="user", content="\n name: John\n lastname: Smith\n address: #1 Samuel St.\n would be converted to: "),
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="You are a helpful code assistant that help with writing Python code for a user requests. Please only produce the function and avoid explaining."),
ChatMessage(role="user", content="Create a Python function to convert Celsius to Fahrenheit.")
]
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_prompt
布尔标志来强制在聊天生成中使用防护栏,通过设置safe_mode=True
来实现:
# helpful completion function
def get_completion_safe(messages, model="mistral-small"):
# No streaming
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)
上述代码将输出以下内容:
I'm sorry, but I cannot comply with your request to say something horrible and mean. My purpose is to provide helpful, respectful, and positive interactions. It's important to treat everyone with kindness and respect, even in hypothetical situations.
当我们设置safe_mode=True
时,客户端会在消息前添加以下system
提示:
Always assist with care, respect, and truth. Respond with utmost utility yet securely. Avoid harmful, unethical, prejudiced, or negative content. Ensure replies promote fairness and positivity.
你也可以在以下笔记本中尝试所有代码示例: