单位 1 / 12

计算机工程人工智能概论与验证学科

收益:

  • 能够区分人工智能在软件开发生命周期中哪些地方提供了真正的速度,以及哪些地方由工程师负责决策和责任
  • 能够应用三层工程学科来验证通过编译、测试和审查生成的每个代码和设计。
  • 养成清理上下文以利用人工智能的习惯,而无需共享机密源代码、凭证和客户数据

当你观察计算机工程师的一天时,你会发现大多数团队的情况都是相似的:理解业务请求、设计、编写代码、阅读别人的代码、调试(找出程序运行不正确的原因并修复它的过程)、编写测试、准备文档、审查代码和参加会议。换句话说,用于真正“工程判断”的时间,即解决方案是否正确、安全和可持续,都被重复的工作压垮了。这就是人工智能(简称 AI;使用大型语言模型处理文本和代码的软件)发挥作用的地方。人工智能不会替你做决定;它帮助您做好决策准备,生成代码框架,缩小错误范围,并将工作草案摆在您面前。在本模块中,我们不会将人工智能定位为“自动程序员”,而是一个纪律严明的结对编程伙伴,其输出每次都会被编译、测试和审查。

在第一个单元中,我们澄清三件事:人工智能在软件开发生命周期的哪些阶段(软件从创意到生产所经历的阶段:分析、设计、编码、测试、部署、维护)可以增加真正的价值;哪些决定应严格由工程师决定;以及执行此操作时必须遵守的验证和保密纪律是什么。如果屋顶安装不正确,后续装置的技术可能会变得危险;因为软件中的错误会同时影响数百万用户,并可能变成安全漏洞。

概念:幻觉:人工智能令人信服地捏造了实际上并不存在的方法、库、API 或行为。上下文:您向 AI 提供的输入(代码、错误消息、要求、约束)。验证:以独立的方式检查输出(编译、测试、文档)。这三个概念是整个模块的支柱。

哪些业务是AI加速器,哪些业务有风险?

从结果来看,软件工作有两个方面。一方面是可逆的、低风险的准备工作;另一端,有难以返回的任务进入生产环境,可能会导致数据丢失、安全漏洞或中断。人工智能的价值取决于你在这个领域的立场。

业务类型

人工智能贡献

工程师的角色

代码骨架/样板

快速生成重复结构

逻辑和边沿状态控制

调试

假设和可能的原因列表

重现和根本原因确认

编写测试

测试草案和场景创建

有意义的断言和范围检查

重构

重构提案

通过测试维持行为

文档

初稿和结构

对照代码进行正确性检查

架构/安全决策

选项列表以及优缺点

最终决定和责任

规则很简单:人工智能输出的风险等于该输出出错时所造成的损害。错误地建议变量名是无害的;不正确的身份验证(检查用户是否确实是他们声称的人)会使整个系统容易受到攻击。因此,在使用输出之前要问的第一个问题是:“如果这是错误的,会发生什么?谁注意到它以及何时注意到它?”

注意:人工智能可以生成流畅且自信的代码。流畅性并不能保证准确性。语言模型可以可靠地生成实际不存在的函数名称、不正确的参数序列,甚至不安全的模式。在软件中,这并不停留在纸面上;而是在软件中。它在生产中编译、运行和爆炸。

应留给工程师的决定

有些决策永远不应该完全自动化;存在技术、法律和道德风险:

  • 生产批准:将代码发布到生产中以及对此的责任。
  • 安全和架构:身份验证、授权、加密和数据模型等昂贵的决策。
  • 许可证和版权:生成的代码在商业产品中的可用性以及许可证合规性。
  • 处理机密数据:处理客户数据、源代码机密和身份信息。
警告:即使人工智能说“此代码是安全的并且可以用于生产”,在没有安全测试、代码审查和实际负载下验证的情况下接受这一点也是不可接受的。在安全关键的工作中,人工智能输出永远不能替代有能力的工程师的批准;任何导致决策的输出在实施前都必须经过授权工程师的独立验证和批准。

验证规则:三层控制

应用三层控制,像高级审稿人一样使用人工智能输出,而不是盲目使用。这是我们将在整个模块中重复的基本反应。

  1. 编译和静态检查:代码是否真正编译/运行?是否存在类型错误、未使用的变量、不存在的 API?静态分析工具(检查代码而不运行代码的工具)说什么?
  2. 独立再现(测试):使用小的已知输入运行代码,看看是否获得预期的输出。尝试边缘情况(空、零、负、巨大)。
  3. 来源验证:AI使用的每个API、库版本和语言功能都应该通过官方文档进行验证。

验证提示(使检查输出变得更容易):“列出您在代码中使用的所有外部库、方法和语言功能。对于每一个,请指出它可用的版本,并将其标记为“必须从文档进行验证”。不要编写任何您不确定的 API;如果您不确定,请清楚地写下“不确定”。还要将您尚未解决的任何边缘情况作为单独的列表列出。”

