探索生成式 AI
生成式 AI,尤其是 LLM(大型语言模型)已经席卷了公众意识。像许多软件开发人员一样,我对它的可能性感到着迷,但我不确定从长远来看它对我们这个行业意味着什么。我现在在 Thoughtworks 担任了一个职位,负责协调我们关于这项技术将如何影响软件交付实践的工作。我将在这里发布各种备忘录,描述我和我的同事正在学习和思考的内容。
之前的备忘录
工具链(2023 年 7 月 26 日)
中位数 - 三个函数的故事(2023 年 7 月 27 日)
内联辅助 - 什么时候更有用?(2023 年 8 月 1 日)
内联辅助 - 它如何妨碍我们? (2023 年 8 月 3 日)
编码助手不能取代结对编程 (2023 年 8 月 10 日)
使用 GitHub Copilot 进行 TDD(2023 年 8 月 17 日)
GenAI 与其他代码生成器有何不同?(2023 年 9 月 19 日)
最新备忘录:如何解决编码助手的不稳定性
2023 年 11 月 29 日
编码助手的有用性与它的不可靠性之间存在权衡。底层模型非常通用,基于大量训练数据,这些数据与手头的任务相关或无关。此外,大型语言模型会编造东西,它们会“幻觉”,正如人们通常所说的那样。(旁注:关于“幻觉”这个词有很多讨论,关于 它实际上并不是描述这种情况的正确心理学隐喻,但也关于在第一位使用心理学术语,因为它将模型拟人化了。)
这种不可靠性会带来两个主要风险:它会对我的代码质量产生负面影响,也会浪费我的时间。鉴于这些风险,快速有效地评估我对编码助手输入的信心至关重要。
如何确定我对助手输入的信心
以下是一些我在尝试评估使用建议的可靠性和风险时通常会想到的问题。这适用于在键入代码时的“自动完成”建议,也适用于聊天中的答案。
我是否有快速反馈循环?
我越快能发现答案或生成的的信息是否有效,助手浪费我时间的风险就越低。
- 我的 IDE 能否帮助我进行反馈循环?我是否有语法高亮、编译器或转译器集成、代码风格检查插件?
- 我是否有测试,或者是否有快速手动运行建议代码的方法?有一次,我使用编码助手聊天来帮助我研究如何在 HTML 页面中最佳地显示可折叠的 JSON 数据结构。聊天告诉我一个我从未听说过的 HTML 元素,所以我不知道它是否存在。但把它放到一个 HTML 文件中并在浏览器中加载它很容易,从而确认了它的存在。举个反例,验证我从未听说过的基础设施代码的反馈循环通常要长得多。
我是否有可靠的反馈循环?
除了 AI 输入的反馈循环速度外,我还反思该反馈循环的可靠性。
- 如果我有一个测试,我对该测试有多大信心?
- 是我自己写的测试,还是我也用 AI 助手生成的?
- 如果 AI 生成了测试,我对评估这些测试有效性的能力有多大信心?如果我正在编写的功能相对简单且常规,并且使用的是我熟悉的语言,那么我的信心当然比处理更复杂或更大的功能要高得多。
- 我在使用助手时是否与某人结对?他们会对 AI 输入提供额外的输入和审查,并增加我的信心。
- 如果我不确定我的测试覆盖率,我甚至可以使用助手本身来提高我的信心,并要求它提供更多边缘情况来测试。这就是我如何找到 我在之前备忘录中描述的中位数函数的关键缺失测试场景。
误差范围是多少?
我还反思我正在做的事情的误差范围是多少。误差范围越低,我对 AI 输入的批判性就越高。
- 当我引入一个新模式时,我认为这对代码库的整体设计来说是一个更大的爆炸半径。团队中的其他开发人员会采用这种模式,一旦它出现在代码中,编码助手也会在整个团队中复制这种模式。例如,我注意到在 CSS 中,GitHub Copilot 经常向我推荐 flexbox 布局。但是,选择布局方法是一个重大决定,因此在使用它之前,我想咨询一下前端专家和团队中的其他成员。
- 与安全相关的任何事情当然都有很低的误差范围。例如,我正在开发一个 Web 应用程序,需要设置一个“Content-Security-Policy”标头。我对这个特定的标头一无所知,所以我首先询问了 Copilot 聊天。但由于主题的敏感性,我不想依赖它的答案,而是转而求助于互联网上可靠的安全信息来源。
- 这段代码的寿命有多长?如果我正在开发原型或一次性代码,我更有可能在没有太多质疑的情况下使用 AI 输入,而不是在开发生产系统时。
我是否需要非常新的信息?
我需要的答案越新越具体(例如,针对框架的某个版本),它出错的风险就越高,因为我正在寻找的信息可能不可用或 AI 无法区分的概率更高。对于此评估,了解手头的 AI 工具是否可以访问除训练数据之外的更多信息也很重要。如果我使用聊天,我想知道它是否有能力考虑在线搜索,或者它是否仅限于训练数据。
给助手一个时间限制
为了降低浪费我时间的风险,我采取的一种方法是给它一种最后通牒。如果建议没有在付出少量额外努力的情况下为我带来价值,我会继续前进。如果输入不能很快帮助我,我总是假设助手最糟糕的情况,而不是抱有侥幸心理,并在它上面花费 20 分钟以上的时间来使其工作。
我想到的一个例子是,当我使用 AI 聊天来帮助我生成 mermaid.js 类图时。我对 mermaid.js 语法不太熟悉,我一直试图让建议起作用,并认为我可能在 markdown 文件中以错误的方式包含了它。事实证明,语法完全错误,我在大约 10 分钟后终于去查看了在线文档才发现这一点。
为助手创建一个角色
在准备这份备忘录时,我开始思考为助手创建一个角色是否可以帮助我们负责任地使用它,并尽可能减少时间浪费。也许将 AI 拟人化在这种情况下实际上会有所帮助?
考虑到各种不可靠性,我会想象 AI 角色具有以下特征
- 渴望帮助
- 固执
- 博览群书,但缺乏经验(对于龙与地下城爱好者来说:智力很高,智慧很低)
- 不会承认它“不知道”某件事
我尝试了几个提示,使用图像生成器,要求它生成各种渴望的河狸和固执的驴子。这是我最喜欢的那个(“渴望固执的驴子快乐书籍电脑;卡通,基于矢量,颜色平坦区域”在 Midjourney 中)
你甚至可以为你的角色想出一个有趣的名字,并在团队中谈论它。“Dusty 在那次会议上是一个令人讨厌的自作聪明的人,我们不得不关闭它一段时间”,或者“我很高兴 Dusty 在那里,我在午饭前完成了那项任务”。但你永远不应该说“Dusty 导致了那起事件!”,因为 Dusty 基本上是未成年人,他们没有犯错的许可。我们就像父母,最终对提交负责,而“父母对其子女的行为负责”。
结论
情况评估清单可能看起来很多,需要在每次使用编码助手时都应用。但我相信,我们使用这些工具越多,就会越擅长使用它们。我们一直在编码时根据经验进行多维度的快速评估。我发现,我遇到的情况越多,例如上面提到的情况,我就越擅长决定何时使用和信任助手——就像我越是被烫伤,就越会小心地触摸热炉一样。
你可能还会想,“如果 AI 助手不可靠,那我为什么要使用它们呢?”。我们在使用生成式 AI 工具时必须进行思维转变。 我们不能用对“常规”软件的相同期望来使用它们。GitHub Copilot 不是一个传统的代码生成器,它不会给你 100% 你需要的东西。但在 40-60% 的情况下,它可以让你完成 40-80% 的工作,这仍然很有用。当你调整这些期望,并给自己一些时间来了解渴望的驴子的行为和怪癖时,你将从 AI 编码助手那里获得更多收益。
感谢 Brandon Cook、Jörn Dinkla、Paul Sobocinski 和 Ryder Dain 的反馈和输入。
这份备忘录是在 GitHub Copilot 处于活动状态的情况下,在 markdown 文件中编写的。它有助于提供想法和措辞,有时当我卡住时,但建议很少以最终文本中的形式出现。我使用 ChatGPT 作为同义词词典,并为驴子寻找一个好名字。