如何在编程时使用大型语言模型

为什么在编程时使用 LLM
有史以来第一次,无需自己编写任何代码即可构建软件,尽管如果按字面理解,这目前仅限于小型“从零开始”的项目。另一方面,对于工作流程中较快的操作,LLM 通常太慢而无法使用。然而,介于这些极端情况之间有很多情况,使用 LLM 比手动操作更快更容易。只有当你学会了在合适的场景下依赖 LLM,才能利用它们来加速你的工作。
通过在编程时使用 LLM,你可以自动化更多的工作流程。你可以增强你的开发者体验。你可以提升你的智慧。你可以更少地遇到障碍,且被困住的时间更短。你可以提高你的抱负。你可以使用更少的精力,因为有时你不必那么精确。如果你是软件开发新手或正在使用不熟悉的技术,你可以更快地掌握。通过使用 LLM,你可以提高生产力,并在构建软件中找到更多乐趣。
关于 LLM 你需要知道什么
正如 Simon Willison 所说,LLM 就像“文字计算器”,只不过每次你提示它们时,它们都会给出略微不同的答案,有时甚至会编造信息。这是因为大型语言模型(LLM)是神经网络,它们在一个通常由万亿个token组成的互联网数据集上进行训练,目的是预测下一个 token。
为了训练这些模型,会重复执行以下步骤:1)从数据集中抽取一些文本样本,2)教模型预测样本后面的 token。正确答案总是已知的,因为我们可以访问整个文本语料库,因此可以在训练期间用来向模型提供反馈,而无需事先人工标注数据。
由于互联网上存在大量代码,因此你可以在构建软件时使用这些模型来生成和讨论代码。你提供一些上下文,模型会重复预测下一个 token。如果你为编程时所做的事情提供了正确的指令,LLM 通常可以为你完成它们。这就是为什么现在许多开发者正在用 LLM 取代一部分 Google + Stack Overflow 工作流程的原因。
但要做到这一点,你需要自己知道如何编程。也就是说,为了在编程时有效使用 LLM,你需要能够引导它们达到你期望的结果。随着你熟悉某个 LLM,你将开始建立一个更好的心智模型,了解它是如何工作的、能做什么以及在哪些地方可能把你引入歧途。这一点很重要,因为使用它们可能具有欺骗性(看似简单实则复杂)。
如何将 LLM 融入你的工作流程
当你构建软件时,你从一个一句话的描述开始,最终通过合并一系列代码更改结束。我将这称为“软件开发任务”,或简称“任务”。任务通常非常复杂,因此我们经常递归地将它们分解为更易于管理的“子任务”,这些子任务共同构成了完成一个任务所需采取的一系列行动。
有时,你开始的那句话描述是你团队中的一个 Jira 工单,有时是你自己的待办事项列表中的一项,有时你甚至懒得把它写下来。但是,对于每个任务及其任何子任务,你都遵循一系列步骤,将那句话描述转化为最终合并的代码。执行这些步骤时,你通常处于心流状态,所以可能没有意识到,但如果仔细思考,你可以一步一步地描述你所做的事情。
LLM 具有变革性,因为它们可以帮助加快许多这些步骤的速度并降低所需精力。你采取的确切程序取决于你如何构建软件以及如何将其分解为步骤,但这些步骤通常涉及以下一个或多个方面……
- 澄清:确保你理解代码是如何工作的或应该如何工作
- 收集:识别关键上下文或需要更改的文件/行
- 创建:创建一个初始的样板结构来启动,特别是在利用框架和库时
- 实现:指定代码应该如何工作的业务逻辑
- 执行:运行一些东西,通常是终端命令,用于检查、调整或设置某物
- 探索:搜索并考虑某个问题的可能解决方案
- 重新整合:重新阅读代码、文档等,以更新你的理解
- 修正:以特定方式轻微调整或改进代码,通常是针对错误、异常或失败的测试用例
- 优化:重构代码以改善某个方面的性能,但输入和输出保持不变
- 验证:在运行代码之前/之后确保代码按预期工作
要让 LLM 在这些步骤中提供帮助,你每次都需要做同样三件事
- 收集:收集相关上下文
- 指示:告诉模型需要做什么
- 审查:检查建议并应用它
当完成一个步骤时,执行这三项(1-3)比手动自己操作更快更容易时,你就应该使用 LLM。要弄清楚何时属于这种情况,你需要建立直觉。最好的开始方式是识别小而简单的步骤,看看 LLM 是否可以自动化它们。一旦你找到了一些,这将腾出更多时间来学习如何处理更具挑战性、更复杂的步骤,并最终随着经验增长而使你也能够自动化其中一些步骤。
如何选择适合编程的 LLM
我们写了一篇关于如何选择要使用的代码 LLM 的指南,请参阅此处。
常见错误
未提供足够的上下文
要让 LLM 了解完成某个步骤所需知道的一切,通常需要付出很多努力。然而,如果你没有分享所有相关信息,那么 LLM 不太可能完全按照你的意愿完成该步骤。
提供了过多的上下文
许多人为了弥补前一个错误,会试图将尽可能多的内容塞进上下文窗口。这也不是个好主意。你应该只包含相关信息,别无其他。由于这些模型在进行下一个 token 预测,任何作为上下文包含的不必要 token 都会增加它不会按你预期行事的几率。
提供模糊的指令
通常最好提供完整详细的问题/指令,就像你在与另一个人交谈一样。你通常会想说类似“如何在 Python 中检查两个整数是否相等”,而不是说“检查两个整数是否相等”。如果上下文不明显,通常也最好指明相关主题(例如,“使用 React 创建 Tooltip 组件的样板代码”)。
使用了错误的工具
有很多工具可以帮助你在编程时使用 LLM。如果你经常手动复制和粘贴上下文及建议,你可能没有使用正确的工具。找到一个适合你构建软件方式的工具很重要。
未批判性地审查 LLM 的建议
归根结底,你对你发布的*所有*代码负责,无论它是你自己写的还是由你指导的 LLM 写的。这意味着你务必审查 LLM 生成的内容。如果你不这样做,你可能会接受部分或完全凭空捏造的建议,这可能导致生产环境中出现微妙的 bug 和软件故障。
尝试在没有上下文的情况下完成步骤
如今在编程时很难从 LLM 中受益,因为我们的许多想法和行动并非明确透明。如果必要的上下文和指令大多尚未捕获或不易收集,那么就很难利用模型来完成该步骤。
要求 LLM 做太复杂的事情
开发者在弄清哪些上下文是相关的,然后利用这些上下文将完成任务所需的许多步骤和子任务联系起来方面,比 LLM 要好得多,所以重点将其用于较小的步骤。如果你正在尝试将其用于一个新的步骤,并且不确定 LLM 能提供多大帮助,那么通常可以尝试以下方法开始
- 收集你不理解的代码段,并说“告诉我这段代码如何工作”
- 如果解释看起来合理,然后问“你如何修改这段代码以 [插入步骤]?”
- 如果这个解释也相当不错,那么指示它“执行[插入步骤]”
- 如果第一次尝试不成功,那么再试一次——通常它每次都会给出不同的建议
- 如果在又一次尝试后仍然没有得到你想要的结果,请使用更具体/清晰的指令和仅限关键上下文再次尝试,明确说明你想要它做什么和不做什么
- 如果这仍然不起作用,那么你可能需要将任务分解为更小的子任务,并要求 LLM 一次只执行其中一项,或者干脆自己手动完成
如果你喜欢这篇博文,并想未来阅读更多关于 DevAI——这个由借助 LLM 构建软件的开发者组成的社区——的内容,请订阅我们的月度新闻通讯,请参阅此处。