password
URL
type
status
date
slug
summary
tags
category
icon
周起始
标签
是否汉化
https://opencompass.org.cn/home
OpenCompass 由 上海人工智能实验室 研发的开源、高效、全面的大模型评测体系及开放平台。作为大模型标准测试工具被Meta AI官方推荐,点击 Llama 的 Standard Evaluation tools 获取更多信息。在魔塔社区上,司南评测功能,就是基于OpenCompass的实现。
截止2024年7月,OpenCompass支持语言理解、知识准确度、逻辑推理、创意生成、数学解题、代码编写、长篇文本处理及智能体交互等8大能力,29项核心任务的评测,评测集实际超过100个。

8大重点通用能力 | 29项核心任务 | 100+评测数据集 |
语言理解 | 信息抽取、意图识别、情感分析、内容总结、内容评价、多语言翻译、中华传统文化理解、中文语义理解、多轮对话 | ㅤ |
知识准确度 | 生活常识、自然科学(理科)、自然科学(工科)、社会科学、人文科学 | ㅤ |
逻辑推理 | 逻辑推理、常识推理 | ㅤ |
创意生成 | 内容扩写、内容续写、内容改写 | ㅤ |
数学解题 | 初等数学、中等数学、高等数学 | ㅤ |
代码编写 | 代码生成、代码分析 | ㅤ |
长文本处理 | 长文本理解与推理、长文本创作 | ㅤ |
智能体交互 | 任务规划、工具调用、反思能力、任务执行总结、多轮交互 | ㅤ |
除了以上这些,OpenCompass还基于 VLMEvalKit 开源评测框架,以纯生成类的方式评估多模态大模型在数十个开源评测集上的综合表现。
OpenCompass由三大组件组成,分别是评测工具CompassKit和VLMEvalKit、评测集社区CompassHub、评测榜单CompassRank。
- 评测工具CompassKit,以开源工具库的形式提供丰富的评测集和模型模板,支持灵活扩展,以满足各种模型评测实际业务需求。
- 评测工具VLMEvalKit,一个全新的开源多模态评测框架,旨在提供可靠、可复现的评测结果,助力社区更准确地比较不同多模态模型在各种任务上的性能。
- 评测集社区CompassHub,在社区内发布和分享评测集,包括了学科类、语言类、知识类、代码、数学、创作等多种任务类型的评测集。
- 评测榜单CompassRank,基于司南 OpenCompass 官方评测规则,对行业领先大模型进行评测,根据评测结果发布榜单
1. 工具架构

- 模型层:大模型评测所涉及的主要模型种类,OpenCompass以基座模型和对话模型作为重点评测对象。
- 基座模型:一般是经过海量的文本数据以自监督学习的方式进行训练获得的模型(如OpenAI的GPT-3,Meta的LLaMA),往往具有强大的文字续写能力。
- 对话模型:一般是在的基座模型的基础上,经过指令微调或人类偏好对齐获得的模型(如OpenAI的ChatGPT、上海人工智能实验室的书生·浦语),能理解人类指令,具有较强的对话能力。
- 能力层:OpenCompass从通用能力和特色能力两个方面来进行评测维度设计。在模型通用能力方面,从语言、知识、理解、推理、安全等多个能力维度进行评测。在特色能力方面,从长文本、代码、工具、知识增强等维度进行评测。
- 方法层:OpenCompass采用客观评测与主观评测两种评测方式。客观评测能便捷地评估模型在具有确定答案(如选择,填空,封闭式问答等)的任务上的能力,主观评测能评估用户对模型回复的真实满意度,OpenCompass采用基于模型辅助的主观评测和基于人类反馈的主观评测两种方式。
- 工具层:支持自动化地开展大语言模型的高效评测。包括分布式评测技术,提示词工程,对接评测数据库,评测榜单发布,评测报告生成等诸多功能。
2. 评估指标
目前 OpenCompass 中,常用的 Evaluator 主要放在
opencompass/openicl/icl_evaluator
文件夹下, 还有部分数据集特有指标的放在 opencompass/datasets
的部分文件中,具体参考这里。评估标准配置一般放在数据集配置文件中,即 xxdataset\_eval\_cfg 的evaluator参数。
3. 评测流程
在 OpenCompass 中评估一个模型通常包括以下几个阶段:配置 -> 推理 -> 评估 -> 可视化。

