大模型代替程序员来编写代码,这是一个非常有趣的话题,也是一个非常具有挑战性的任务,因为编写代码不仅仅是逻辑的表达,还涉及到了对环墫的依赖,对资源的管理,对错误的处理等等,这些都是大模型在生成代码时需要考虑的问题,目前,大模型作为编程的辅助工具,例如 Github Copilot, 或是当红的 Cursor, 可以在块级别,函数级别,甚至是文件级别生成代码,但基本上还是需要程序员的监督,对其生成的代码进行检查,修改,完善,才能真正的投入到生产环境中。
如果想让大模型产生代码生产可用,一个可能的方法是建立低代码工具,让大模型专注于逻辑的生成,而不用考虑环境的依赖,这与给人类使用的低代码工具是类似的,相对于人类,大模型不会抱怨编写低代码的无聊和繁琐。
测试方法
为了检测大模型的编程能力,我们通过让不同的大模型模型根据相同的 prompt
来生成代码,然后运行这些代码,检测代码的运行结果是否符合预期,这个过程会重复若干次,来检测其生成的稳定性。
我们使用了 a2a
(powered by Rust, 暂未开源) 这个专为大模型定制的低代码工具,它简化了对工作环境的依赖,封装了程序对数据库、文件、网络等资源的访问,使得大模型可以专注于逻辑代码的生成,而无需在环境搭建上花费更多的注意力,因为如果不限定环境,大模型生成的代码将非常的个性化,几乎不具备实际运行的可能。
测试逻辑
我们让大模型根据以下的逻辑 prompt
来生成代码,这是一段简单的逻辑,但是涉及到了数据库的操作,文件的读取,以及数据的处理,在阅读了其中的主要函数 doAction
的定义之后,人类编写这个逻辑的代码是非常简单的。
请使用配置中的 'dbconn' 连接数据库, 然后创建一个数据表 'test_users', 包含以下的字段
- id: 整数, 主键, 自增
- name: 字符
- age: 整数
- updated_at: 时间戳, 默认当前时间
从配置的 'datasrc' 数据文件连接读取数据,这是一个 CSV 文件, 包含两列 'name' 和 'age'
将读取到的数据插入到 'user' 表中
然后在数据表中查询 'age' 在 40 和 50 之间的记录, 作为最终的结果返回
最后,删除掉数据表 `test_users`
正确的代码
// 本代码由 gpt-4o 生成
async function main(config, params) {
// 创建测试表 'test_users'
const createTableAction = {
kind: "sql",
connection: config.dbconn,
query: `
CREATE TABLE test_users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
`,
};
await doAction(createTableAction);
// 读取 CSV 文件中的数据
const readFileAction = {
kind: "file",
method: "READ",
path: config.datasrc,
};
const fileResult = await doAction(readFileAction);
// 解析 CSV 数据并准备插入
const insertRows = fileResult.map((row) => [row.name, row.age]);
const insertDataAction = {
kind: "sql",
connection: config.dbconn,
query: "INSERT INTO test_users (name, age) VALUES (?, ?)",
rows: insertRows,
};
await doAction(insertDataAction);
// 查询 'age' 在 40 和 50 之间的记录
const queryDataAction = {
kind: "sql",
connection: config.dbconn,
query: "SELECT * FROM test_users WHERE age BETWEEN 40 AND 50",
};
const result = await doAction(queryDataAction);
// 删除测试表 'test_users'
const dropTableAction = {
kind: "sql",
connection: config.dbconn,
query: "DROP TABLE test_users",
};
await doAction(dropTableAction);
// 返回查询结果
return result;
}
测试结果
模型 | 总次数 | 成功次数 | 成功率 | 首 Token 时间 | 所有 Token 时间 | 大概费用 |
---|---|---|---|---|---|---|
gpt-4o | 14 | 14 | 100% | 1019 | 4741 | ¥0.108 |
anthropic.claude-3-5-sonnet-20240620-v1:0 | 14 | 14 | 100% | 1260 | 11759 | ¥0.087 |
glm-4-plus | 14 | 14 | 100% | 538 | 19054 | ¥0.200 |
gpt-4o-mini | 14 | 13 | 93% | 611 | 6768 | ¥0.004 |
qwen-plus | 14 | 13 | 93% | 716 | 19355 | ¥0.012 |
qwen-max | 14 | 13 | 93% | 823 | 23837 | ¥0.120 |
qwen-long | 14 | 11 | 79% | 848 | 16807 | |
gemini-1.5-pro | 14 | 10 | 71% | 1447 | 9314 | ¥0.076 |
gemini-1.5-flash | 14 | 9 | 64% | 812 | 3103 | ¥0.001 |
anthropic.claude-3-haiku-20240307-v1:0 | 14 | 8 | 57% | 617 | 6794 | |
anthropic.claude-3-sonnet-20240229-v1:0 | 14 | 5 | 36% | 1335 | 16807 | |
gemma2-9b-it | 14 | 3 | 21% | 485 | 1277 | |
qwen-turbo | 14 | 3 | 21% | 580 | 15418 | |
deepseek-coder | 14 | 3 | 21% | 629 | 26133 | |
llama-3.1-70b-versatile | 14 | 2 | 14% | 1502 | 3195 | |
Doubao-pro-32k | 14 | 1 | 7% | 599 | 20205 | |
glm-4-flash | 14 | 1 | 7% | 579 | 31949 | |
mixtral-8x7b-32768 | 14 | 0 | 0% | 448 | 1498 | |
Doubao-lite-32k | 14 | 0 | 0% | 334 | 16185 |
结果分析
即便是对于这种几乎不依赖于环境,仅考察逻辑能力的代码生成任务,大模型的表现也是参差不齐,本次测试中,对大模型输入的 Token 大概是 1.5k 左右,代码产出的的 Token 大概是 0.5k 左右,所需费用以此来进行预估计算。
第一梯队
gpt-4o
在 14 次测试中全部成功,平均每次生成代码的时间在 4.7秒左右,这是个非常好的表现。anthropic.claude-3-5-sonnet-20240620-v1:0
也是 14 次全部成功,平均每次生成代码的时间在 11.7秒,时间较长,但是成功率很高。glm-4-plus
也是 14 次全部成功,平均每次生成代码的时间在 19秒,时间较长,是国产模型中表现最好的。
第二梯队
gpt-4o-mini
13 次成功,平均每次生成代码的时间在 6.7秒,成功率略低,但是速度快,而且 gpt-4o-mini 非常便宜,性价比很高。- 通义千问家族的表现,除了 turbo 之外,成功率都在 90% 以上,也是国产模型中表现不错的。
第三梯队
gemini-1.5-flash
9 次成功,平均每次生成代码的时间在 3.1秒,成功率较低,但是速度快,而且 gemini-1.5-flash 也是非常便宜的模型。可以考虑带着错误再次生成,整体的性价比还是很高的。
评论区
写评论有没有测rust水平的,可能是数据少,感觉幻觉挺多的