30 秒看懂
2023 年 4 月,Matthew Berman 在等待 GitHub Copilot X 使用资格期间试用 ChatGPT - Genie AI。他用 Rails 代码演示了解释、优化、查找问题和生成测试,并指出自己无法确认扩展能否看到整个代码库。
- 1六项代码操作Genie 提供测试、查找潜在问题、优化、解释、添加注释和补全代码等操作。
- 2解释状态机扩展解释了 Rails webhook 模型中的 AASM 状态和事件。
- 3缩短关联辅助代码建议的改写将示例从 45 行缩短至 21 行,但代码更短不能证明行为等价。
- 4生成测试其中一个建议测试比较关联公司的公开 ID 与通过客户对象获取的值。
- 5上下文范围仍不确定Berman 可以选择代码作为提示词输入,但没有验证扩展是否拥有整个代码库的上下文。
要点建议
- 该扩展提供快捷操作,可解释、优化、测试和补全选中的代码。
- 状态机解释和关联辅助代码重构展示了它在 Rails 代码上的工作流程。
- 生成的重构代码、测试和安全建议都需要人工审查并执行验证。
- 演示不能证明 Genie 可以访问整个代码库。
- 视频讨论的模型支持和可用性反映 2023 年 4 月的情况。
按章节阅读整理后的全文
安装 Genie AI
Berman 在等待 Copilot X 时介绍了这个扩展。他说明了自己在 2023 年观察到的 API 密钥要求和模型支持情况。
我已经使用 GitHub Copilot 很长时间,发现它为我节省了不少时间。在这期 2023 年 4 月的教程中,我一边等待刚刚宣布的 GitHub Copilot X 使用资格,一边探索一个 VS Code 扩展。我选择的 ChatGPT - Genie AI 能立即在我的 Ruby on Rails 项目中使用,而我试过的另一个扩展则不行。
当时 Genie 需要 OpenAI API 密钥,似乎支持 GPT-3.5。我预计它随后会支持 GPT-4,但这只是预测,而非我演示过的功能。安装后,打开 VS Code 侧边栏中的 Genie 图标。界面提供提示词输入框、温度选项、保存的快捷提示词,以及针对选中代码的六项操作。
解释 Rails 状态机
侧边栏提供对选中代码的操作。Genie 解释了一个使用 AASM 的 webhook 模型。

这些按钮分别用于添加测试、查找潜在问题、优化、解释、添加注释和补全代码。我觉得生成测试尤其有用。优化方面,我曾给它一段自己知道过于复杂的代码,得到了更短、更清晰且通过了我的测试的版本;但这次经验不能保证每次生成的修改都保留原有行为。
进入陌生代码库时,解释功能可以提供帮助:选择一个方法或文件,请它说明。我没有广泛测试注释生成器,也想知道随时请求解释会在多大程度上改变我们对注释的需求。代码补全则类似于 GitHub Copilot 已经提供的一项功能。
首先,我选择一个 Rails webhook 端点模型。它使用 AASM gem 管理 active、paused、archived 和 disabled 等状态。Genie 解释了状态机及其事件,我认为描述很准确。这个例子展示了一种理解陌生 Ruby 代码的方法,包括使用元编程的代码。
重构与发现问题
Berman 检查关联辅助代码,请 Genie 将其缩短,并审阅建议。提出的修改仍需要验证。
接着,我查看 AssociatedPublicIds 文件,它为关联模型创建公开 ID,使 API 不必暴露递增的数据库 ID。我选中代码,请 Genie 解释。它识别出返回关联记录公开 ID 的方法,这符合我的意图。

我请 Genie 优化这个文件。生成版本合并了相似的 has-many、belongs-to 和 has-one 逻辑,将画面上的代码从 45 行缩短到 21 行。我觉得它更清晰,但代码更短本身并不能证明行为等价:生成的修改仍需要审查和测试。
“查找问题”操作指出了几个可能的问题:如果类名来自用户输入,动态查找常量可能有风险;动态定义的方法可能增加维护难度;安全导航运算符需要 Ruby 2.3 或更高版本。我同意这段元编程可能过于花哨,也了解了这个版本限制。Genie 建议用 Module.const_get 作为更安全的替代,但仅仅更换接收对象并不能验证不可信输入;它的建议需要仔细审查。
测试、设置和上下文
生成的测试检查关联对象的公开 ID。Berman 探索温度预设与保存提示词,并说明他对代码库整体上下文的不确定性。

然后我选中代码,请 Genie 添加测试。其中一个生成的示例断言,客户的公司公开 ID 等于关联公司的公开 ID,这正是我期望的关系。生成的测试是一个有用的起点;演示展示了代码,并没有完整运行测试。
界面提供 Precise、Balanced 和 Creative 三种温度选项。温度会影响回答的变化程度;我猜这些预设可能对应零和 0.5 之类的值,但没有验证具体设置。星号按钮可以把自定义提示词保存为快捷项,例如要求编写测试的指令。
我最关心的是上下文。在界面中,我可以选择传给提示词的代码,但还没找到如何以整个代码库为上下文来提问。我猜 Genie 可能拥有更多项目上下文,同时也承认自己可能猜错了;视频没有证明它能够看到整个代码库。
我希望工具能回答涉及整个项目的问题,而不仅仅是打开的文件和选中的代码。即便有这个限制,我仍觉得这款扩展有用,也希望即将推出的 Copilot X 能解决其中一些不够完善的地方。
同频道的其他文章
34:21EN → 简体中文
0:26EN → 简体中文
0:36EN → 简体中文
0:21EN → 简体中文
25:50EN → 简体中文
32:20EN → 简体中文