让AI自主处理拉取请求

今天,我想分享一下我使用Cline 处理整个拉取请求(PR)而自己不碰代码的经历。

让AI自主处理拉取请求

今天,我想分享一下我使用Cline 处理整个拉取请求(PR)而自己不碰代码的经历。

1、规则

为了完成这个PR,我为自己设定了以下规则:

  • 只允许AI编写代码。不允许编辑AI生成的代码。
  • 尽可能多地使用Cline让AI处理一切。如果不起作用,则使用Copilot Chat。最后才考虑从ChatGPT的网页版本复制粘贴。
  • 允许自己运行命令,如格式化代码等。(自己运行命令更快。)

我为AI选择的任务是重构任务,统一整个代码库中不同开发者实现的模拟方法。

2、环境

我使用了原生的Cline VS Code扩展。

我尝试了以下两种模型:

  • vscode-lm:copilot/gpt-4
  • vscode-lm:copilot/gpt-4o

代码库是一个普通的Laravel应用。

3、优点

整个PR在不碰代码的情况下完成了。

这项任务完全通过提示完成。我不确定是否可行,但Cline做到了这一点。这与Copilot不同,在Copilot中,一旦写好提示,AI就会接手处理。

AI可以处理超出编写代码的任务。

Cline能够处理各种超出读写代码范围的任务。

以下是我要求它执行的一些任务:

  • 使用ripgrep查找重构点
  • 运行测试以验证代码的正确性,并修复错误
  • 格式化代码以保持一致的风格
  • 从git diff生成Git提交、注释和PR描述
  • 从实验期间记录的笔记中撰写博客文章(如本文!)

这些技术很有用,我计划在日常工作中使用它们。

4、缺点

最大的缺点是,老实说,感觉自己写代码更快更简单。

AI还不够聪明

这项任务相对简单,只是统一模拟方法的实现,但AI难以理解提示的意图和现有代码。它经常做出无关的更改或误解其含义。

此外,它还多次陷入无限循环,反复修复相同的错误。

另外,我不得不在提示中包含示例代码来展示正确的编写模拟方法的方式。这可能是因为许多PHP代码没有测试,所以AI缺乏足够的训练数据。

提示工程具有挑战性

与上述内容相关,需要进行提示工程才能正确传达你希望AI执行的操作。

这是我使用的提示,非常长且具体。

经过反复试验,我最终达到了这个版本。

我认为在编写这个提示所花费的时间内,我可以自己完成任务。

# 提示  
在tests/文件夹中,我希望统一如何实现模拟。  

# 规则  
- 存在使用mock()、Mockery::mock()或$this->mock()的情况。  
- 即使发现错误或改进也不要改变除mock()、Mockery::mock()或$this->mock()之外的内容。  

## mock()  
- 如果只有第一个参数,则保留mock()。  
- 如果有匿名函数作为第二个参数用于断言,请删除第二个参数并添加相应的行。  
- 模拟应如下所示,不带注释:  
$mock = mock(UserRepository::class); // 创建模拟。仅使用第一个参数  

$mock->shouldReceive('函数名') // 插入要模拟的函数名  
->with('预期输入') // 如果适用,插入预期参数  
->andReturn('预期输出') // 如果适用,插入预期输出  
->once();  

## Mockery::mock()  
- 更改为使用mock()并对其做相同操作  

## $this->mock()  
- 更改为使用mock()  
- 添加app()->instance()/app()->bind()将模拟绑定到被模拟的类  
- 尽量使用app()->instance()。但在实例化需要传递参数时,使用app()->bind()并传递一个匿名函数作为第二个参数。  

# 上下文  
- 这是一个Laravel应用,使用Pest作为测试库。  
- 它使用Mockery进行模拟。  
- 你可以通过运行`make test-unit && make test-feature`来验证测试是否通过。  
- 你可以通过运行以下命令检查$this->mock或Mockery::mock的使用情况:  
+ rg '\$this->mock' tests/  
+ rg Mockery::mock tests/  

代码生成相当慢

使用GPT-4时,实际的代码差异呈现花了相当长的时间。GPT-4o比GPT-4快一些,但有时也会停止生成代码。

另外,当文件本身很大时,即使只修改一行,AI也会生成整个文件。因此,在我的机器上,编辑500多行的文件失败了。

因此,在修改大文件的一部分时,有时使用Copilot Chat,它可以只显示差异,会更快。

这些点在正常编码时仍然令人沮丧,但我相信随着未来模型的改进,这些问题将会得到解决。

5、附录

以下是一些我发现有用的提示。

创建提交

通过运行`git — no-pager diff — staged`查看暂存更改,并使用适当的提交信息提交它。  
第一行要简洁,如有必要,可以在换行后添加详细信息

当让Cline读取git命令结果时,使用— no-pager选项以避免手动滚动命令结果。

创建PR详情

在GitHub上创建PR时,通常有一个项目模板,这个提示可以自动填充它。

比较当前分支和master分支之间的差异,并填写此PR的模板。  

# 标题  
此PR的标题  
# 动机  
此PR的动机  
# 描述  
PR的详细信息。

6、结束语

总体而言,我发现它比我预期的更有用。

虽然还有一些令人沮丧的地方,但我相信随着未来更快更智能的模型出现,AI编程可能会变得主流。

祝你愉快地编码(或提示)!


原文链接:My Experience of Letting AI Handle a Whole PR Without Touching the Code

汇智网翻译整理,转载请标明出处