< 返回版块

elsejj 发表于 2024-09-08 09:32

大模型代替程序员来编写代码,这是一个非常有趣的话题,也是一个非常具有挑战性的任务,因为编写代码不仅仅是逻辑的表达,还涉及到了对环墫的依赖,对资源的管理,对错误的处理等等,这些都是大模型在生成代码时需要考虑的问题,目前,大模型作为编程的辅助工具,例如 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 也是非常便宜的模型。可以考虑带着错误再次生成,整体的性价比还是很高的。

评论区

写评论
lithbitren 2024-09-13 23:23

有没有测rust水平的,可能是数据少,感觉幻觉挺多的

1 共 1 条评论, 1 页