批评你自己的代码提示:“像雇用你的高级工程师一样,批判性地审视你刚刚编写的代码。在这三个标题下给出具体的项目:(1) 逻辑/边缘情况错误,(2) 安全风险,(3) 性能或可读性问题。对于每个项目,写下‘为什么会出现这个问题’和‘建议的修复’。如果没有问题,就说‘我找不到问题’;不要试图修饰它。”

弱提示/强提示

弱:“给我写一个用户身份验证函数。”(结果:不清楚哪种语言、哪种规则、哪种错误行为;通用代码,通常不安全或断章取义。)强:“为 Python 3.11 编写一个电子邮件验证函数。输入:字符串。输出:如果有效则为 True,否则为 False。规则:空字符串 False;不需要符合 RFC,基本格式就足够了。不要使用外部库。函数附加块下方的 5 个样本测试:有效、空、否'@',双'@',仅包含空格。”

区别在于上下文。强大的提示功能;它包括语言、版本、输入输出契约、约束和测试期望。这种单一的纪律极大地降低了幻觉和不安全代码的风险。

迷你箱

案例 1——人为的方法。一位开发人员从 AI 那里听说日期库中有一个名为 date.addBusinessDays(5) 的方法,并自信地解释了它。查看文档,发现没有这样的方法,正确的方法是手动循环。在投入生产之前,通过 10 分钟的验证捕获幻觉。

情况 2 — 边缘状态丢失。 AI产生“计算平均值”功能;当使用 1,000 行数据进行测试时,它可以工作。但是,当列表为空时,它会给出除以零的错误。由于工程师添加了空输入测试,因此他在上线之前就发现并修复了错误。单边缘条件测试可防止凌晨 3 点发出生产警报。

案例 3——隐私风险。专家即将将包含实际数据库连接字符串和 API 密钥的文件粘贴到公共工具中。记住机构的政策;它用 <REDACTED> 替换秘密,将代码简化为代表性示例,并请求它。于是,他在5分钟内得到了帮助,但他的身份信息却没有被泄露。

使用密码和身份信息的原理

软件中最敏感的部分;源代码秘密、身份信息(API 密钥、密码、令牌)和客户/个人数据。基本原则:分享前先清理,尽可能仅询问问题的本质,并提供有代表性的示例。

匿名提示模式:“以下函数有错误。我用代表值(API key、表名、字段名generic)替换了实际业务逻辑和隐藏常量。问题:我在输入 X 中收到错误 Y。只需找到此代表代码中的逻辑错误并解释更正的版本即可。[代表代码]”

提示:如果有疑问,请进行以下测试:“如果我在论坛上公开写此内容,我的组织会遇到麻烦吗?”即使答案不清楚,也要先弄清楚。重置总是比事后追查泄漏要便宜。

常见错误

  • 使用输出而不编译/测试。 “人工智能写的”不是一个理由;每一段代码都是通过运行来验证的。
  • 在没有上下文的情况下提出请求。如果没有给出语言、版本、输入输出和约束,代码就会变得通用并且通常不安全。
  • 不假思索地分享机密信息。 API密钥、密码和客户数据未经清除不得泄露。
  • 将精确的语言与准确相混淆。 AI越自信,你就越要小心;自信的语气并不是证据。
  • 将决策委托给人工智能。投入生产、安全性和架构的决定权仍由工程师决定; AI只生产材料。

综上所述

人工智能加快了软件工作中重复且耗时的部分:框架代码、测试起草、错误缩小、文档。然而,决定权和责任仍然由工程师承担。每个输出都必须通过三层控制(编译/静态、测试、源代码)。编写带有上下文的提示和清除隐藏信息是我们将在本模块的每个单元中重复的两个关键习惯。当你有纪律地使用人工智能时,你就会获得速度;当您不加纪律地使用它时,就会将错误和漏洞带入生产中。

应用任务

从您自己的工作或想象的项目中选择一个小的编码任务(例如验证函数)。首先写一个弱提示并获取输出。然后应用本单元中强大的提示模式:添加语言/版本、输入输出契约、约束和测试期望。将两份打印输出并排放置并写出差异。然后编译可靠的输出,并使用至少三种边缘情况(空、零/负、意外格式)对其进行测试,并记下您在哪个测试中发现的内容。

清单

  • [ ] 我在提示中添加了语言、版本和输入输出契约。
  • [ ] 我写了“不要编造,如果你不确定,请告诉我”和范围限制。
  • [ ] 我编译/运行了代码,检查了静态警告。
  • [ ] 我测试了至少三种边缘情况。
  • [ ] 我根据官方文档验证了使用的API。
  • [ ] 我清除了任何密码/凭证或使用了企业工具。
  • [ ] 我确认,投入生产和安全的决定权仍在人类手中。