作者:六月的雨在钉钉
前言
随着科技的发展,AI编程,或者说是AI辅助编程,已经成为了每一位程序员的福利。今天我们要说的AI程序员,相对于传统的AI辅助编程工具, AI 程序员具备多文件代码修改(Multi-file Edit)和工具使用(Tool-use)的能力,可以与开发者协同完成编码任务,如需求实现、问题解决、单元测试用例生成、批量代码修改等。
AI程序员
比如这我想要 AI 程序员帮我把启动成功时打印的图案换成一个比较有意思的图案,输入我的需求:【帮我把启动成功的打印内容更换为 心的形状】。
点击【接受】之后,AI程序员会自动将更新后的内容替换到指定位置,替换之后我们再来启动项目看一下效果。
是不是很方便?AI 程序员可以直接帮助你生成你想要的,并且你根据变更内容的对比后的结果来决定是不是要接受变更。接受变更,则 AI 程序员会将需要替换的代码自动替换到指定位置,省去了我们过去需要点击通义灵码对话框右上角【复制】按钮来复制并自己手动替换代码的操作,更加方便快捷。
这里只是简单在对 AI 程序员介绍时引入一个小例子,方便大家直观的来观测到AI程序员的效果。下面我们来开始我们今天的操作,来让AI程序员帮我们开发一个新需求。
插件安装or升级
在进行业务功能开发之前,考虑到一些小伙伴的开发工具IDEA 可能还没有安装通义灵码插件,或者是安装的通义灵码插件还没有升级到 2.0版本,那么这里简单介绍一下IDEA 开发工具如何安装通义灵码插件。
打开 IntelliJ IDEA 开发工具,点击【File】-【Settings】,在打开的设置窗口,点击【Plugins】,在插件市场中搜索 TONGYI Lingma,找到通义灵码后单击安装。这里我已经安装过了,当然,如果你安装的是通义灵码 1.0 版本的话,那么这里会有对应的 【Update】按钮,点击升级即可。
如果在IDEA 开发工具插件市场搜不到通义灵码插件,可以采用其他的安装办法,具体的安装操作可以参考官方文档:通义灵码下载安装【1】。这里需要注意的是,安装成功之后需要重启 IDEA 开发工具,重启成功之后,会有对应的提示登录页面,按照提示登录阿里云账号即可。
业务功能开发
到这里的话,基本的准备工作也就完成了,下面我们就开始今天的业务需求开发。
业务需求
有这样一款 CMS 管理系统,那么我们想要给这个 CMS 管理系统增加一个公告管理的功能,需要这个公告管理功能可以新增,修改,删除,发布,取消发布公告,在公告管理列表页可以点击公告标题跳转到公告详情页等。整体的需求就是这么多,具体的细节在开发过程中再优化。
关于业务需求的实现,通常会按照如下的流程进行:
设计表结构--功能开发--本地测试(单元测试)--测试环境部署测试--功能上线
本文主要是讲解的基于AI程序员的功能代码实现,因此这里主要进行到本地测试(单元测试)阶段,后面的测试环境及功能上线暂不涉及。
设计表结构
通常情况下,表结构是我们根据具体的业务功能,设计具体的字段及字段属性,那么这里我们来使用AI程序员设计一下表结构看下体验如何。
输入我们的具体需求:【帮我设计一张表 公告相关,主要包含字段:公告标题、公告内容、发布状态、发布时间、是否有效、创建时间、创建人、更新时间、更新人】,以下是具体的生成效果,为了表名统一,我继续提出需求更改了表名:【更改表名为 sys_cms_notice】。
将生成的表结构复制到 mysql 命令执行工具 navicat 里面新建查询执行建表语句,执行成功,这说明 AI 程序员生成的 mysql 表结构没有任何问题,不用人工修改就可以直接使用。
功能开发
下面我们再继续来生成具体的业务逻辑,包括 controller控制层、service接口层、service实现类、mapper层、domain实体类、mybatis的xml语句,那么我们将需要的内容整合后给出我们的需求:
【帮我生成 sys_cms_notice 表的controller控制类、service接口类、service实现类、domain实体类、mapper接口类、mybatis的xml查询文件,需要包含 新增、修改、删除、发布功能】
在AI程序员生成具体的代码之后,我们可以在工作区通过点击切换具体的文件名来查看文件变更内容,这里可以看到我们需要的新增、修改、删除、发布功能,以及默认的列表查询功能都有了,那么我们点击【接受】接受所有文件。
点击右侧顶部的【接受】可以一键接受所有生成的文件,但是接受的文件并不是放在我们项目现有结构对应的位置,因为这里也暂时无法指定接受后选择的文件夹目录,这一点不太方便,但是还好,只是需要人工再调整一下位置就可以。因此可以接受后再手工调整一下位置就可以了,自动接受后的结构如图:
按照上图的目录结构将具体的代码移动到对应的位置后,我们再次生成这次功能需要用到的前端页面,其实对于Java 开发者来说,画页面往往是最费劲的,毕竟不是专业的前端,如果AI程序员可以直接生成前端的新增页面、修改页面、列表页面就会方便很多了,开发效率也会大大提升。最终使用【基于 sys_cms_notice 生成 新增、修改、列表 的 html 页面】,完成了页面的生成。
这里需要注意,在生成页面的时候,AI 程序员会同时生成一些不是我们想要的内容,比如工作区的 mapper.xml 、java 文件这些,不是本次生成的内容不要【接受】否则会让原来已经接受的文件乱了。
逐个接受我们需要的三个页面之后,同样的将页面调整到规定的目录文件夹下。但是这里生成的页面,跟实际项目中用到的统一风格的页面有一定的差异,考虑到为了页面风格的统一,那么我可以采取先选择参考文件,然后基于参考文件的方式来生成页面。
比如这里我首先生成公告管理的 add.html,那么我选择项目中原有 post 岗位 的add.html ,这里交给大家一个小窍门,可以点击选择文件的【+】,在弹出的搜索框中输入需要搜索的文件名,然后选择文件,同样的方法我在选择我们生成的公告管理的 domain 实体类,然后输入需求:【参考这个 add 页面生成一个 syscmsnotice 对象的 add 页面】。
这个时候再看,那么有了参考页面之后生成的新的 add.html 页面内容就和项目原来 add 页面的结构和风格比较一致了,这样也省去了再次重新调整页面风格的耗时。
同样的办法,我们重新更换参考页面,这次参考页面改为 edit.html ,同样的选择公告管理的 domain 实体类对象 SysCmsNotice.java 作为参考来生成 公告管理的 edit 页面,输入我们的需求:【参考这个 edit 页面生成一个 syscmsnotice 实体类的 edit 页面】。
等待edit 页面生成成功之后,我们再次接受当前 edit.html 页面,并将页面调整到 正确的目录下。
同样的方法,我们选择需要参考的列表页面 post.html,选择我们的公告管理 domain 下的实体类,输入需求:【参考 post 页面生成一个 syscmsnotice 实体类的 list 页面】,在生成的过程中也可能会遇到异常的情况,比如【生成过程超时】。
那么遇到这种情况的解决方案就是重新尝试一次,再次尝试一次果然可以正常返回了,同样的操作,接受当前页面并转移到正确的目录下,然后就可以进行后面的步骤了。
其实到这里,整个公告管理的功能基本上都已经开发完了,剩下的就是配置菜单,然后进行一些功能或者页面的优化调整,后面将继续进行功能优化。
功能优化
配置菜单的步骤这里不再细说,不同的项目配置菜单的方式也不太一样,另外这也不属于AI 程序员关注的内容,AI程序员主要是关注功能开发。
这里我们来逐个验证我们的AI程序员帮我们生成的类的代码是否符合业务需求,那么我们先来看一下controller 控制层的代码。
这里可以看到AI程序员确实帮我们生成了我们需要的新增、修改、删除、发布功能,但是没有生成页面跳转方法,也就是说如果想要新增数据,首先需要一个新增页面的跳转方法,然后才会是新增数据的提交,这里我参照上面页面的方式,同样选择一个项目中现有的 controller 方法作为参考来补充跳转页面的方法,提示词:【参考 SysPostController 帮我给 SysCmsNoticeController 补充 新增 、修改 、列表页面的跳转方法】。
这里需要说明的是,AI 程序员虽然参考现有的 controller 生成了页面跳转代码,但是AI程序员不会从整体把控,这里的页面路径前缀是不对的,需要人工修改。
另外就是最初生成的方法的返回与当前已有工程的风格也不一致,也是需要修改完善的地方。
并且还触发了一个代码规范的问题【不建议将代码注释写在代码后面,而应该是换行写】,人工处理掉小问题后,对于缺失的根据 id 查询数据的方法,可以通过快捷键的方式快速补全。随后我们启动项目查看具体的页面跳转效果。
页面效果
这里启动项目的时候发生了错误,那么选中具体的错误原因,右键【通义灵码一键解释】可以看到通义灵码对于当前启动异常的问题分析,我们根据分析来进行调整后就可以重新启动。
AI 程序员生成代码并且调试的过程会需要一些耐心,如果是新项目新功能,可能采纳率会高一些。
启动之后大概也就是这样的效果页面:
体验建议
对于通义灵码2.0,相对于通义灵码1.0版本来说,对于代码智能生成,以及对于自然语言的理解准确度都有了很大的提升。并且可以根据你的需求描述来生成对应的sql 表结构,以及基础的 controller 层、service层 、dao层、domain 实体类层生成代码,生成的代码准确度也有95%。
在这个过程中,AI程序员帮我生成的代码是没有问题,但是如果是做版本迭代开发的,AI程序员生成代码的能力是OK 的,生成的代码符合逻辑,不会报错。但是还需要看具体的业务场景。就像我生成的代码,没有页面跳转方法一样。同样在生成html 页面时,第一次生成的也确实是符合语法的页面,但是与现有的系统代码风格,页面风格完全不一样,不能直接用。而是要采用第二次基于当前项目中其他页面来生成当前的页面,这样才能有一个大致的可以用的页面。
我的感受是,AI程序员对于新功能生成的代码,如果放到现有的项目架构中,和现有的项目风格可能会不太一致,并且有的时候还不能直接用,就像生成的 controller 方法中没有页面跳转方法一样。如果当前项目的基础代码有直接的代码生成工具,建议还是使用代码生成工具来生成,更能符合当前工程项目的风格和功能。因此我在这里的感悟时,基于已有工程进行功能迭代的话,不建议进行大块的代码生成,而是可以基于部分代码的生成,这样代码生成的准确度会更高一些,也能更符合你的业务场景需求。
跨语言编程
个人作为一个 Java 开发者,前端页面的编写虽然也会用到,但是毕竟不是专业的。这里说的跨语言编程其实就是给当前的新增和修改页面增加一个可以调用百炼服务平台 DeepSeek 大模型服务生成公告内容,并将生成的公告内容放在编辑器中的操作,最后可以正常的保存到数据库。那么这里我首先在页面新增 add 一个字段,作为关键词的输入框,并且增加一个按钮,点击则调用百炼服务平台 DeepSeek 大模型来获取返回的内容放入公告中。
这里我对AI 程序员输入我的需求:【参考选中部分帮我重新生成一个字段输入框 用 多行文本的 文本框下面增加一个按钮 按钮名称为生成 选中部分不要变更】。
这里是AI 程序员基于我的需求生成的内容,先不说具体的内容,我直接来选择接受,看下以页面效果怎么样。选择接受后可以看到页面报错了,这个是因为在在生成多行文本的输入框时,多生成了一个基于上面参考部分代码的一个输入框,这里去掉之后再部署页面尝试。
最后实际是在现有的add 页面代码上增加如下代码:
<div class="form-group">
<label class="col-sm-2 control-label">关键词prompt:</label>
<div class="col-sm-10">
<textarea id="multiLineText" name="multiLineText" class="form-control" rows="4"></textarea>
<button type="button" class="btn btn-primary" style="margin-top: 10px;" onclick="genera();">生成</button>
</div>
下面我们再继续生成按钮的js 方法,同样的原理,选中可以参考的 ajax 代码然后利用通义灵码 2.0 的AI 程序员生成一个调用接口生成公告内容的方法,同时将生成的内容放在公告内容字段。
这里提出需求:【参考这段代码新生成一个js 方法,方法名是 gerena ,通过调用后端接口并将返回的内容放在 公告内容字段中】。
下面我们回到后端,补充对应的生成公告内容的方法,这里我们需要基于阿里云百炼服务平台的 DeepSeek-R1 调用来生成公告内容,登录百炼服务平台【2】。
首先获取API-KEY
然后选择【模型广场】,这里选择 【DeepSeek】-【DeepSeek-R1】
点击【API调用示例】在跳转页面找到 HTTP 调用,复制HTTP 调用的示例代码,放在AI 程序员帮我们生成一个调用的方法。
在通义灵码2.0 的AI程序员输入我们的需求,生成之后选择接受后,会在指定的位置生成我们具体的内容,输入需求内容:
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions -H "Authorization: Bearer $DASHSCOPE_API_KEY" -H "Content-Type: application/json" -d '{ "model": "deepseek-r1", "messages": [ { "role": "user", "content": "9.9和9.11谁大" } ] }' 生成java 示例代码
这里直接选择接受代码,接受代码之后我们在前端页面发起调用,但是这里对于这种富文本输入框,本身不太了解,也不会用,在 js 代码赋值的时候一直有问题,无法赋值,这里可以看到 console 控制台已经打印了 DeepSeek-R1 的返回内容,但是公告内容富文本框里面没有任何内容。
在尝试了多种赋值方式,包括 val() attr() = 等多种赋值方式没有成功,于是想到可以来问一下 AI 程序员,于是将js 代码中的赋值语句赋值到AI 程序员,选中赋值语句,提出问题:【$('.summernote').summernote('code') 如何赋值】 这时可以看到AI 程序员的具体分析以及提供的赋值语句,我直接选择接受后再尝试。
给富文本框赋值的操作终于成功了。
下面我提供一下新增页面【生成】 按钮的 js方法源码,以及生成按钮点击时调用的后端请求 阿里云百炼大模型服务平台 DeepSeek-R1 模型放回文本内容的代码都放在这里,有需要的可以复制使用。
【生成】按钮前端js 方法
// 新增 genera 方法
function genera() {
var multiLineText = $("#multiLineText").val();
if (!multiLineText) {
$.modal.alertWarning("请输入关键词prompt。");
return;
}
$.ajax({
type: "POST",
url: ctx + "system/notice/generateContent",
data: { multiLineText: multiLineText },
dataType: 'json',
success: function(result) {
if (result.code == web_status.SUCCESS) {
console.log(result.data);
$('.summernote').summernote('code', result.data);
} else {
$.modal.alertError(result.msg);
}
},
error: function(error) {
$.modal.alertWarning("生成内容失败。");
}
});
}
调用阿里云百炼大模型服务平台 的 DeepSeek-R1 的后端调用方法 system/notice/generateContent 的详细内容。
@PostMapping("/generateContent")
@ResponseBody
public AjaxResult generateContent(String multiLineText) {
String apiKey = "sk-f58bf46111222233355667777e18295d"; // 替换为实际的 Dashscope API Key
String url = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions";
// 构建请求体
JSONObject requestBody = new JSONObject();
requestBody.put("model", "deepseek-r1");
JSONArray messages = new JSONArray();
JSONObject message = new JSONObject();
message.put("role", "user");
message.put("content", multiLineText);
messages.add(message);
requestBody.put("messages", messages);
// 发送 POST 请求并处理响应
try {
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Authorization",apiKey);
connection.setRequestProperty("Content-Type", "application/json");
connection.setDoOutput(true);
try (OutputStream os = connection.getOutputStream()) {
byte[] inputBytes = requestBody.toString().getBytes(StandardCharsets.UTF_8);
os.write(inputBytes, 0, inputBytes.length);
}
// 获取响应
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String responseLine;
while ((responseLine = br.readLine()) != null) {
response.append(responseLine.trim());
}
JSONObject parse = (JSONObject) JSON.parse(response.toString());
JSONArray choices = parse.getJSONArray("choices");
StringBuilder sb = new StringBuilder();
for (Object choice : choices) {
JSONObject jsonObject = (JSONObject) choice;
JSONObject message1 = jsonObject.getJSONObject("message");
String content = message1.getString("reasoning_content");
sb.append(content);
}
System.out.println(sb.toString());
return AjaxResult.success("success",sb.toString());
}
} else {
return AjaxResult.error("Error: " + responseCode);
}
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("Exception: " + e.getMessage());
}
}
}
体验感受
对于通义灵码2.0 的跨语言编程能力,真的是太意外了,出乎意料的好用。 首先是生成的html 新的属性输入框,生成之后就可以直接用,符合我们的业务需求。在说对于输入框下面的生成按钮的方法,也是生成之后可以直接使用,只是在具体给富文本框赋值的细节没有考虑到,刚开始我一直无法赋值,后来多次尝试,就要放弃的时候试着问了一下 AI 程序员,没想到一次解决,出乎意料的惊喜。
再说后端基于百炼服务平台的模型广场 DeepSeek-R1的API示例中的 HTTP 调用示例生成 java 调用示例,也是一次生成可用,几乎没有什么改动,这些都特别好,真的是可以大大提高开发效率的。
单元测试
作为开发者来说,单元测试是保证代码功能性,保证代码健壮性的必要手段,对于新增的代码文件或者新增的 方法,我们都可以通过单元测试的方法来验证具体的功能是否满足我们的需求。比如这里我选择 今天有改动的文件 SysNoticeController 类,然后输入我们的需求:【生成单元测试】,AI 程序员会根据我们的需求。
在生成单元测试进行中的时候可能会遇到这样的情况,比如环境检查失败,那么我们可以点击具体失败项目后的【如何修复】,AI程序员会为我们提供具体的修复方案,按照修复方案完善后就可以再次进行 生成单元测试的操作了。选择需要生成单元测试的文件,输入生成单元测试。
错误排查
在日常开发过程中,肯定会遇到各种报错,或者是没有报错但是也没有获取正常数据,就像上面我们看到的一样,一直无法给富文本框正确赋值。我们可以直接询问AI程序员如何给对应的属性赋值。
或者是当我们在后台控制台看到错误信息时,我们同样可以将错误信息复制来询问 AI程序员如何解决。就像我们在上面增加了方法之后启动报错,可以根据具体的错误信息来询问 AI 程序员如何处理,最后也可以很快的得到自己想要的答案。
AI程序员对于错误排查及修复方面,可以说,只要你的错误信息详细,或者是你的描述详细,那么你都可以得到想要的结果。但是也有一种情况AI程序员没办法,那就是这个错误本身不会有什么错误信息,但是又不是正确的情况,这种情况不好描述自己想要怎么做,或者说自己不知道怎样询问AI 程序员才能得到自己想要的结果,这种情况下可能不太好处理。
通义灵码2.0 VS 1.0
对于通义灵码1.0版本,个人是从公测期开始申请使用的,整体上使用的感觉是功能比较简单,代码智能生成以及单元测试、自然语言问答等的功能都比较初级,在代码智能补全功能上,有一些块级的代码采纳率或者说生成的准确率并不是那么理想。
那么通义灵码2.0相对于 1.0 ,新增支持最新 Qwen2.5-Max 模型和 QwQ-plus 模型以及 DeepSeek 满血版 V3和R1模型,编程性能和效率均实现大幅提升,代码生成速度相较于过去明显感觉快很多。
并且丰富了支持的上下文类型,包括 #file、#codeChanges、#gitCommit、#teamDocs 和 #image 等,开发者可以灵活选择单个或多个文件进行提问,或针对工程的当前代码变更、Commit 进行提问和代码审查,显著提升问题解决的效率和准确性。
另外还新增 AI 程序员,具备多文件代码修改和使用工具的能力,可以帮助开发者端到端地完成一个编码任务,如需求实现、问题解决、单元测试用例生成、批量代码变更等,本文主要就是基于 AI程序员来进行的操作,包括基于已有工程的功能开发、跨语言编程、批量单元测试、错误排查修复等。
最后总结
到这里,整个关于通义灵码2.0 的AI 程序员的测评告一段落,整体上来说,AI 程序员基于已有工程的功能开发,或者说新功能迭代,整体上代码的生成准确度是不错的。只是生成的代码和现有工程的结构,风格,使用的各种jar 包的引入或者页面js 的导入往往不太一致,想要准确生成的话,还需要选择参考文件,然后告诉AI程序员 新生成一个这样的页面或者说方法,这样的话就能生成符合当前工程结构和风格的文件了。
对于跨语言编程来说,本文用的虽然不多,也就是在页面生成了一个同样风格的输入框,以及按钮的点击事件方法,以及后端的接口调用方法,但是体验感拉满。对于页面不显示的问题,也是通过 AI 程序员一次解决,特别好。后端基于百炼服务平台中 API 示例的HTTP 版本生成的 Java 示例版本也是生成就可以用,准确度,代码采纳率 99%。这点特别满意。
对于错误排查,这个在功能开发的过程中也用到过,总的来说错误排查及修复,也是很不错的功能,只要你能给出具体的错误信息,AI程序员就能帮你解决你的问题。但是有一点,对于自己无法描述的问题,模糊的咨询AI程序员,往往也不是太能得到准确回答。不过好在通义灵码2.0支持上下文了,也是可以通过一点点的提出问题逐渐靠近正确的描述的,总体还是很好的。
相关链接:
【1】通义灵码下载安装:
https://help.aliyun.com/zh/lingma/user-guide/download-the-ins...
【2】百炼服务平台:
https://bailian.console.aliyun.com/?spm=a2c6h.12873639.articl...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。