聊天格式评估

社区文章 发布于2024年9月25日

将聊天模板应用于生成式大型语言模型评估

最初发表于 Towards Data Science (2024年2月)

2024年9月更新:聊天模板已成功应用于Open LLM排行榜!向 @clefourrier @hails 及其团队致敬。

构建可靠的评估应是任何基于LLM的系统或产品(以及传统机器学习系统)的起点 — 链接

TL;DR

聊天模型通常是在使用提示模板格式化的数据集上进行微调的。这些聊天模板是预先编程的配方,用于将聊天对话转换为单个字符串。在预测时,通常会匹配大型语言模型预期的聊天格式——如果不这样做,常常会导致性能下降 [1]。然而,我们是否真的在评估基准上看到了这些性能下降?

注意:本博客文章旨在为对Python编程和神经网络语言建模有基本了解的读者提供信息。

引言

如果您曾基于OpenAI的聊天API构建应用,那么以下代码对您来说应该很熟悉。在底层,此输入通过ChatML格式转换为一个可标记化的字符串

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Who won the world series in 2020?"},
    {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
    {"role": "user", "content": "Where was it played?"}
  ]
)
<|im_start|>system
You are a helpful assistant.
<|im_start|>user
Who won the world series in 2020?<|im_end|>
<|im_start|>assistant
The Los Angeles Dodgers won the World Series in 2020.<|im_end|>
<|im_start|>user
Where was it played?<|im_end|>
<|im_start|>assistant

事实证明,大型语言模型研究社区存在各种各样的聊天模板。以 Mixtral-8x7B-Instruct-v0.1 这样的开源模型为例。它的格式与上面 gpt-3.5-turbo 的格式截然不同

from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1")
chat = [
  {"role": "user", "content": "Hello, how are you?"},
  {"role": "assistant", "content": "I'm doing great. How can I help you today?"},
  {"role": "user", "content": "Write me a haiku about coding."},
]
tokenizer.apply_chat_template(chat, tokenize=False)
<s>[INST] Hello, how are you? [/INST]I'm doing great. How can I help you today?</s> [INST] Write me a haiku about coding. [/INST]

为什么要费心使用聊天模板?嗯,强烈建议在预测时匹配预期的聊天模板(例如,请参阅 Mixtral-8x7B-Instruct-v0.1 的仓库中关于“指令格式”的信息)。而且,对于 gpt-3.5-turbo 等专有聊天模型,无论您喜欢与否,聊天模板通常都在端点幕后应用!

但我们如何知道聊天格式是否确实改善了我们的性能呢?请看大型语言模型评估。

大型语言模型评估

评估用于衡量AI/ML模型的性能,它们可以有多种形式和大小。评估包含两个核心组成部分:为特定任务精心策划的数据集以及衡量建模性能的相关指标。

生成式大型语言模型评估具有一些额外的细微差别。例如,不同的框架以不同的方式衡量文本生成性能——即使对于相同的评估也可能有所不同(参考)。因此,在比较不同研究的得分时,确认结果是用相同的代码和配置计算的非常重要,以避免任何错误的分析。

本文测试使用了出色的指令遵循评估(IFEval)[2]。该评估包含541个提示,用于衡量语言模型遵循可验证的自然语言指令的能力。这些可验证指令的示例如下:

“写450到500字”,“您的全部输出应采用JSON格式”,“包含一个标题,并将其放入两个方括号中,例如 [[ 标题 ]]”

对于给定的响应和可验证的指令,我们使用以下四个指标来检查指令是否已被遵循

  1. 提示级严格准确率:每个提示中所有可验证指令均被遵循的提示百分比。

  2. 指令级严格准确率:已遵循的可验证指令的百分比。

  3. 提示级宽松准确率:使用宽松标准计算的提示级准确率。

  4. 指令级宽松准确率:使用宽松标准计算的指令级准确率。

此处计算了这四个指标的平均值(表1),主要目的是使用一个单一指标来捕获可用的最多样化信号。

IFEval 是探索聊天模板影响的理想测试,因为该测试专门设计用于衡量聊天数据上的指令遵循能力。另一个有趣的问题是,聊天模板是否对不那么适合聊天数据的评估产生积极影响——这是一个留待未来研究的主题。

IFEval 的聊天模板

Eleuther.AI 的 lm-eval 是大型语言模型评估的事实开源软件包。由于更多模型的聊天模板是该库中经常请求的添加功能,因此很容易与其他希望在 🤗 模型类中专门研究此功能的开发人员保持同步。目前,开发工作正在 add-chat-templating 分支 (链接) 上进行,由问题 #1098 和 #1209 推动。使用此分支时,我们可以如下将聊天格式应用于评估:

lm_eval --model hf \
    --model_args=pretrained=meta-llama/Llama-2-70b-chat-hf,dtype="bfloat16",parallelize=True,device_map="auto",use_chat_template=True,system_prompt="You are a helpful assistant." \
    --tasks ifeval \
    --batch_size 16 \
    --output_path output/Llama-2-70b-chat-hf \
    --log_samples \
    --num_fewshot 0

新引入的触发器 `use_chat_template` 和 `system_prompt` 出现在 `model_args` 的右侧,并控制聊天模板的应用方式。在该分支的当前实验形式中,代码在应用聊天模板前后打印第一个提示。以下是上述代码块的效果:

