Skip to main content

Gemma vs Mistral: 在自己的数据上进行基准测试

在比较大型语言模型(LLM)的性能时,最好不要依赖通用基准。本指南将向您展示如何设置一个全面的基准测试,以比较 Gemma、Mistral 和 Mixtral。

最终结果是这些模型在您关心的任务上的并排比较:

gemma vs mistral vs mixtral

前提条件

在开始之前,请确保您已具备以下条件:

  • 已安装 promptfoo(参见安装
  • 一个 Replicate API 密钥,设置为 REPLICATE_API_KEY 环境变量

虽然本指南侧重于使用 Replicate,但此方法支持许多其他提供商,如 OllamaOpenRouter 等。

步骤 1:配置设置

首先,为您要进行的评估创建一个目录:

npx promptfoo@latest init gemma-vs-mistral

cd gemma-vs-mistral 并打开 promptfooconfig.yaml。该文件决定了基准测试如何使用 Gemma、Mistral 和 Mixtral,包括响应参数和提示格式。

定义提示

您的配置从用于测试的提示开始。我们现在只使用一个占位符:

prompts:
- '{{message}}'

您应根据您的使用场景自定义这些提示。例如:

prompts:
- '总结这篇文章:{{article}}'
- '为 {{concept}} 生成技术解释'

配置提供商

接下来,通过设置它们的配置来指定您要比较的模型:

Mistral 配置

- id: replicate:mistralai/mistral-7b-instruct-v0.2
config:
temperature: 0.01
max_new_tokens: 1024
prompt:
prefix: '<s>[INST] '
suffix: ' [/INST]'

Mixtral 配置

- id: replicate:mistralai/mixtral-8x7b-instruct-v0.1
config:
temperature: 0.01
max_new_tokens: 1024
prompt:
prefix: '<s>[INST] '
suffix: ' [/INST]'

Gemma 配置

- id: replicate:google-deepmind/gemma-7b-it:2790a695e5dcae15506138cc4718d1106d0d475e6dca4b1d43f42414647993d5
config:
temperature: 0.01
max_new_tokens: 1024
prompt:
prefix: "<start_of_turn>user\n"
suffix: "<end_of_turn>\n<start_of_turn>model"

完整的配置示例

将配置组合起来进行直接比较:

prompts:
- '{{message}}'

providers:
- id: replicate:mistralai/mistral-7b-instruct-v0.2
config:
temperature: 0.01
max_new_tokens: 1024
prompt:
prefix: '<s>[INST] '
suffix: ' [/INST]'

- id: replicate:mistralai/mixtral-8x7b-instruct-v0.1
config:
temperature: 0.01
max_new_tokens: 1024
prompt:
prefix: '<s>[INST] '
suffix: ' [/INST]'

- id: replicate:google-deepmind/gemma-7b-it:2790a695e5dcae15506138cc4718d1106d0d475e6dca4b1d43f42414647993d5
config:
temperature: 0.01
max_new_tokens: 1024
prompt:
prefix: "<start_of_turn>user\n"
suffix: "<end_of_turn>\n<start_of_turn>model"

步骤 2:构建测试集

设计反映您应用使用场景的各种请求的测试用例。

在这个示例中,我们专注于谜语,以测试模型理解和生成创造性和逻辑性响应的能力。

tests:
- vars:
message: '我不用嘴说话,不用耳朵听。我没有身体,但风一吹我就活了。我是什么?'
- vars:
message: '你看到一艘载满人的船。它没有沉,但当你再看时,船上一个人也没有了。为什么?'
- vars:
message: '这种东西越多,你看到的就越少。它是什么?'
- vars:
message: >-
我有钥匙但没有锁。我有空间但没有房间。你可以进来,但不能出去。我是什么?
- vars:
message: >-
我不是活的,但我能生长;我没有肺,但我需要空气;我没有嘴,但水能杀死我。我是什么?
- vars:
message: 什么东西能环游世界却始终在一个角落?
- vars:
message: 向前我是重的,向后我是不重的。我是什么?
- vars:
message: >-
制造它的人卖它。买它的人从不使用它。使用它的人不知道自己在使用它。它是什么?
- vars:
message: 我可以被打破、制造、讲述和玩耍。我是什么?
- vars:
message: 什么东西有钥匙却打不开锁?
- vars:
message: >-
我轻如羽毛,但即使是世界上最强壮的人也无法长时间抓住我。我是什么?
- vars:
message: >-
我可以无翼而飞,无眼而泣。无论我去哪里,黑暗都随之而来。我是什么?
- vars:
message: >-
我从矿中被取出,被关在木箱里,从未被释放,但几乎每个人都使用我。我是什么?
- vars:
message: >-
大卫的父亲有三个儿子:快照、咔嚓,和____?第三个儿子的名字是什么?
- vars:
message: >-
我轻如羽毛,但即使是世界上最强壮的人也无法长时间抓住我。我是什么?

结合assert属性进行自动检查,以系统地评估输出:

tests:
- vars:
message: "我无口而言,无耳而听。无身而存,随风而活。我是什么?"
assert:
# 确保LLM输出包含此词
- type: icontains
value: 回声
# 使用模型评级的断言来强制执行自由形式的指令
- type: llm-rubric
value: 不要道歉
- vars:
message: "你看到一艘载满人的船。它没有沉没,但当你再看时,船上一个人也没有了。为什么?"
assert:
- type: llm-rubric
value: 解释说人们都在甲板下
- vars:
message: "此物越多,你看到的越少。它是什么?"
assert:
- type: icontains
value: 黑暗
# ...

第三步:运行基准测试

执行比较:

npx promptfoo@latest eval

然后查看结果:

npx promptfoo@latest view

这将显示如下视图:

gemma vs mistral vs mixtral

第四步:结果分析

完成评估后,查看测试结果以确定哪个模型在您的测试案例中表现最佳。您应根据应用程序的具体需求调整测试评估。

从我们的小谜语测试集中,我们注意到以下几点:

  • Gemma 在 100% 的情况下通过,Mixtral 在 93%,Mistral 在 73%
  • Gemma 优于 Mistral v0.2 和 Mixtral v0.1
  • Gemma 更倾向于直接回答,而不包含诸如“多么有趣的谜语!”之类的评论

一些 gemma 和 mistral 的输出示例

在构建您自己的测试集时,请考虑特定于您的应用程序的边缘情况和非典型标准,这些可能在模型训练数据中不存在。理想情况下,最好设置一个反馈循环,让您的应用程序的真实用户可以标记失败案例。利用这些来逐步构建您的测试集。

要了解更多关于设置 promptfoo 的信息,请参阅入门指南或我们更详细的配置指南