简介

这篇文章介绍了6个评估大模型代码能力的重要基准:HumanEval、MBPP、EvalPlus、MultiPL-E、LiveCodeBench和CRUXEval。它们采用pass@k或Exact Match等指标,从不同角度评估模型的代码生成、修复及代码逻辑理解能力。LiveCodeBench可发现模型泛化能力差异,CRUXEval揭示模型对基本代码逻辑理解的局限性,这些工具对开发者选择和优化大模型具有重要参考价值。


现在各种技术报告当中经常通过各种指标来衡量大模型的能力,比如通用能力、代码能力、数学能力等。

很多人可能大概知道一些 benchmark 的功能,但是可能并没有仔细的看每个 benchmark 的一些细节,本篇就来介绍一下常用的测试代码能力的 benchmark

HumanEval

衡量指标: pass@k

OpenAI 在 2021 年发布的 Code 测试集。它包含 164 个手写的编程题目。编程语言只有 python 一种。

一个测试样例如下:

{
"task_id": "HumanEval/0",
"prompt": "from typing import List\n\n\ndef has_close_elements(numbers: List[float], threshold: float) -> bool:\n    \"\"\" Check if in given list of numbers, are any two numbers closer to each other than\n    given threshold.\n    >>> has_close_elements([1.0, 2.0, 3.0], 0.5)\n    False\n    >>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)\n    True\n    \"\"\"\n",
"entry_point": "has_close_elements",
"canonical_solution": "    for idx, elem in enumerate(numbers):\n        for idx2, elem2 in enumerate(numbers):\n            if idx != idx2:\n                distance = abs(elem - elem2)\n                if distance < threshold:\n                    return True\n\n    return False\n",
"test": "\n\nMETADATA = {\n    'author': 'jt',\n    'dataset': 'test'\n}\n\n\ndef check(candidate):\n    assert candidate([1.0, 2.0, 3.9, 4.0, 5.0, 2.2], 0.3) == True\n    assert candidate([1.0, 2.0, 3.9, 4.0, 5.0, 2.2], 0.05) == False\n    assert candidate([1.0, 2.0, 5.9, 4.0, 5.0], 0.95) == True\n    assert candidate([1.0, 2.0, 5.9, 4.0, 5.0], 0.8) == False\n    assert candidate([1.0, 2.0, 3.0, 4.0, 5.0, 2.0], 0.1) == True\n    assert candidate([1.1, 2.2, 3.1, 4.1, 5.1], 1.0) == True\n    assert candidate([1.1, 2.2, 3.1, 4.1, 5.1], 0.5) == False\n\n"
}

对于这个例子,大模型需要实现一个函数。该函数的输入是一个 List 和 threshold,如果 List 中任意两个数的差的绝对值不超过阈值,返回 True,否则返回 False。

评估指标采用的是 pass@k,也就是对于一道题目,生成 k 次结果,只要有一次通过就算通过。

论文中还讨论了如何高效的进行 pass@k 的无偏估计,详细见:TODO

MBPP

衡量指标: pass@k

Google 整理的 974 个众包 Python 编程题,旨在由入门级程序员解决,涵盖编程基础,标准库功能等,所以名字叫: The Mostly Basic Programming Problems

数据集地址为:https://github.com/google-research/google-research/tree/master/mbpp

一个测试样例如下:

{
'task_id': 1,
'text': 'Write a function to find the minimum cost path to reach (m, n) from (0, 0) for the given cost matrix cost[][] and a position (m, n) in cost[][].',
'code': 'R = 3\r\nC = 3\r\ndef min_cost(cost, m, n): \r\n\ttc = [[0 for x in range(C)] for x in range(R)] \r\n\ttc[0][0] = cost[0][0] \r\n\tfor i in range(1, m+1): \r\n\t\ttc[i][0] = tc[i-1][0] + cost[i][0] \r\n\tfor j in range(1, n+1): \r\n\t\ttc[0][j] = tc[0][j-1] + cost[0][j] \r\n\tfor i in range(1, m+1): \r\n\t\tfor j in range(1, n+1): \r\n\t\t\ttc[i][j] = min(tc[i-1][j-1], tc[i-1][j], tc[i][j-1]) + cost[i][j] \r\n\treturn tc[m][n]',
'test_list': [
'assert min_cost([[1, 2, 3], [4, 8, 2], [1, 5, 3]], 2, 2) == 8',
'assert min_cost([[2, 3, 4], [5, 9, 3], [2, 6, 4]], 2, 2) == 12',
'assert min_cost([[3, 4, 5], [6, 10, 4], [3, 7, 5]], 2, 2) == 16'],
'test_setup_code': '',
'challenge_test_list': []
}

