在人工智能的快速发展中,中文大模型在文本生成、推理能力、长文本处理等领域取得了很大的进步。然而,生成能直接运行使用的代码是AI领域的一大挑战, 并且具有生产力级别的现实意义,对大模型的理解能力和创造力提出了更高要求。
尽管存在多个编程语言生成和理解的测试基准,如HumanEval,但它们大多基于英语, 无法直接用于评估中文大模型在编程领域的表现。目前,中文编程环境缺乏一个专门的评测基准,这限制了中文大模型在代码生成方面能力的客观评估和优化。 这一语言和文化差异导致中文大模型在编程任务上的潜力未能得到充分挖掘和利用。
为了缓解这一问题,我们推出了SuperCLUE-Code3测评集和基准。这是一个HumanEval的中文升级版,通过功能性单元测试,专门设计来评估和提升中文大模型 在代码生成方面的核心能力。SuperCLUE-Code3(简称SC-Code3)不仅延续了HumanEval高质量,更在多样性和应用广度上进行了适当扩充。
SC-Code3基准具备以下特点:
-
中文原生环境测试: SC-Code3基准着重考查模型在处理中文编程问题上的性能,所有编程问题有多个测试用例、经过多重校验、可进行端到端的测试, 确保评估的准确性和专业性。
-
全面的任务类型: 从字符串处理到数据分析到算法问题,SC-Code3基准包含了编程中的8种常见问题类型,旨在全面评估中文大模型在不同编程领域的能力。
-
多级难度评估: 通过将测试任务分为初级、中级和高级,SC-Code3可以提供不同层次的评估结果,帮助模型开发者了解模型在不同复杂程度的编程问题上的表现。
总结来说,SC-Code3基准不仅填补了中文大模型在编程领域评估的空白,而且为模型的进一步研究和应用提供了关键、精准的评估工具和数据支持。 随着其在中文编程社区的推广和使用,我们期待中文大模型在编程语言理解和代码生成上能够取得更多突破,推动人工智能技术在更多领域的应用和发展。
项目地址:https://github.com/CLUEbenchmark/SuperCLUE-Code3
文章地址:www.CLUEbenchmarks.com/superclue_code3.html
SC-Code3项目的目标是为中国基础模型发展提供一个专业的代码能力测试的基准,用于衡量具备生产力的代码能力,并为大模型代码能力发展提供指引和方向。
Code3可用于替代HumanEval来更好的测评中文大模型。具体的说,
我们希望提供一个端到端的功能性代码测试的基准,它是一个中文原生代码测试集,需要具有挑战性,并且可以按照难度等级报告大模型的能力。
序号 | 对比项目 | SuperCLUE-Code3 | HumanEval |
---|---|---|---|
1 | 代码功能性单元测试 | YES | YES |
2 | 自然语言描述并包含示例 | YES | YES |
3 | Python测试语言 | YES | YES |
5 | 中文原生场景 | YES | NO |
6 | 题目类型多样化 | YES | NO |
7 | 按难度等级评估能力 | YES | NO |
9 | 题目数量 | 195题 (1560个测试用例) |
164题 (1263测试用例) |
9 | 平均测试用例 | 8个 | 7.7个 |
整体测评流程包括:1.获取模型答案;2.提取功能函数;3.测试功能函数;4.计算模型得分。
使用特定的prompt要求模型按照特定格式回答,以方便后续提取。对于一个代码补全问题,每个模型获取一次答案。
获取到模型回复之后,结合prompt要求和模型回答设定规则提取函数代码,并且统计模型回复遵循指令要求的情况。
对于一个代码补全问题,将提取得到的代码和该问题对应的所有测试用例组装成一个可运行的单元测试程序(示例如下),在沙箱环境运行(沙箱环境python版本设置为3.9)。注意,针对一个题目需要通过所有单元测试,才算通过。否则为未通过。
f'''代码生成任务
1.任务名称:
根据需求描述和测试用例来生成代码。
2.任务描述:
需求描述定义了需要生成的代码的用途和要求;提供的测试用例包括了代码的输入参数列表、期望的输出,用于测试你生成的代码。
你生成的所有代码需要包含必要的库导入步骤。不允许更改方法的名称和已经给定的形式参数的名称和类型。
除了定义函数的功能体和必要的包导入步骤,你生成的代码不应该包括任何多余内容。你生成的代码需要符合Python代码格式要求,要能正确运行。
3.生成的代码的片段必须符合下面的格式要求:
【代码开始】
your code here
【代码结束】
比如:
【代码开始】
from typing import List
def has_xxx_elements(numbers: List[float], threshold: float) -> bool:
for i in range(len(numbers)):
return False
【代码结束】
4. 需求描述和测试用例
<需求描述和测试用例--开始>
{q1}
<需求描述和测试用例--结束>'''
对于一个代码补全问题,构成一个单元测试,通过测试得1分。首先分别计算模型在初级,中级,高级题目的平均得分score_level1,score_level2, score_level3, 然后计算加权得分。
按照问题难度的等级设定权重,初级,中级,高级权重分别设置1.0,2.0,3.0。模型最终得分为:
score_weighted = (1.0 * score_level1 + 2.0 * score_level2 + 3.0 * score_level3) / (1+2+3)
测试示例:
from typing import List
def inclusion_list(list1:list[float], list2:list[float]) -> bool:
"""给定两个数字列表,判断list1是否包含list2中的所有元素?
>>> inclusion_list([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0], [3.0, 4.0, 5.0])
True
>>> inclusion_list([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0], [3.0, 4.0, 5.0, 8.0])
False
"""
return all(elem in list1 for elem in list2)
def check(candidate):
assert candidate([1.1, 1.2, 2.0, 3.0, 3.5], [0, 1.1, 2.1]) == False
assert candidate([1.1, 1.2, 2.0, 3.0, 3.5], [1.1, 1.2, 2.0]) == True
assert candidate([1.0, 2.0, 3.0, 4.5, 5.1], [1.0]) == True
check(inclusion_list)
为了全面评估大模型的编程能力,我们设定了不同级别的测试题目,每一级别均旨在衡量模型在特定复杂度下的编程逻辑和实现能力:
这一级别的题目设计简单明了,模型只需执行基础的数据操作,如增加、删除、查找和修改。解题过程不应超过两次数据遍历,且通常能够在两个步骤内完成。 这些题目的参考代码长度大约在5行左右,用以验证模型在处理基础编程任务方面的效率和准确性。
题目在逻辑上稍显复杂,要求模型不仅要理解题目要求,还需设计实现逻辑。这可能涉及多步操作、多种情况判断以及边界条件处理。参考代码的长度约为10行以内, 这一级别的题目用以评估模型在面对中等复杂度问题时的编程设计能力和问题解决策略。
这一级别的题目难度较高,要求模型深入理解题目背后的复杂逻辑,并进行精细的逻辑设计。可能包括算法设计或解决具有一定难度的数学问题。 完成这些任务通常需要超过15行的代码。高级难度题目是对模型在高级编程技巧、算法理解和复杂问题解决能力的终极测试。
序号 | 模型 | 使用 | 难度等级 加权得分 |
非加权 得分 |
指令 遵循率 |
---|---|---|---|---|---|
1 | GPT-4-0125-preview | API | 68.00 | 78.97 | 100.00 |
2 | GPT-4 | API | 63.74 | 77.44 | 100.00 |
3 | GPT-3.5-Turbo-0125 | API | 55.51 | 69.23 | 85.13 |
4 | deepseek-coder-6.7b | 模型 | 47.78 | 55.38 | 57.95 |
5 | Gemini 1.0 Pro | API | 46.50 | 56.92 | 0.00 |
6 | XVERSE-13B-2-Chat | 模型 | 30.53 | 43.08 | 75.90 |
7 | Qwen-14b-Chat | 模型 | 24.67 | 37.95 | 85.13 |
8 | Code-Llama-13b-instruct | 模型 | 21.11 | 34.36 | 1.03 |
9 | ChatGLM3-6B-Chat | 模型 | 15.29 | 22.56 | 91.79 |
10 | Baichuan2-13B-Chat | 模型 | 13.89 | 26.09 | 94.36 |
11 | Llama2-13b-Chat | 模型 | 6.06 | 13.33 | 94.36 |
说明:使用方式为模型时的解码方式统一为:greedy;指令遵循率,为模型是否遵循了规定的格式来输出最终答案。
deepseek-coder-6.7b具体指deepseek-coder-6.7b-instruct
序号 | 模型 | 使用 | 难度等级 加权得分 |
初级 难度 |
中级 难度 |
高级 难度 |
---|---|---|---|---|---|---|
1 | GPT-4-0125-preview | API | 68.00 | 88.89 | 80.60 | 52.63 |
2 | GPT-4 | API | 63.74 | 90.00 | 79.10 | 44.74 |
3 | GPT-3.5-Turbo-0125 | API | 55.51 | 82.22 | 70.15 | 36.84 |
4 | deepseek-coder-6.7b | 模型 | 47.78 | 67.78 | 46.27 | 42.11 |
5 | Gemini 1.0 Pro | API | 46.50 | 68.89 | 53.73 | 34.21 |
6 | XVERSE-13B-2-Chat | 模型 | 30.53 | 63.33 | 28.36 | 21.05 |
7 | Qwen-14b-Chat | 模型 | 24.67 | 57.78 | 25.37 | 13.16 |
8 | Code-Llama-13b-instruct | 模型 | 21.11 | 52.22 | 25.37 | 7.89 |
9 | ChatGLM3-6B-Chat | 模型 | 15.29 | 32.22 | 17.91 | 7.89 |
10 | Baichuan2-13B-Chat | 模型 | 13.89 | 43.53 | 15.62 | 2.86 |
11 | Llama2-13b-Chat | 模型 | 6.06 | 24.44 | 5.97 | 0.00 |
国际代表性大模型在SC-Code3功能性单元测试中整体表现优于国内中小型模型,特别在高级难度的任务上展现出较强的编码能力;此外,指令遵循率普遍较高,表明各模型较好地理解并执行了给定任务。
GPT-4-0125-preview作为国际大模型,在加权得分上达到68.00,非加权得分为78.97,明显高于其他模型,尤其是在高级难度得分上达到52.63,表明其对复杂问题的处理能力强。
所有模型在初级难度得分上的表现普遍不错,例如GPT-4-0125-preview在初级难度得分为88.89,这表明大部分模型能够较好地处理基础编程任务。
deepseek_coder6.7B_greedy作为国内小模型,在中级难度得分上达到46.27,接近一些国际大模型如Gemini 1.0 Pro的53.73,显示出国内模型在特定级别的任务上具有竞争力。
高级难度的得分在各模型间表现出较大差异,国际大模型如GPT-4的得分为44.74,而国内小模型如XVERSE-13B-2-Chat仅为21.05,说明在处理更复杂的编码问题时, 大模型的优势更加明显。
以Code-Llama-13b-instruct为例,它的加权得分仅为21.11,远低于国际大模型GPT-4系列的平均得分超过60,deepseek-coder-6.7b-instruct的48分。 尤其在高级难度得分上,Code Llama 13B只有7.89分,这与它在初级难度得分(52.22分)的良好表现形成鲜明对比,表明其在处理更复杂中文代码任务时效果有限。
这可能是因为这些模型在训练时没有针对中文编程语境进行充分的优化,或者是因为国内模型在理解中文编程语境方面有天然的优势。 因此,我们不能仅仅根据模型的国际声誉来评估其在特定任务上的有效性。
尽管指令遵循率普遍高于85%,如GPT-4系列模型均达到了100%,但仍有部分国际模型如Gemini 1.0 Pro和Code-Llama-13b-instruct的在中文使用场景的指令遵循率小于10%,表明在中文理解和遵循指令方面,上仍有提升的空间。
需要注意的是,我们本次测试了一批国际上代表性的模型,包含了较大参数的模型,而国内模型测试中本次主要是针对参数量较小的模型,后续将添加更多模型。
加入交流群或添加微信交流。现征集代码大模型测评,有意愿参与代码测评的厂商可发送邮件至[email protected],标题:SuperCLUE-Code3测评集