本文作者:plzpj6bp7mjr4,内容选自通义灵码超级个体创新实践大赛,并对部分内容做了微调,感谢作者分享的最佳实践!
最近,阿里的开源大模型刷屏了,我一直都是通义的用户,也本地部署过 Qwen 系列模型,自己也是 AI 代码助手的高度依赖用户,同时也是 AI 项目的开发者。
Qwen 开源模型在开源榜单上大杀四方,所以不得心生几分好感,通义灵码底层基于 Qwen2.5 最新模型,代码补全和问答能力全面升级。
正好最近我正在开发一款开源桌宠软件,链接地址如下:
https://github.com/jihe520/Desktop-Pet-Godot
项目简介:🤖👾🐶一款由大语言模型驱动、Godot 制作的 AI 桌宠,旨在提供一个全能的、丰富的桌面 AI 宠物。
项目使用的是开源的 Godot 游戏引擎,使用的语言是自带的 gdscript,语法类似 Python 但是和游戏引擎绑定更紧密,这个项目对 Copilot 来说,还是有很多难度。
因为该语言语法 API 变化快,godot3 和 godot4 的语法发生大变化,许多 LLM 都是给的 godot3 淘汰的语法,不能给出最新的语法,该语言也比较小众,缺少训练资料,让我来测测通义灵码能力。
难点:
- 更好的泛化能力,对小众语言学习能力强
- 对整个大项目理解程度高
- 训练数据集是否及时更新,能否适应语法 API 的更新变化
以上考察的难点,也是我最关心的点,也算是技术难点吧。
废话少说,接下来开始使用。
首先,我在 VSCode 里装上通义灵码插件,操作很简单,点击扩展-搜索 Tongyilingma,点击下载安装即可。
项目结构
为方便演示,我先让通义灵码整体认识我的项目,这里我使用的是通义灵码本地工程问答能力 @workspace。
当你需要快速了解一个工程、查找工程内的实现逻辑,或有新诉求需要进行代码变更时,可以在通义灵码智能问答窗口中通过@ 可唤起 @workspace,选中后输入你的问题或诉求,通义灵码可快速结合当前仓库进行工程理解、代码查询、代码问答等,同时可以通过自然语言描述需求,结合当前工程生成简单需求或缺陷的整体修改建议和相关建议代码。
@workspace 怎么用?
1)快速上手熟悉新的代码工程
可以询问当前项目的任何细节,如“项目的结构和功能是什么?”,“订单管理的代码实现在哪”,“如何构建和运行当前项目”。与灵码对话,消除陌生感,快速上手新项目。
2)头脑风暴,协助实现新需求
可以结合当前代码工程,分析用户的需求问题,提供实现代码或头脑风暴。如“如何增加用户鉴权逻辑”,“实现一个功能,批量添加我的收藏里的商品到购物车”,“增加删除文章的接口,包含后端 controller,service,mapper前端 vue 的变更”等,让灵码快速提供解决方案及代码。
解释代码
我忘记了 Globals.gd 里面的逻辑关系,我便让通义灵码给我解释下,它出乎我的意料,还给出了相关流程图,帮助我更好的理解。开发者用通义灵码可以提高代码理解和调试效率,简化复杂代码、提高协作效率、节省时间。
通义灵码支持代码逻辑可视化,可以把你的每段代码画成流程图,帮助程序员清晰地展示代码逻辑、业务流程、系统架构,还可以绘制时序图、类图、状态图等。通过简单的文本描述生成图表,更直观地展示代码结构、流程和关系。
30秒!用通义灵码画 SpaceX 星链发射流程图
解决 bug
bug 1:保存预设时候,每次按钮会成倍添加
代码如下:
extends Control
@onready var presets_container: GridContainer = %PresetsContainer
const PRESET_PANEL = preload("res://send/store_preset/preset_panel.tscn"
func _ready() -> void:Globals.add_new_preset_panel.connect(_load_presets)_load_presets()
func _load_presets():for preset in Globals.presets:var preset_panel : PresetPanel = PRESET_PANEL.instantiate()preset_panel.panel_type = PresetPanel.PanelType.PresetTypepreset_panel.label_name = presetpreset_panel.preset = Globals.presets[preset]presets_container.add_child(preset_panel)
出现问题,第一时间找到通义灵码向他提问,他会快速分析问题,并很快给出了优化后的代码!
优化代码如下:
func _load_presets():# 清除现有的预设面板for child in presets_container.get_children():if child is PresetPanel:child.queue_free()for preset in Globals.presets:var preset_panel : PresetPanel = PRESET_PANEL.instantiate()preset_panel.panel_type = PresetPanel.PanelType.PresetTypepreset_panel.label_name = presetpreset_panel.preset = Globals.presets[preset]presets_container.add_child(preset_panel)
通义灵码非常聪明,帮我排查出问题并给出解决措施。通义灵码正确使用了 gdscript 最新的 API,具有很好的泛化能力和学习能力。 并且还在清除前做了个判断,保证代码的健壮性。
bug 2:当点击发送按钮,大模型没有返回内容
首先怀疑是请求模型的数据没有正确加载,我点击按钮时候发现,没有反应,我就让 通义灵码帮我打印一些信息出来,方便调试。发现填写的 API 和数据结构错误,很快的解决了。
不得不说,通义灵码的补全速度很快 , 比 Copilot 快两倍以上,这点对写代码很重要。
结尾
最后,我有个非常困难的需求:使用 github action 将项目自动化打包。我本人也不是很懂这个 github action。
对于这类不是我此前接触过的新问题,我交给通义灵码,他快速拆解了解决问题的步骤,并给出了示例代码,很快代码跑起来,完成!