配置:这是整个工作流的起点。您需要配置整个评估过程,选择要评估的模型和数据集。此外,还可以选择评估策略、计算后端等,并定义显示结果的方式。
推理与评估:在这个阶段,OpenCompass 将会开始对模型和数据集进行并行推理和评估。推理阶段主要是让模型从数据集产生输出,而评估阶段则是衡量这些输出与标准答案的匹配程度。这两个过程会被拆分为多个同时运行的“任务”以提高效率,但请注意,如果计算资源有限,需要调整
--max-partition-size
的设置。可视化:评估完成后,OpenCompass 将结果整理成易读的表格,并将其保存为 CSV 和 TXT 文件。你也可以激活飞书状态上报功能,此后可以在飞书客户端中及时获得评测状态报告。
4. 准备评测环境
需要先安装conda:
M1 mac安装conda:
安装面向开源模型的GPU环境:
或者,安装面向API模型的CPU环境:
安装 OpenCompass
如果需要评测API模型,请
pip install -r requirements/api.txt
安装API模型的相关依赖。5. 准备评测集
OpenCompass 支持的数据集主要包括三个部分:
- Huggingface 数据集: Huggingface Dataset 提供了大量的数据集,这部分数据集运行时会自动下载。
- ModelScope 数据集:ModelScope OpenCompass Dataset 支持从 ModelScope 自动下载数据集,需要设置环境变量:
export DATASET_SOURCE=ModelScope
。
- OpenCompass 还提供了一些第三方数据集及自建中文数据集。在 OpenCompass 项目根目录下运行下面命令,将数据集准备至
${OpenCompass}/data
目录下:
如果需要使用 OpenCompass 提供的更加完整的数据集 (\~1.79G),可以使用下述命令进行下载和解压:
configs/datasets
目录下的结构,如下所示:数据集配置文件名由以下命名方式构成
{数据集名称}_{评测方式}_{prompt版本号}.py
。configs/datasets/ceval/ceval_gen_2daf24.py
为例,配置文件则为全面的中文基础模型评估套件的 C-Eval
数据集,对应的评测方式为 gen
,即生成式评测,对应的prompt版本号为 2daf24
;同样的,
ceval_ppl_1cd8bf
.py指评测方式为ppl
即判别式评测,prompt版本号为 1cd8bf
。除此之外,不带版本号的文件,例如:
ceval_gen.py
则指向该评测方式最新的prompt配置文件,通常来说会是精度最高的prompt。以 PIQA 数据集配置文件
configs/datasets/piqa/piqa_gen_1194eb.py
为示例,展示数据集配置文件中各个字段的含义。6. 评测开源模型
OpenCompass 初体验,新手如何跑通第一个模型评测-CSDN博客
对于开源模型,OpenCompass 默认直接使用 HuggingFace model ID 从 hf 上下载开源模型和权重,对于一些无法访问外网的机器,这里很容易网络连接失败。这种情况下,可以先通过 ModelScope 下载待评测的模型。
- 基座模型 InternLM2-1.8B 在 GSM8K 数据集上进行评估
从huggingface下载模型:
或者从 ModelScope 下载模型:
修改模型配置文件
configs/models/hf_internlm/hf_internlm2_1_8b.py
将 path 替换为本地模型目录即可。并设置 tokenizer\_path 和path参数一样。
创建评估文件
configs/eval_internlm2_1_8b.py
,其中设置好datasets
和models
:运行评估:
更多参数参考这里。从输出看internlm2-1.8b模型在gsm8k数据集的得分为29.80分,最终的评测结果会保存在
outputs/default/
下面:要想同时评估多个数据集,则可以在
read_base
同时导入多个数据集,并通过+
将多个数据集拼接起来传给datasets参数。同理要想同时评估多个模型,也是在read_base
同时导入多个模型,并通过+
将多个模型拼接起来传给models参数。可能得报错Error: mkl-service + Intel(R) MKL: MKL\_THREADING\_LAYER=INTEL is incompatible with libgomp.so.1 library.解决办法:https://stackoverflow.com/questions/66932956/python-mkl-threading-layer-intel-is-incompatible-with-libgomp-so-1-library pip install -U numpy==1.25
- 对话模型 Qwen2-1.5B-Instruct 在 GSM8K 和 MATH 数据集上的评估
下载模型
修改模型配置文件
configs/models/qwen/hf_qwen2_1_5b_instruct.py
创建评估文件
configs/eval_qwen2_1_5b_instruct.py
,其中设置好datasets
和models
:demo_gsm8k_chat_gen
的内容:demo_math_chat_gen
的内容执行评测
python run.py configs/eval_qwen2_1_5b_instruct.py --debug
,输出:7. 评测基于API的模型
OpenCompass内置支持的API大模型可以从这里看到。OpenCompass将支持的API模型在
opencompass.models
进行了封装了。这里以评估qwen大模型API为例,学习如何使用opencompass调用模型API进行评测。QWen的API已经封装在了
opencompass/models/qwen_api.py
里面,我们只需要配置QWen API评测文件configs/api_examples/eval_api_qwen.py
即可,修改其中如下参数:path
表示的是qwen
系列大模型的名称。
key
是调用qwen大模型API的api-key。
datasets
配置评测数据集。
work_dir
配置推理和评估的结果存储路径。
然后执行评估命令:
在正常模式下,评估任务将在后台执行。
-mode all
:指定任务的特定阶段。
评测进行大概执行了1个小时10分钟,其中推理花了1个半小时,评估花了10分钟。花了我40块钱\~\~\~。
推理过程的输出:
评估过程的输出:
评估之后的输出为:
评估结果保存至
configs/api_examples/eval_api_qwen.py
配置的work_dir
里面。结构如下:如果在
{WORKDIR}
中已经有模型输出,则指定为 eval
仅运行评测,获得评测结果;如果在 results/
中已有单项评测结果,则指定为 viz
仅运行可视化;r
: 重用已有的推理结果。如果后面跟有时间戳,则会复用工作路径下该时间戳的结果;否则则复用指定工作路径下的最新结果。
8. 评测自定义API模型
参考::https://mp.weixin.qq.com/s/rpvV0PeHVueiPITVCIzJjg
目前OpenCompass已经支持的模型有 HF 模型、部分模型 API 、部分第三方模型。如果想支持更多的模型需要自定义扩展,OpenCompass提供了两种自定义的方式:
- 新增API模型
- 新增开源模型
NIOGPT平台作为蔚来大模型服务平台,上面部署了很多大模型,并通过API的方式对外提供服务。我们这里就以新增NIOGPT平台上的API模型为例,看下如何对OpenCompass进行扩展。
根据NIOGPT平台的接口定义,调用NIOGPT模型的方法如下:
第一步,根据上述方法定义API模型
opencompass/models/niogpt_api.py
,这一步我们可以参考OpenCompass已经支持的API模型,例如参考opencompass/models/qwen_api.py
文件。继承 BaseAPIModel
,并实现 generate
方法来进行推理,推理方法参考askChatGPTAgent
。同时修改
opencompass/models/__init__.py
,在文件中增加刚刚新增的NIOGPT的导出,新增代码如下:这样一个自定义的API模型就完成了。
第二步,定义配置文件,在
configs/api_examples
目录下新建eval\_api\_niogpt.py,文件内容如下:在配置文件中,我们可以设置它的测试集datasets,models的path参数设置相应的大模型名称,key参数设置成大模型调用的API的API-KEY,同时还可以通过work\_dir来设置测试结果输出的目录。
这样,在项目根目录下执行如下命令就可以开始评测了:
当query\_per\_second=1时,评测:100%|██████████| 165/165 \[36:38<00:00, 13.32s/it]
当query\_per\_second=2时,评测:100%|██████████| 165/165 \[29:04<00:00, 10.57s/it]
9. 基于LLM的主观评测
前面主要介绍了大模型的客观评测,但是客观评测面临以下几个重要问题:
- 题型固化,以选择题、填空题为主,与模型的真实应用场景有差异;
- 评测使用的测试集会可能被下一代模型的预训练或者微调,导致客观评测失真
- 各数据集的数据分布相对固定,导致结果和排名的差异
- 中心化的评测导致评测结果的透明度、可信度相对较低
为了解决客观评测的这些问题,主观评测具有以下优点:
- 评测数据形式多样
- 评测数据来自真实用户
- 评测是分布式的,评测结果相对可信

