单位 1 / 12

软件团队的人工智能:工作模式和限制

收益:

  • 能够解释编码助手如何作为语言模型工作以及令牌、上下文窗口、幻觉的概念
  • 能够通过思维导图区分人工智能强弱的软件任务
  • 能够将提议-生产-验证的基本工作周期应用到自己的任务中

软件开发人员的一天很少花在“从头开始编写代码”上。即时的;阅读其他人编写的代码,尝试重现错误,扫描日志(应用程序运行时生成的日志行),编写测试,编写 PR(拉取请求 - 提交代码更改以供团队审查的合并请求)解释并更新文档。人工智能(AI)是一个速度倍增器,几乎可以触及所有这些看不见的工作。但安全使用它的首要条件是正确理解它是什么、不是什么。

在本单元中,我们首先用通俗易懂的语言讲解编码助手的底层技术;然后我们创建模型的优点和缺点的思维导图;最后,我们建立了将在整个模块中使用的基本工作规则:提出、产生、验证。这三个步骤是接下来十一个单元的支柱。

注意:本模块是一般培训。在安全关键软件(支付处理、医疗保健、身份验证、关键基础设施)中,人工智能输出不能替代合格工程师的审查和批准。 AI是助手;签字人是工程师。

编码助理实际上是做什么的?

大多数编码助手都是基于大型语言模型(LLM——一种经过大量文本和代码训练的人工智能,可以预测下一个最有可能的“块”)。该模型不能像人类一样“理解”代码;它根据从大量示例中学到的模式,生成您所提供的上下文的最有可能的延续。这种看似简单的机制在实践中产生了令人惊讶的熟练结果——因为大多数软件都由重复的模式组成:HTTP 请求、循环、空检查、测试模式。

这里三个术语至关重要。 Token是模型对文本进行划分处理的最小单位;它大约是几个字母或单词的一部分。上下文窗口是模型一次可以“看到”的标记数量;您的代码、错误消息和说明必须适合此窗口。提示是您为模型提供的所有说明和上下文。您获得的输出的质量直接取决于这两个因素:您为模型提供的上下文和指令越清晰,您获得的结果就越好。错误的输入会产生错误的输出,即使它是一个智能模型——经典的“垃圾输入,垃圾输出”软件规则也适用于人工智能。

优势和劣势图

为了引导人工智能找到合适的工作,有必要知道它的优点和缺点。记住这张地图会让你在接下来的每一个任务中思考,“我应该把这项工作外包给人工智能还是自己来做?”它可以让您在几秒钟内回答问题。

它的优点是:生成样板代码、从一种语言翻译为另一种语言、编写正则表达式 (regex)、描述函数、创建测试框架、解释错误消息、起草文档、建议变量/函数名称以及少量重构(改进代码结构而不改变其行为)。

弱点:了解公司特定的业务规则,记住整个代码库,实际运行和验证代码,确定了解最新的库版本,百分百保证检测安全漏洞。最危险的是幻觉:模型用一种非常令人信服的语言发明了一个不存在的函数、库或API(支持应用程序之间数据交换的接口)。这种风险实际上可以转化为您的优势,因为与纯文本不同,可以测试代码以查看它是否“有效” - 只是不要跳过验证步骤。

任务类型

人工智能的作用

男人的角色

生产样板/骨架

产生草稿

改编、评论

代码说明

提供快速总结

验证代码中的关键部分

编写测试

案例提示

确认覆盖范围和准确性

安全关键逻辑

有用的想法

决定和责任完全取决于人类。

API/库的使用

生成样本

验证是否存在和版本

架构决策

选项种类

选择并捍卫了解上下文

一步一步:基本工作周期

  1. 明确任务。如果你不能用一句话写出你想要的东西,那么模型也不能。不确定性越早渗透到输入中,输出中的不确定性就越大。
  2. 给出上下文。将相关代码、完整错误消息、语言/框架版本和约束添加到提示中。不要说“解决这个问题”,而是说“Python 3.11,FastAPI 0.110;这个函数给出了 500 错误,当请求正文为空时它会爆炸”。
  3. 拼版角色和格式。像“你是一名高级 Go 开发人员;只需给出代码和两句基本原理”这样的框架重点关注输出。
  4. 求小。将其分解为多个步骤,而不是一个巨大的请求;分别验证每个步骤。重大变更是有风险的,因为它们难以验证并且容易隐藏错误。
  5. 核实。运行它、测试它、直观地阅读它。未经验证的人工智能代码只是一个“草图”,而不是一个“解决方案”。这是周期中最不可协商的一步。