提示格式化前的第一个元素...

('Write a 300+ word summary of the wikipedia page "https://en.wikipedia.org/wiki/Raymond_III,_Count_of_Tripoli". Do not use any commas and highlight at least 3 sections that has titles in markdown format, for example *highlighted section part 1*, *highlighted section part 2*, *highlighted section part 3*.', {'until': [], 'do_sample': False, 'temperature': 0.0, 'max_gen_toks': 1280})

提示格式化后的第一个元素...

('<s>[INST] <<SYS>>\nYou are a helpful assistant.\n<</SYS>>\n\nWrite a 300+ word summary of the wikipedia page "https://en.wikipedia.org/wiki/Raymond_III,_Count_of_Tripoli". Do not use any commas and highlight at least 3 sections that has titles in markdown format, for example *highlighted section part 1*, *highlighted section part 2*, *highlighted section part 3*. [/INST]', {'until': [], 'do_sample': False, 'temperature': 0.0, 'max_gen_toks': 1280})

输出已采用所需的聊天模板!

现在我们准备对聊天模板对 IFEval 的影响进行 A/B 测试。我们选择了少量流行的大型语言模型进行实验——每个模型都有其独特的聊天模板。较大的模型包括 70B 参数的 Llama-2-70b-chat,两种相同 47B 参数模型的变体 Mixtral-8x7B-Instruct-v0.1 和 Nous-Hermes-2-Mixtral-8x7B-DPO,以及 34B 参数的 Nous-Hermes-2-Yi-34B。较小的模型包括三个 7B 参数的模型:Mistral-Instruct-7B-v0.2、Zephyr-7b-beta 和 Starling-LM-7B-alpha。对于系统提示,兼容的模型使用了简单的“你是一个乐于助人的助手。”。以下包含关于这七个模型的更多详细信息 [3]。

事不宜迟,我们的结果如下

image/png

表1:IFEval A/B 测试结果,按模型大小降序排序(链接)。有关更多详细信息,例如运行日志链接,请参阅下面的“补充说明”部分。为确保可重现性,实验使用半精度 bfloat16 模型,工作站配备 2 个 H100 80 GB SXM5 芯片,以及 lm-eval 包的哈希值为 0c0c314c0df4c10f35bf7c17dc80f745f8027e9b 的分叉版本。

🔥 聊天模板对 IFEval 评分造成了严重的冲击!Nous-Hermes-2-Mixtral-8x7B-DPO 在此处测试的模型中表现最佳,平均得分约为 63%。相比之下,Zephyr-7b-beta 是表现最差的模型,但从聊天模板中获得了最大的提升——高达 +39%!作为参考,IFEval 论文报告 gpt-4(2023年11月)的平均得分约为 81%,而 PaLM 2S(2023年8月)约为 51% [2]。

总而言之,这些结果揭示了几个关键见解

  1. 聊天模板对开源大型语言模型的指令遵循能力有积极影响,其影响程度因模型而异。
  2. 开源大型语言模型在遵循自然语言指令方面的能力不如 gpt-4 等领先的专有模型。

结论

在我们的实验中,聊天模板在各种格式和模型上都显著提升了IFEval分数。然而,我并不一定期望这些影响能推广到所有大型语言模型评估。为了进一步探讨聊天模板对基准的影响,下一步包括以下方面的实验:

  • 更多类似于IFEval 的指令遵循评估
  • 通用评估,例如 🤗 的 Open LLM Leaderboard 中的评估
  • 情境内检索评估,例如“大海捞针”

还有更多!

从三万英尺的高度来看,现在是研究大型语言模型评估的绝佳时机——原因之一是,更强大的大型语言模型需要新一代的测试来有效评估它们。无论您是创建自己的评估还是基于现有的评估,研究评估都是为开放科学社区做出贡献的一种有影响力的方式。

参考文献

[1] Matthew Carrigan (2023), 聊天模板:终结无声的性能杀手, Hugging Face。

[2] Zhou 等人 (2023), 大型语言模型的指令遵循评估, arXiv。

数据集许可:本文使用的 IFEval 数据集对所有人公开可用,无任何限制(Apache-2.0 许可)。

[3] 本文使用的模型,从大到小排列(所有模型均获得研究使用许可)。

  • Llama-2–70b-chat — Meta
  • Mixtral-8x7B-Instruct-v0.1 — Mistral.AI
  • Nous-Hermes-2-Mixtral-8x7B-DPO — Nous-Research
  • Nous-Hermes-2-Yi-34B — Nous-Research
  • Starling-LM-7B-alpha — Berkeley NEST
  • Zephyr-7B-beta — Hugging Face
  • Mistral-7B-Instruct-v0.2 — Mistral.AI

补充说明

用于运行实验的代码请参见 此处 的笔记本。

要审计结果,请参阅每次运行的输出 此处

计算方面,RunPod (链接) 用于访问配备 Nvidia GPU 芯片的工作站,特别是配备 2 个 H100 80 GB SXM5 芯片的集群。总的来说,实验包括 14 次 IFEval 运行,累计约 6 小时集群运行时间。

采用置信区间来估计我们结果的统计不确定性(使用了自助法重采样)。这些 95% 置信区间大约在 +/- 2.75% 到 4.25% 之间——相对于聊天模板的测量效果而言较小。

社区

注册登录 发表评论