流行的评估方法主要有:
- Compare模式:将模型的回答进行两两比较,以计算对战其胜率。
- Score模式:针对单模型的回答进行打分(例如:Chatbot Arena)。
主观评测旨在评估模型在符合人类偏好的能力上的表现。这种评估的黄金准则是人类喜好,但标注成本很高。
为了探究模型的主观能力,OpenCompass采用了JudgeLLM作为人类评估者的替代品(LLM-as-a-Judge)。基于以上方法支持了JudgeLLM用于模型的主观能力评估。
主观评测的具体流程包括:
- 评测数据集准备
- 使用API模型或者开源模型进行问题答案的推理
- 使用选定的评价模型(JudgeLLM)对模型输出进行评估
- 对评价模型返回的预测结果进行解析并计算数值指标
类似于已有的客观评测方式,可以在
configs/eval_subjective.py
中进行相关配置。第一步,配置数据集,目前默认支持的数据集有:
第二步,设置待评测模型,需要设置
do_sample
的方式进行推理而不是greedy
。这里介绍一下
do_sample
和greedy
两种不同的解码或生成策略:- Greedy Decoding(贪婪解码):
- 在贪婪解码中,模型在每个时间步都会选择概率最高的输出。换句话说,它在生成序列时总是选择当前最有可能的下一个元素。
- 这种方法简单且计算效率高,但可能会导致结果缺乏多样性,有时也可能会陷入局部最优,而不是全局最优。
- Sampling(采样):
- 采样是一种更灵活的生成策略,它在每个时间步都会根据概率分布进行随机选择。"do\_sample"通常是一个参数,当设置为
True
时,指示模型使用采样方法进行生成。 - 采样可以增加结果的多样性,有时能够避免贪婪解码中的一些问题,如生成过于单调或重复的模式。
- 采样方法通常包括:
- 均匀采样:从概率分布中均匀地选择下一个元素。
- 类别采样:根据类别的概率分布进行采样,常用于处理类别不平衡的数据集。
- Top-k采样:只考虑概率最高的k个元素进行采样。
- Top-p采样(Nucleus Sampling):从累积概率超过某个阈值p的最小集合中采样,这个集合称为核(nucleus)。
在进行主观评测时,可能需要模型生成更多样化和创造性的结果,因此使用采样方法而不是贪婪解码。而在客观评测中,可能会使用贪婪解码,因为它生成的结果是确定性的,便于评估和比较。
例如,在自然语言处理中,使用采样方法可以生成更自然、更少重复的文本;而在机器翻译或文本摘要任务中,贪婪解码可能会生成更流畅但可能缺乏创造性的文本。
第三步,配置judgemodel,通常被设置为GPT4等强力模型,可以直接按照config文件中的配置填入自己的API key,或使用自定义的模型作为judgemodel
除了基本参数以外,还可以在config中修改
infer
和eval
字段里的partitioner,从而设置更合适的分片方式,目前支持的分片方式主要有三种:NaivePartitoner, SizePartitioner和NumberWorkPartitioner 以及可以指定自己的workdir用以保存相关文件。最后,启动评测
自定义主观评测集
10. 支持新数据集
- 在
opencompass/datasets
文件夹新增数据集脚本mydataset.py
, 该脚本需要包含:数据集及其加载方式,需要定义一个MyDataset
类,实现数据集加载方法load
,该方法为静态方法,需要返回datasets.Dataset
类型的数据。参考:opencompass/datasets/ceval.py
- (可选)定义评测器类
MyDatasetlEvaluator
,实现评分方法score
,需要根据输入的predictions
和references
列表,得到需要的字典。参考opencompass/openicl/icl_evaluator/
。
- (可选)定义后处理方法
mydataset_postprocess
方法,根据输入的字符串得到相应后处理的结果。
- 配置文件中应用自定义数据集、评估器和数据后处理方法。参考
configs/datasets/ceval/ceval_gen_5f30c7.py
11. 探究评测提示词
在 OpenCompass 中,数据集需要转换为一系列的提示词输入给大模型,这个过程是由模板 (template) 来定义的。 template 拆分为两部分:数据侧的 template 和模型侧的 template。在测评模型时,数据会先后经过数据和模型侧的 template,最终转化为模型所需的输入。
数据侧的 template 被称为 prompt\_template,它表示了把数据集的字段转化成提示词的过程。
模型侧的 template 被称为 meta\_template,它表示了模型将这些提示词转化为自身期望的输入的过程。
我们另外还提供了一些 思维链 的 prompt 示例。
- Prompt构建策略
OpenCompass 将 prompt 的构建策略定义在了数据集配置中的
infer_cfg
部分。以configs/datasets/mmlu/mmlu_gen_4d595a.py
中的mmlu_infer_cfg
为例,如下所示:运行时,花括号
{}
内的字段会被替换成数据样本内的对应字段。如果数据样本中没有对应的字段,则会保持原样输出。在 OpenCompass 中,对于 0-shot 的评测,我们通常只需要定义
prompt_template
字段,即可完成 prompt 的构造。但对于 few shot 的评测,我们还需要定义 ice_template
字段,管理上下文学习中样例所对应的 prompt 模板。- Prompt模板
mmlu\_infer\_cfg是对话式模板,其中prompt 是以不同角色
role
的对话为形式进行组织的。在当前 OpenCompass 的预定义数据集配置中,一个 prompt 中常有的角色有:HUMAN
:人类,通常为提问的一方
BOT
:语言模型,通常为回答的一方
SYSTEM
:系统,通常用在提示词的开头,负责下达指令。
- 推理方式不同Prompt模板不同
OpenCompass 中主要支持了两种 Infernecer:
GenInferencer
和 PPLInferencer
,它们对应着两种不同的推理方式。GenInferencer
对应生成式的推理。在推理时,模型被要求以输入的提示词为基准,继续往下续写。此时,template
则单一地表示这一句话对应的模板,例如:configs/datasets/gsm8k/gsm8k_gen_1d7fe4.py
而
PPLInferencer
对应判别式推理。在推理时,模型被要求计算多个输入字符串各自的混淆度 (PerPLexity / ppl),并将其中 ppl 最小的项作为模型的推理结果。此时 template
是一个 dict
,表示每一句话所对应的模板,例如configs/datasets/ceval/ceval_ppl_1cd8bf.py
此时模型的推理结果将会是
template
的四个 key 之一 (“A” / “B” / “C” / “D”)- Meta Template
Meta Template 与模型的配置相绑定,在运行时与数据集的对话式模板相结合,最终产生最适合当前模型的 prompt。
下图展示了在语言模型上,数据从数据集中经过 prompt template 和 meta template,最终构建出 prompt 的几种情况。
在对话开始或结束时嵌入其它字符串,如系统指令,可以在meta\_template中通过指定
begin
和 end
参数指定这些字符串。如果数据集中引入 SYSTEM 级别的角色,且模型同样接受 SYSTEM 这个角色,可以把 SYSTEM 角色的定义放进 meta\_template的
reserved_roles
中。meta\_template 是一个字典,该字典可以包含以下数个字段:
begin
,end
:(str,可选) prompt 的开头和结尾,通常是一些系统级别的指令。
round
:(list) 每一轮对话的模板格式。每轮对话的 prompt 内容由数据集配置的对话式模板控制。
reserved_roles
:(list,可选)指定round
中并未出现,但有可能在数据集配置中用到的的预留角色,例如SYSTEM
角色。
eos_token_id
:(int, 可选):指定了该模型的 eos token 的 id。如果不设置,则默认为 tokenizer 中的 eos token id。它的主要作用是在生成式任务中,截取模型的输出结果,因此一般应该被设置为 generate=True 的项所对应的 end 的第一个 token id。
meta\_template 的
round
指定了一轮对话中每个角色说话的格式,接受一个字典组成的列表,每个字典的关键字如下:role
(str): 参与对话的角色名,该字符串并不影响实际的 prompt。
begin
,end
(str): 指定该角色在说话时的固定开头或结尾。
prompt
(str):角色的 prompt。在 meta template 中允许留空,但此时必须在数据集配置的 prompt 中指定。
generate
(bool): 指定为 True 时,该角色即为模型扮演的角色。在生成任务中,模型接收到的 prompt 会截止到该角色的begin
处,剩下的内容由模型补全。
在某些情况下(例如对基座的测试),我们并不需要在正常对话中注入任何的指令,此时我们可以将 meta template 置空。在这种情况下,模型接收到的 prompt 仅由数据集配置定义,是一个普通的字符串。若数据集配置使用的是对话式模板,不同角色的发言将会由 \n 拼接而成。
API 模型的 meta template 与普通模型的 meta template 类似,但配置更为简单。用户可以根据情况,直接使用下面的两种配置之一,即可以多轮对话的方式评测 API 模型:
下图展示了 API 模型接受的输入与 Prompt Template 、Meta Template 之间的关系。 OpenCompass 为 API 模型预设了三个
api_role
:HUMAN
, BOT
, SYSTEM
,API 模型会将对话重新以多轮对话格式打包,发送至后端。但要激活此功能,需要用户使用上面的 meta template 中把数据集 prompt 模板中的角色 role
映射到对应的 api_role
中。如果需要调试 prompt,建议在准备好配置文件后,使用
tools/prompt_viewer.py
脚本预览模型实际接收到的 prompt。12. 视频课程
"https://player.bilibili.com/player.html?bvid=1Gg4y1U7uc&vd_source=7afb44332c571a8a5bfa5acec59995b0"
离开乏味的皮囊,自由的灵魂在路上
- Name: Alan Hsu
- Tag: 随感、技术、经验、旅行、推荐、生活、音乐、电影 etc.
- Email:xulanzhong521gmail.com
- Twitter:@AlanHsu521
- Telegram:@AlanHsu521
- WeChat: Alan_Hsu_521
- Github: https://github.com/xsoway/
- Blog: https://xmylog.com


- Author:Alan_Hsu
- URL:https://xmylog.com/article/articles_LLMTest_opencompass
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts