[通义灵码]应用实战
在首次打开新的项目时,通义灵码会自动创建项目的文件索引,此后每次文件保存时,都会触发单个文件增量的索引更新。目前,通义灵码每天推荐代码超 3000 万次,被开发者采纳代码行数超亿行,Gartner发布业界首个AI代码助手魔力象限,全球共12家企业入围,阿里云通义灵码在产品功能和市场应用等方面表现优秀,成为唯一进入挑战者象限的中国科技公司。由于通义灵码的智能问答场景,使用的模型参数会比代码补全模型的
通义灵码是由阿里云和通义实验室联合推出的一款基于通义大模型的智能编码辅助工具,它具备代码智能生成和研发智能问答等多项功能,旨在帮助开发者提高编码效率和代码质量。
据官方信息,通义灵码插件下载量突破400万!目前,通义灵码每天推荐代码超 3000 万次,被开发者采纳代码行数超亿行,Gartner发布业界首个AI代码助手魔力象限,全球共12家企业入围,阿里云通义灵码在产品功能和市场应用等方面表现优秀,成为唯一进入挑战者象限的中国科技公司。
通义灵码支持 JetBrains IDEs、Visual Studio Code、Visual Studio,及远程开发场景(Remote SSH、Docker、WSL、Web IDE),安装后登录阿里云账号即可开始使用。
1. 快捷键如何使用
1.1 快捷键的使用
通义灵码的许多操作有开箱即用的快捷键,以下是比较常用的几项:
另外,在通义灵码的问答面板里,可以使用 Cmd+Enter(Macos/Linux) 或 Ctrl+Enter(Windows)在输入问题时换行(直接按下 Enter 回车键会直接发送当前提问内容给模型)。
备注说明:更换生成结果快捷键会提高生成的多样性参数(temperature),有时能生成更长或更发散的内容。
1.2 自定义快捷键
JetBrains IDE 的快捷键设置方法。打开菜单栏的 Settings(设置)页面,左侧点击 Keymap(快捷键),然后找到 Plugins -> TONGYI Lingma 子项,展开即可查看和编辑快捷键。
VSCode 的快捷键设置方法。点击IDE左下角的设置图标,点击键盘快捷方式菜单,在页面中搜索 TONGYI Lingma 即可查看和编辑所有快捷键。
备注说明:为了便于识别,VSCode 的大部分通义灵码快捷键都是以 TONGYI Lingma 命名的,但触发内联建议、显示上一个/下一个内联建议快捷键复用了已经存在系统级功能项,因此命名风格上稍有差异。
2. 配置的运用
2.1. 进入配置面板
JetBrains IDE 的配置面板在设置页面的顶级菜单 TONGYI Lingma 板块,可以通过点击状态栏的通义灵码小图标,选择“高级设置”项快速打开。
VSCode 的配置面板同样可以从状态栏右下角的通义灵码图标点击“高级设置”进入。
2.2. 常用配置项
2.2.1. 按文件类型禁用自动补全
若某些类型文件的自动补全结果较为打扰,可将该文件后缀类型添加到列表中,多种尾缀之间使用英文逗号分隔,例如:txt,md
JetBrains IDE 配置区域
VSCode 配置区域
备注说明:禁用特定文件类型的补全功能主要是禁用自动补全触发,若在文件内使用快捷键手工触发补全(默认快捷键位 Alt+P),依然能够使用大模型的内容自动续写生成的功能。
2.2.2. 下拉提示时保留补全结果
默认情况下,当 IDE 有基于语法的下拉补全提示时,通义灵码会自动停止展示大模型补全内容,避免视觉上的冲突。
若希望通义灵码总是生成大模型补全,可以勾选该配置项,效果如下图所示,此时按下 Tab 键将会采纳大模型的生成结果:
JetBrains IDE 配置区域
VSCode 配置区域
2.2.3. 生成长度控制
通义灵码支持将自动触发和手工触发的代码续写能力分别设置生成长度参数。通常建议将手工触发(默认快捷键 Alt+P) 设置得比自动触发稍长。
JetBrains IDE 配置区域
VSCode 配置区域
备注说明:这个配置项只是设置模型允许生成的最大长度,若模型某次补全生成的内容长度原本就较短,通过修改此配置并不能让模型生成的内容变长。
3. 代码注释的运用
3.1. 通过注释引导补全生成
在没有额外注释引导的情况下,模型只能根据当前代码的上下文,以及项目内引用和查找到的相似代码来猜测接下来可能要编写的内容。当模型的猜测不准确时,可以尝试通过增加代码的方式来引导模型接下来应当实现什么代码。
例如在这段代码里,模型首先猜测了一个 CHAT_CONTEXT 字段,但这并非我们期望的内容:
接下来,我们增加一行注释,告诉模型下一个字段是历史记录,再次换行模型生成了符合预期的字段和相应的数据填充代码:
3.2. 使用描述生成方法
通过“编辑区的代码注释引导补全”或“使用通义灵码问答面板”都能实现基于注释生成整个方法的目的。由于通义灵码的智能问答场景,使用的模型参数会比代码补全模型的参数量更大,因此,对于这类场景,通常更推荐在问答面板里直接提出需要生成的问题描述。
如果针对期望生成的语言或方法签名(方法名、参数类型、返回值类型)有特殊要求,可以在提问的时候将方法签名预先描述好。例如:
4. 跨文件索引的运用
4.1. 及时保存文件,更新索引
通义灵码的跨文件索引是抑制代码幻觉的重要机制。通过自动找到当前上下文用到的类型和方法定义,模型能感知到项目里其他文件里的类型具有哪些成员,方法具有哪些参数。
在首次打开新的项目时,通义灵码会自动创建项目的文件索引,此后每次文件保存时,都会触发单个文件增量的索引更新。然而由于 IDE 里的文件通常存在内存缓存,在刚刚编写完一个文件,切换到另一个文件时,可能因为本地索引尚未更新,导致无法感知新增加或修改过的内容,依然按照原本类型结构进行推理。
例如在某代码项目中,我们给 Pet 对象,新增加了一个saleable 属性。
然后切换到另一个文件,尝试让大模型进行补全,但是模型推理出的逻辑使用的却是另一个不太相关的字段。
若要消除这种信息差异,可在编辑完前一个文件时,主动按下文件保存(快捷键Ctrl+S),再继续编辑其他文件,生成的内容就能正确引用到修改过的对象结构了。
4.2. 针对MyBatis 场景的优化
除了 Java、Python、JavaScript 等主流语言项目的跨文件引用,通义灵码还支持在编写 MyBatis 的 xml 文件时自动感知 Mapper 对象上引用的表结构类型。例如在编写如下insert 语句时,插件会利用当前项目中的 TexiOrder类型信息,确保生成的每个字段都是正确的。
5、实战结果
prompt: 用PHP编写一个 身份证号码有效性的校验函数,并编写一段测试代码,测试用例需要有边界值、异常数据等
function validateIDNumber($idNumber) {
// 基本格式校验
if (!preg_match('/^\d{17}[\dXx]$/i', $idNumber)) {
return false;
}
// 地区码验证
$areaCodes = [
'11', '12', '13', '14', '15', '21', '22', '23', '31', '32', '33',
'34', '35', '36', '37', '41', '42', '43', '44', '45', '46', '50',
'51', '52', '53', '54', '61', '62', '63', '64', '65', '71', '81',
'82', '91'
];
$areaCode = substr($idNumber, 0, 2);
if (!in_array($areaCode, $areaCodes)) {
return false;
}
// 校验码验证
$weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
$checkDigits = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
$sum = 0;
for ($i = 0; $i < 17; $i++) {
$sum += intval($idNumber[$i]) * $weights[$i];
}
$checkDigit = $checkDigits[$sum % 11];
if (strtoupper($idNumber[17]) !== $checkDigit) {
return false;
}
return true;
}
function testValidateIDNumber() {
// 正常数据
echo validateIDNumber("110101199003074578") ? "Pass" : "Fail", "\n"; // 正确
echo validateIDNumber("310101199003074578") ? "Pass" : "Fail", "\n"; // 正确
// 边界值
echo validateIDNumber("110101199003074570") ? "Pass" : "Fail", "\n"; // 错误(校验位错误)
echo validateIDNumber("11010119900307457X") ? "Pass" : "Fail", "\n"; // 正确
// 异常数据
echo validateIDNumber("11010119900307457") ? "Pass" : "Fail", "\n"; // 错误(长度不足)
echo validateIDNumber("11010119900307457XX") ? "Pass" : "Fail", "\n"; // 错误(长度过长)
echo validateIDNumber("11010119900307457a") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("11010119900307457A") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("11010119900307457Z") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("11010119900307457z") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074579") ? "Pass" : "Fail", "\n"; // 错误(校验位错误)
echo validateIDNumber("1101011990030745789") ? "Pass" : "Fail", "\n"; // 错误(长度过长)
echo validateIDNumber("110101199003074578 ") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578!") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578,") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578.") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578?") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578@") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578#") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578$") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578%") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578^") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578&") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578*") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578(") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578)") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578[") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578]") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578{") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578}") ? "Pass" : "Fail", "\n"; // 错误(非法字符)
echo validateIDNumber("110101199003074578|") ? "Pass" : "Fail", "\n"; // 错误(非法字符
更多推荐
所有评论(0)