三个迷你箱

案例 1 — 节省的时间是真实的,但幅度不大。当团队使用 AI 骨架化新的 CRUD(创建-读取-更新-删除)端点时,初稿时间从大约 40 分钟缩短到 8 分钟。但加上审核和测试,总时间为25分钟;所以真正的增益是从40到25,大约是38%。这个速度,而不是“我们加速了 10 倍”的预期,是一个可持续的收益。

案例 2——产生幻觉的代价是高昂的。开发人员未经验证就使用了 AI 建议的 requests.get_json() 调用;没有这样的方法(确切地说是response.json())。由于代码无法编译,浪费了 20 分钟时间。一个简单的“这个方法真的存在吗?”验证将重置损失。

案例 3——良好的环境使产出加倍。对于同一错误,一位开发人员只是简单地写了“我收到错误”,另一位开发人员添加了完整的堆栈跟踪、版本和输入示例。后者第一次尝试就得到了正确的解决方案;第一个花了三回合。差异不在于模型,而在于输入。

四个可复制模板

通用、强大的启动提示符:

角色:您是一位经验丰富的{{语言}}开发人员。任务:{{what_want}}上下文:- 框架/版本:{{framework_and_version}}- 约束:{{性能、风格、依赖规则}}规则:- 请勿使用不存在的库/函数;如果您不确定,请将其标记为“验证”。 - 首先,给出一个简短的计划,然后是代码,然后是两句话的理由。 - 生成可测试的工作代码。

将不确定性过滤回模型中:

在解决下面的任务之前,请列出至少 3 个您发现缺失或不清楚的问题作为问题。在我回复之前不要写代码。任务:{{task}}

要自检输出:

您已生成以下代码。现在改变你的角色并批评这段代码:- 列出 3 种可能不起作用的情况(边缘情况)。- 是否有任何你可以编写的 API/函数?标记。- 给出更正的版本。代码:{{code}}

将决定分解为选项:

针对 {{problem}} 建议 2-3 种解决方法。对于每个:简短描述、加/减、何时选择。以表格形式给出。不要为我选择;只是澄清这个选项。

弱提示/强提示

弱:“修复此代码中的错误。” (哪个错误?哪种语言?预期的行为是什么?)
强:“Python 3.11 / FastAPI 0.110。当请求正文为空时,以下端点返回 500 并带有 KeyError;我希望它在空正文上返回 400 和有意义的消息。首先解释原因,然后给出更正的函数,然后为此场景编写测试。[代码]”

强大版本;它给出了语言、版本、实际错误、预期行为和输出格式。模型不再需要预测。

常见错误

  • 无需验证即可信任。最常见也是最昂贵的错误。在编译和测试代码之前不要说“已解决”。
  • 在没有上下文的情况下提出问题。没有版本、错误文本和限制的答案是通用的并且通常是错误的。
  • 一个巨大的要求。无法立即请求和审查 300 行的作品会导致错误不可见。
  • 误将模特的自信当成证据。 AI可以自信地说出错误;语气并不是准确性的指标。
  • 随意粘贴公司机密。私钥、客户数据或私人源代码不应输入未经批准的工具中(我们将在第 10 单元中深入探讨此主题)。
提示:将每个 AI 输出视为“这是草稿”。这种单一的心理习惯消除了您在整个模块中看到的大部分风险。

综上所述

编码助手是一种语言模型,可以预测下一个最可能的片段;它不理解代码,它产生模式。这就是为什么他擅长重复性、公式化的工作。对于需要特定于您的上下文的验证的工作,应谨慎使用它。最大的风险是幻觉,唯一的解药是验证。我们在整个模块中遵循的规则很明确:澄清任务、给出背景、要求较小、验证每个可交付成果。

应用任务

写下您上周完成的三项软件任务(例如错误修复、测试、自述文件更新)。查看每个选项的“优势和劣势图”,并用一句话描述如果让 AI 执行此操作,您和 AI 的角色将会是什么。然后使用上面的“启动提示”模板将其中一项任务交给AI并运行并验证输出;记下您节省了多少分钟以及需要纠正多少错误。

清单

  • [ ] 我意识到 LLM 产生模式,而不是“理解”代码。
  • [ ] 我可以用一句话解释token、context window和prompt的概念。
  • [ ] 我可以区分人工智能强弱的任务类型。
  • [ ] 我知道什么是幻觉,唯一的解药就是验证。
  • [ ] 我根据自己的任务调整了“提议、生产、验证”周期。
  • [ ] 我可以通过一个具体的例子来展示强提示和弱提示之间的区别。