软件工程师对大型语言模型(LLM)的看法存在严重分歧。许多人认为它们是迄今为止对该行业最具变革性的技术。另一些人则认为它们不过是又一个炒作过度的产品:想想很兴奋,但最终对从事严肃工作的专业人士来说毫无用处。
就我个人而言,我觉得我从人工智能中获得了很大的价值。我认为很多没有这种感觉的人都是“用错了方法”:也就是说,他们没有以最有帮助的方式使用语言模型。在这篇文章中,我将列出我作为一名高级软件工程师,在日常工作中经常使用人工智能的许多方式。
编写生产代码
我每次编写代码都会使用Copilot的代码补全功能¹。我接受的几乎所有补全都是完整的样板代码(例如,填写函数参数或类型)。我很少让Copilot为我生成业务逻辑,但这种情况偶尔也会发生。在我擅长的领域(例如,Ruby on Rails),我有信心我能比LLM做得更好。它只是一个(非常好的)自动完成工具。
但是,我并非总是在我擅长的领域工作。我经常发现自己需要在不太熟悉的领域进行小的战术性更改(例如,Golang服务或C库)。我知道这些语言的语法,并且用它们写过个人项目,但我不太确定什么是惯用的。在这些情况下,我更多地依赖Copilot。通常,我会启用o1模型的Copilot聊天,粘贴我的代码,然后直接询问“这是惯用的C语言吗?”
像这样更多地依赖LLM是有风险的,因为我不知道自己错过了什么。它基本上让我能够在所有领域都以一个聪明的实习生的水平进行操作。我必须像一个明智的实习生一样行事,并确保该领域的主题专家审查我的更改。但即便如此,我认为能够快速进行这类战术性更改是非常有价值的。
编写一次性代码
当我编写永远不会投入生产的代码时,我会更自由地使用LLM。例如,我最近做了一项研究,需要从API中提取大量公共数据,对其进行分类,并使用一系列快速正则表达式来近似该分类。所有这些代码都只在我的笔记本电脑上运行,我使用LLM编写了几乎所有代码:提取数据的代码,运行单独的LLM进行分类的代码,对其进行标记并测量标记频率并对其进行评分的代码,等等。
LLM擅长编写可以工作但无需维护的代码。仅运行一次(例如,用于研究)的非生产代码非常适合这种情况。我想说,我在这里使用LLM意味着我完成这项工作的速度比没有帮助的情况下快2到4倍。
学习新领域
我用LLM做的最有用的事情可能是把它当作一个随叫随到的导师来学习新领域。例如,上周末我学习了Unity的基础知识,并大量依赖ChatGPT-4o。使用LLM学习的妙处在于你可以提问:不仅是“X是如何工作的”,还可以提出后续问题,例如“X与Y有什么关系”。更重要的是,你可以问“这是对的吗”之类的问题。我经常写一些我认为我学到的东西,然后反馈给LLM,它会指出我哪里是对的,哪里仍然存在误解。我问LLM很多问题。
当我学习新东西时,我会做很多笔记。能够直接复制粘贴我所有的笔记并让LLM进行审查真是太棒了。
幻觉呢?说实话,自从GPT-3.5以来,我没有注意到ChatGPT或Claude出现太多幻觉。我尝试学习的大多数领域都非常容易理解(只是我不懂),而且根据我的经验,这意味着出现幻觉的可能性非常低。我从未遇到过从LLM那里学到的东西最终被证明是完全错误或产生幻觉的情况。
最后的bug修复手段
我不会经常这样做,但有时当我真的卡在bug上时,我会将整个文件或多个文件附加到Copilot聊天中,粘贴错误消息,然后直接问“你能帮忙吗?”
我不这样做是因为我认为我目前比目前的人工智能模型更擅长bug查找。几乎所有时候,Copilot(或者Claude,对于一些个人项目)都会感到困惑。但如果我真的卡住了,尝试一下还是值得的,以防万一,因为它非常省力。我记得有两三次我只是错过了一些细微的行为,而LLM抓住了,这为我节省了很多时间。
因为LLM在这方面还不太擅长,所以我不会花很多时间迭代或试图让LLM摆脱困境。我只是尝试一次,看看它是否能解决问题。
校对拼写错误和逻辑错误
我写了相当多的英文文档:ADR、技术摘要、内部帖子等等。我从不允许LLM为我写这些东西。部分原因是我认为我写得比目前的LLM更清楚。部分原因是我对ChatGPT的写作风格普遍反感。
我偶尔会做的是将草稿输入LLM并寻求反馈。LLM非常擅长捕捉拼写错误,有时会提出一些有趣的观点,从而成为我草稿的编辑内容。
像bug修复一样,我不会在这样做时进行迭代——我只是请求一轮反馈。通常LLM会提供一些文体反馈,我总是忽略这些反馈。
我将LLM用于以下任务:
• 使用Copilot进行智能自动完成
• 在我不熟悉的领域进行小的战术性更改(始终由SME审查)
• 编写大量一次性使用的研究代码
• 提出大量问题以学习新主题(例如,Unity游戏引擎)
• 最后的bug修复手段,以防万一它能立即解决问题
• 对长篇英文交流进行宏观层面的校对
我(目前)不将LLM用于以下任务:
• 在我熟悉的领域为我编写完整的PR
• 编写ADR或其他技术交流
• 在大型代码库中进行研究并找出事情是如何完成的