这个题目是利用动态规划求 cost 最小的路径,但是题目其实没有写的特别清楚移动的方向。这就可能对编程带来一些困扰,移动方向能沿着对角线移动么?从测试样例看是允许对角线移动的。

所以为了保证编程的时候没有歧义,研究人员又对这 974 个题目人工校验了一遍。所以 MBPP 有两个版本的测试集,full 和 sanitized,其中 sanitized 版本是人工验证过的。

前面这个题就是因为题目不明确而没有在 santized 当中。

EvalPlus

衡量指标: pass@k

主要包含 HumanEval+, MBPP+ 两个测试集合。 其中 HumanEval+ 是对 HumanEval 的补充,数量大概是 HumanEval 的 80 倍。 MBPP+ 则是对 MBPP 的补充,数量大概是 HumanEval 的 35 倍。

MultiPL-E

衡量指标: pass@k

把 HumanEval 和 MBPP 两个 benchmark 翻译成了 18 种其他的语言。 比如下面是 C++ 的一个示例,改示例对应的是前面 HumanEval 的示例。

{
"name": "HumanEval_0_has_close_elements",
"language": "cpp",
"prompt": "#include<assert.h>\n#include<bits/stdc++.h>\n// Check if in given vector of numbers, are any two numbers closer to each other than\n// given threshold.\n// >>> has_close_elements((std::vector<float>({(float)1.0f, (float)2.0f, (float)3.0f})), (0.5f))\n// (false)\n// >>> has_close_elements((std::vector<float>({(float)1.0f, (float)2.8f, (float)3.0f, (float)4.0f, (float)5.0f, (float)2.0f})), (0.3f))\n// (true)\nbool has_close_elements(std::vector<float> numbers, float threshold) {\n",
"doctests": "transform",
"original": "/work/arjunguha-research-group/arjun/repos/nuprl/MultiPL-E/datasets/../datasets/originals-with-cleaned-doctests/HumanEval_0_has_close_elements.py",
"prompt_terminology": "reworded",
"tests": "}\nint main() {\n    auto candidate = has_close_elements;\n    assert(candidate((std::vector<float>({(float)1.0f, (float)2.0f, (float)3.9f, (float)4.0f, (float)5.0f, (float)2.2f})), (0.3f)) == (true));\n    assert(candidate((std::vector<float>({(float)1.0f, (float)2.0f, (float)3.9f, (float)4.0f, (float)5.0f, (float)2.2f})), (0.05f)) == (false));\n    assert(candidate((std::vector<float>({(float)1.0f, (float)2.0f, (float)5.9f, (float)4.0f, (float)5.0f})), (0.95f)) == (true));\n    assert(candidate((std::vector<float>({(float)1.0f, (float)2.0f, (float)5.9f, (float)4.0f, (float)5.0f})), (0.8f)) == (false));\n    assert(candidate((std::vector<float>({(float)1.0f, (float)2.0f, (float)3.0f, (float)4.0f, (float)5.0f, (float)2.0f})), (0.1f)) == (true));\n    assert(candidate((std::vector<float>({(float)1.1f, (float)2.2f, (float)3.1f, (float)4.1f, (float)5.1f})), (1.0f)) == (true));\n    assert(candidate((std::vector<float>({(float)1.1f, (float)2.2f, (float)3.1f, (float)4.1f, (float)5.1f})), (0.5f)) == (false));\n}\n",
"stop_tokens": [
"\n}"
    ]
}

LiveCodeBench

衡量指标: pass@k

LiveCodeBench 会定期的从 LeetCode、AtCoder 和 Codeforces 平台收集竞赛题目,构建一个综合的测试基准,当然主要是用来测试代码。从 code generation, self-repair, test output prediction, 和 code execution 4 个维度对模型进行打分。

这个 benchmark 跟 leetcode 一样,必须要所有的测试样例都通过了才算通过。一条数据的样例如下:

