不要再让 LLM(生成式 AI)写代码了!

177 阅读4分钟

转载

现在的问题已经不再是「要不要用生成式 AI 工具」,而是「怎么用」才能最大限度地发挥作用。就像在互联网时代掌握数字素养至关重要一样,在 AI 时代,掌握 AI 素养已成为工程师公平使用 AI 工具的基础。

对初级软件工程师来说,直接让大语言模型(LLM)“写一段实现 X 功能的代码”是非常诱人的做法。事实上,大多数关于如何将 LLM 集成到软件工程或数据科学工作流程中的教程,也往往是从这一步开始的。

但我认为,这可能是个错误的起点。

这篇文章是我在日常软件开发工作中大量使用 LLM 后的一些观察和总结,也是在此基础上逐渐形成的使用策略。

TLDR 总结:

  • 不要直接让 LLM 写代码,而是先分析并提供上下文

  • 一开始就提供完整上下文,并确认模型需要什么

  • 提问要深入,挑战默认假设

  • 留意细节错误(比如过时的 API、混用语法)

  • 要有检查点机制,避免上下文污染

  • 自己理解每一行代码,保持知识对等

  • 前期设计要投入足够时间

在整个过程中,有一个很重要的心态是:把模型/系统/代理当作一个有能力但还年轻的结对编程同事。同时也要意识到,LLM 本质上是一个自回归的“下一个 token 预测器”。

注:本文聚焦于「聊天式」的工作流,比如使用 Gemini、ChatGPT 或 Claude 这样的界面,由开发者直接驱动交互和上下文。相反的工作流是像 GitHub Copilot 或 Cursor 那样的自动推断上下文的方式。

1. 不要写代码——先分析!

经验告诉我,最好的结果来自于我一开始就明确要求模型不要写代码。例如我通常这样说:

我需要重构一部分代码。
请你认真思考。
在做出任何修改之前请先和我确认。
我们使用的库或 API 可能已经更改,请多加注意。
如果你需要查看某个文件来更好理解,请告诉我。
规则是:不写代码,先规划、推理、确认。

比如说,我改了 db manager 类,那测试代码也需要调整——这时 LLM 很可能会对代码结构、数据类型、函数行为等作出大量默认假设,甚至提出一些根本不必要或不合适的优化。

因此,我们要让 LLM 一开始就主动表达它的假设,然后你需要花时间去纠正它的计划、弥补它的信息盲点,而不是直接看它产出代码。

2. 提供上下文

上下文至关重要。

这就像你和同事一起拼图,如果有一些碎片藏着不给对方看,那他就根本拼不好。也像设计评审会一样,总是由高级工程师先讲一下整体结构并回答问题。

我会先问 LLM:

“你需要了解什么上下文?”

很多时候,我们人类觉得理所当然的东西,对 AI 来说可能完全不可见。比如一个组件报错,可能是因为模型根本没看到你给它处理的 JSON 数据结构,或者它不知道这个结构改过了。

例子:

你需要什么?
下面是一些文件…
我用的是 ant design 做组件、tailwindcss 做布局、lucide-react 做图标。

这些上下文的提供会极大地减少你日后用来修 bug 和纠正模型错误的时间。

3. 提很多问题、持续学习

有时候你的任务是实现一个新功能,或者是理解一个陌生的代码库。在这种情况下,你可以把代码库看成一张地图,而 AI 可以帮你探索未解锁的区域,更重要的是从中学习

经验告诉我:

  • 深挖副作用,别只看 happy path(理想路径)

  • 挑战默认实现的合理性

  • 让模型分析不同做法的优劣

  • 提前探索可能出错的边界条件

  • 问它有什么选择(比如不同算法、不同库)

要注意:LLM 往往会「趋中」,即提供平均水平的解决方案。但真正的应用很多时候是在「长尾」——需要非常具体的调整或公式。

这时候,你就要发挥「高级工程师」的直觉。如果你不提这些问题,模型默认输出的代码可能表面看没错,但实际运行或维护起来会非常痛苦。

例如:

目标是做一个可视化组件。

  • 正确提问方式:
    「有哪些可选方案用于可视化多行区域图?请列出优缺点。」

    这样你能了解不同方向,还能发现你没想到的思路。

  • 错误提问方式:
    「我该用 ReChart 吗?」

    模型极可能说 “yes”,即使 ReChart 并不是最适合的选项。因为你一旦在 prompt 中写了 “ReChart”,LLM 的输出方向就被锁死了。

记住:LLM 是自回归生成器,它的回答受到上下文提示极大影响