今年6月,智源发布悟道·天鹰(Aquila)大模型系列,开启国内通用大模型「开源可商用」先河。
作为目前支持中英双语、性能最好的开源“文本-代码”生成模型,AquilaCode 逾一月更新迭代,全面升级多语言代码生成模型 AquilaCode-multi 及 Python 语言生成模型 AquilaCode-py,依然商用许可,且持续迭代开源。
AquilaCode-multi 支持 Python/C++/Java/Javascript/Go等多种编程语言的生成,在多语言代码生成评测 HumanEval-X 的各项指标上显著超过了其他开源模型。
专注于Python代码生成的AquilaCode-py 也在OpenAI 编制的 HumanEval(Python)各项评测指标中领先,Pass@1 仅次于月初 Salesforce 开源的 CodeGen2.5-7B-mono。
得益于基座模型的强大能力,AquilaCode 以小规模高质量数据实现高性能代码生成 :
Aquila-7B 基座模型在HumanEval 评测中 Pass@1 和 Pass@100 得分均超越了近期开源的 Llama2-7B。
将“质重于量”进一步彰显,AquilaCode 使用经过高质量过滤且有合规开源许可的代码数据进行训练,以仅为其他开源代码生成模型的 10~40%数据量实现了更高性能。
此外,支持开发者定制“Copilot”代码助手以提升代码编写效率亦是亮点。
使用方式一(推荐):
通过 FlagAI 加载 Aquila 系列模型
https://github.com/FlagAI-Open/FlagAI/tree/master/examples/Aquila
使用方式二:
通过 FlagOpen 模型仓库单独下载权重
使用方式三:
通过 Hugging Face 加载 Aquila 系列模型
AquilaCode高性能代码生成显著领先同等参数量级开源模型
AquilaCode-multi 支持 Python/C++/Java/JS/Go等多编程语言高准确率生成。
在衡量生成代码的功能正确性的多语言代码生成评测HumanEval-X评测结果中,AquilaCode-multi 在多语言代码生成任务上展现出了显著优势,Pass@1、Pass@10、Pass@100 三项评测结果中均排名第一,明显优于其他模型。
在Pass@1的指标中,AquilaCode-multi 对于各种语言,包括Python、C++、Java、JavaScript和Go的处理结果均显著优于其他模型,平均得分为22.0,比第二名CodeGeeX-13B 高出近20%。
HumanEval-X Pass@k 各模型在多语言代码生成上的平均成绩,数据来自 HumanEval-X 官方公布结果:
HumanEval-X 多语言生成能力表格 Pass@k(Python/C++/Java/Javascript/Go):
指标说明:模型针对每个问题生成 k个代码样本,如果有任何样本通过单元测试,则认为问题已解决,并报告问题解决的总比例,即 Pass@k 得分。
pass@1
pass@10
pass@100
Aquila-7B 基座模型在HumanEval(Python)排名领先。
HumanEval(Python)是评估“文本-代码”生成模型功能正确性的代码评测数据集。同等参数量级的基座模型中,Aquila-7B 在 HumanEval(Python)代码生成评测中名列前茅,Pass@1 和 Pass@100 得分均超越了 Meta 近期开源的Llama2-7B。
表1:基座模型Base model HumanEval 评测结果,评测数据结果来自公开技术报告。
Python语言生成模型AquilaCode-py,HumanEval(Python)排名领先。
基于Aquila-7B基座模型强大的生成能力,AquilaCode在Aquila-7B基础上使用经过高质量过滤且有合规开源许可的代码数据进行训练。尽管其代码训练数据量约为其他开源代码生成模型的10~40%,但依靠小规模高质量训练数据,AquilaCode实现了更高的性能,再一次验证了“质重于量”的训练原则。
在同等参数量级的开源代码模型中,AquilaCode-py 在各项指标上排名第二,仅次于 Salesforce 发布的 CodeGen2.5-7B-mono。
以Pass@1为例,AquilaCode-py-7B 和 AquilaCode-multi-7B 的准确率分别达到了28.8%和26%,接近或超过了参数量更大的 CodeGen-mono-16B。
表2:HumanEval 评测结果,其他模型评测数据来自公开技术报告
代码生成能力展示
AquilaCode-multi 多语言代码生成展示:
评测问题:Check if in given list of numbers, are any two numbers closer to each other than given threshold.
AquilaCode-multi不但可以准确补全 Python、C++、Java、JavaScript、Go 语言代码,且补全后的代码可以成功运行。
Python 语言输入:
from typing import List
def has_close_elements(numbers: List[float], threshold: float) -> bool:
""" Check if in given list of numbers, are any two numbers closer to each other than
given threshold.
>>> has_close_elements([1.0, 2.0, 3.0], 0.5)
False
>>> has_close_elements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)
True
AquilaCode-multi 多语言代码生成模型返回的的答案:
for i in range(len(numbers) - 1):
for j in range(i + 1, len(numbers)):
if abs(numbers[i] - numbers[j]) < threshold:
return True
return False
C++ 语言输入:
/*
Check if in given vector of numbers, are any two numbers closer to each other than
given threshold.
>>> has_close_elements({1.0, 2.0, 3.0}, 0.5)
false
>>> has_close_elements({1.0, 2.8, 3.0, 4.0, 5.0, 2.0}, 0.3)
true
*/
#include<stdio.h>
#include<vector>
#include<math.h>
using namespace std;
bool has_close_elements(vector<float> numbers, float threshold){
Java 语言输入:
import java.util.*;
import java.lang.*;
class Solution {
/**
Check if in given list of numbers, are any two numbers closer to each other than given threshold.
>>> hasCloseElements(Arrays.asList(1.0, 2.0, 3.0), 0.5)
false
>>> hasCloseElements(Arrays.asList(1.0, 2.8, 3.0, 4.0, 5.0, 2.0), 0.3)
true
*/
public boolean hasCloseElements(List<Double> numbers, double threshold) {
AquilaCode-multi 多语言代码生成模型返回的的答案:
if (numbers.size() < 2) {
return false;
}
Collections.sort(numbers);
for (int i = 0; i < numbers.size() - 1; i++) {
if (Math.abs(numbers.get(i) - numbers.get(i + 1)) < threshold) {
return true;
}
}
return false;
}
}
JavaScript语言输入:
/* Check if in given list of numbers, are any two numbers closer to each other than
given threshold.
>>> hasCloseElements([1.0, 2.0, 3.0], 0.5)
false
>>> hasCloseElements([1.0, 2.8, 3.0, 4.0, 5.0, 2.0], 0.3)
true
*/
const hasCloseElements = (numbers, threshold) => {
AquilaCode-multi 多语言代码生成模型返回的的答案:
const sorted = numbers.sort((a, b) => a - b);
for (let i = 0; i < sorted.length - 1; i++) {
if (Math.abs(sorted[i] - sorted[i + 1]) < threshold) {
return true;
}
}
return false;
};
Go 语言输入:
import (
"math"
)
// Check if in given list of numbers, are any two numbers closer to each other than given threshold.
// >>> HasCloseElements([]float64{1.0, 2.0, 3.0}, 0.5)
// false
// >>> HasCloseElements([]float64{1.0, 2.8, 3.0, 4.0, 5.0, 2.0}, 0.3)
// true
func HasCloseElements(numbers []float64, threshold float64) bool {
AquilaCode-multi 多语言代码生成模型返回的的答案:
for i := 0; i < len(numbers)-1; i++ {
for j := i + 1; j < len(numbers); j++ {
if math.Abs(numbers[i] - numbers[j]) < threshold {
return true
}
}
}
return false
}
- VS Code AquilaCode 插件,辅助开发者编写程序
在 AquilaCode 辅助下,开发者可在 2 分钟内完成 FastAPI 的“列表”、“详情”、“修改”、“删除”等功能接口代码编写,实现成功运行,且可以从浏览器访问。
在 AquilaChat 对话模型中集成 AquilaCode,增强代码生成能力
AquilaChat 对话模型中定义了可扩展的指令规范,开发者可以将 AquilaCode 模型集成至对话模型中,实现“自然语言文本”到“代码”的生成。
开发者使用指南
智源 FlagAI 仓库中提供了详细的使用方式。推理、预训练、集成至 VSCode 的方法。
尤其值得推荐的是,开发者可以使用 AquilaCode 进行推理和预训练并集成至 Visual Studio Code 扩展,通过AquilaCode 模型来定制自己的代码助手“Copilot”,提升代码编写效率。
更多信息请查看 README 文档:
https://github.com/FlagAI-Open/FlagAI/tree/master/examples/Aquila/Aquila-code