{
"question_title": "minimum-operations-to-exceed-threshold-value-i",
"question_content": "You are given a 0-indexed integer array nums, and an integer k.\nIn one operation, you can remove one occurrence of the smallest element of nums.\nReturn the minimum number of operations needed so that all elements of the array are greater than or equal to k.\n \nExample 1:\n\nInput: nums = [2,11,10,1,3], k = 10\nOutput: 3\nExplanation: After one operation, nums becomes equal to [2, 11, 10, 3].\nAfter two operations, nums becomes equal to [11, 10, 3].\nAfter three operations, nums becomes equal to [11, 10].\nAt this stage, all the elements of nums are greater than or equal to 10 so we can stop.\nIt can be shown that 3 is the minimum number of operations needed so that all elements of the array are greater than or equal to 10.\n\nExample 2:\n\nInput: nums = [1,1,2,4,9], k = 1\nOutput: 0\nExplanation: All elements of the array are greater than or equal to 1 so we do not need to apply any operations on nums.\nExample 3:\n\nInput: nums = [1,1,2,4,9], k = 9\nOutput: 4\nExplanation: only a single element of nums is greater than or equal to 9 so we need to apply the operations 4 times on nums.\n\n \nConstraints:\n\n1 <= nums.length <= 50\n1 <= nums[i] <= 10^9\n1 <= k <= 10^9\nThe input is generated such that there is at least one index i such that nums[i] >= k.",
"platform": "leetcode",
"question_id": "3331",
"contest_id": "biweekly-contest-125",
"contest_date": "2024-03-02T00:00:00",
"starter_code": "class Solution:\n    def minOperations(self, nums: List[int], k: int) -> int:\n        ",
"difficulty": "easy",
"public_test_cases": "[{\"input\": \"[2, 11, 10, 1, 3]\\n10\", \"output\": \"3\", \"testtype\": \"functional\"}, {\"input\": \"[1, 1, 2, 4, 9]\\n1\", \"output\": \"0\", \"testtype\": \"functional\"}, {\"input\": \"[1, 1, 2, 4, 9]\\n9\", \"output\": \"4\", \"testtype\": \"functional\"}]",
"private_test_cases": "[{\"input\": \"[90]\\n71\", \"output\": \"0\", \"testtype\": \"functional\"}, {\"input\": \"[21, 6, 62]\\n39\", \"output\": \"2\", \"testtype\": \"functional\"}, {\"input\": \"[42, 79, 14]\\n25\", \"output\": \"1\", \"testtype\": \"functional\"}, {\"input\": \"[86, 38, 33]\\n61\", \"output\": \"2\", \"testtype\": \"functional\"}, {\"input\": \"[30, 35, 60, 71]\\n13\", \"output\": \"0\", \"testtype\": \"functional\"},...]",
"metadata": "{\"func_name\": \"minOperations\"}"
}

上面例子中 private_test_cases 其实有 57 个,省略了一些。可以看出,每一条数据都被标注了来源、难易程度还有题目出现的日期。根据日期,就可以筛选出一些大模型发布之后的题目来进行测评,这样就避免了刷题的现象。

而且论文通过这种方法也发现了一些刷题过拟合的情况。如下图

该图横坐标某个模型在 livecodebench 上的 pass@1 ,纵坐标是该模型在 humaneval 上的 pass@1。正常来说模型在两个测试集合上的表现应该是差不多的,但是实际发现某些模型在 humaneval 上的效果很好,但是在 livecodebench 上的效果很差,如上图中红圈里的模型。说明这一类模型在碰到新的题目(livecodebench)后的泛化能力不太好。

CRUXEval

衡量指标:Exact Match 准确率。

这个测试挺有意思,测评的不是大模型输出的代码正不正确,而是给一段代码,让大模型根据输入判断输出(CRUXEval-O),或者让大模型根据输出判断输入(CRUXEval-O)。 题目其实都很简单,比如下面的示例:

{
"code": "def f(nums):\n    output = []\n    for n in nums:\n        output.append((nums.count(n), n))\n    output.sort(reverse=True)\n    return output",
"input": "[1, 1, 3, 1, 3, 1]",
"output": "[(4, 1), (4, 1), (4, 1), (4, 1), (2, 3), (2, 3)]",
"id": "sample_0"
}

这些例子让人去预测输入或者输出其实很简单,但是却难住了不少模型。最好的 GPT-4 模型在 CRUXEval-O 上的 pass@1 是 63%,在 CRUXEval-I 上的 pass@1 是 67%,加上 CoT 之后,这两个指标提升到了 81.9% 和 74.8%.

一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇

在这里插入图片描述

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

01.大模型风口已至:月薪30K+的AI岗正在批量诞生

在这里插入图片描述

2025年大模型应用呈现爆发式增长,根据工信部最新数据:

国内大模型相关岗位缺口达47万

初级工程师平均薪资28K(数据来源:BOSS直聘报告)

70%企业存在"能用模型不会调优"的痛点

真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!

02.如何学习大模型 AI ?

🔥AI取代的不是人类,而是不会用AI的人!麦肯锡最新报告显示:掌握AI工具的从业者生产效率提升47%,薪资溢价达34%!🚀

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工

📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