本书由李宁撰写,出版于 2023 年 10 月。虽然技术进步迅速,部分技术细节可能更新,但书中核心思想——解决复杂问题的通用做法是先分解后合并,依然极具价值。
随着 2024 年初 ChatGPT 大火,至 2025 年 DeepSeek、Google Gemini 3 等模型的发布,LLM 已逐渐融入日常工具范畴。在编程领域,GitHub Copilot、Cursor、CodeGeex 等工具;在工作流 Agent 方面,FastGPT、Dify 等;以及遵循模型上下文协议 MCP 的工具,都是为了基于 LLM 能力实现具体功能,安全地赋能私有数据,并消除概率性输出带来的不确定性。
在编程领域,将复杂需求分解(breakdown)然后合并是传统做法。借力大模型,路径亦是如此。当前经验如下(以复杂项目为例):
- 手写需求梗概
- LLM 扩展成详细需求(多轮对话,反复打磨),建议分步走式开发:MVP 原型 -> feature delta 1 -> ... -> full feature ready
- 手写设计框架,模块分割,技术架构
- LLM review 细化(多轮对话,反复打磨)
- LLM 生成代码文件结构,框架代码
- VSCode 中创建项目,copy LLM code,生成 MVP 原型代码,手动试验
- VSCode 中 GitHub Copilot 分步实现详细需求中的功能,渐进式地开发
驾驭 AI 之感悟
到现在为止,我们已经实现负责浏览图像和搜索图像的 web 服务,我们没有编写一行代码,这些代码都是 ChatGPT 和 GitHub Copilot 编写的。通过这两个 AI 工具,完成这些工作只需要几分钟,只要描述准确、严谨,生成的代码几乎是 100% 准确的。即使生成的代码有一些问题,一般也不用调试,再让 ChatGPT 或 GitHub Copilot 重新生成就可以了。孔子说过,'三人行,必有我师焉'。对于 AI 来说,生成三遍,必有我满意的代码。
如果用同一个描述,连续生成三遍,还不能满足自己的需求,或者与自己的需求有很大的差异,那么可能是以下原因:
- AI 模型本身不够强大。这种可能性并不大,因为 ChatGPT 是目前最强大的 AI 模型,尤其是 ChatGPT Plus,它基于 GPT-4。
- 描述不够准确。这种情况下就看你的文学功底了,检查描述是否严谨、是否全面,是否有语病或歧义。
- 描述不合理。例如,你的要求超出了 AI 的能力范围,或者你的要求根本不可能用你指定的技术实现。在这种情况下,ChatGPT 可能会根据概率统计,返回根本不存在的函数或方法调用。
- 描述过于复杂。尽管 AI 工具可以接收数百甚至数千字作为输入,但对于过于复杂的问题,AI 模型也可能忽略一些细节。解决问题的方法也很简单,就是分治法。将大问题分拆,变成中等的问题。如果中等问题仍然很复杂,再继续将问题分拆,变成小问题。直到每一个问题都变得一目了然为止。当每一个小问题被解决后,就会逐渐将小问题合并,组合成大问题。
对于让 ChatGPT 这样的 AI 工具为自己编写代码这个工作也是如此。有人说,ChatGPT 的编程能力可以达到中级程序员的程度,其实这样评价太过肤浅。ChatGPT 的能力能达到什么程度很大程度上取决于它的使用者。就像对于同一把小提琴,不同人演奏会出现完全不同的效果。
ChatGPT 也一样,到底能解决多复杂的问题很大程度上并不在于 ChatGPT 本身,而在于使用者如何处理复杂的问题,如何化繁为简。因此,是否能驾驭 ChatGPT 并不完全是很多人所说的撰写提示词的问题。如果问题相当复杂,就算提示词写得完美无缺,ChatGPT 可能也无法完美解决问题。要将复杂问题分解,再分解,直到 ChatGPT 可以完美解决为止。当然关键点还不是分解,而是 ChatGPT 解决完每一个小问题后,如何将它们合并成最初的大问题。所以关键中的关键是设计一套接口,将小题作为黑盒。不管小问题解决得怎么样,都不会从根本上影响全局,某一个小问题解决不好,单独处理即可。
就像在 4.4 节用 ChatGPT 实现的复杂布局一样,将每一部分的布局单独作为一个从 QFrame 派生的类,并放到单独的 Python 文件中。而不是将代码直接插入主程序,就算某一个布局类不能满足自己的要求,重新生成这个类即可,这个类完全不影响其他布局类和主程序。所以影响 ChatGPT 的使用效果的关键点有如下几个:
- 提示词:这是最基础的,如果提示词不合适,一直没说清楚,ChatGPT 自然也不会为你生成想要的内容了。
- 复杂问题的分拆技巧:这是让 ChatGPT 升华的关键,也决定着 ChatGPT 处理复杂问题的天花板。
- 设计接口:分拆容易,但 ChatGPT 为你解决了每一个小问题之后,需要将这些小问题再组合成最初的复杂问题,而组合的关键就是接口。
- 组合问题:这是最后一步,也是最关键的一步,如果做不好,前面的分拆毫无意义。组合就是利用接口逐渐将不同级别的小问题逐级合并较大的问题,直到恢复到最初的复杂问题为止。
总之,你有多强,ChatGPT 就有多强!
小结
本章以桌面应用为例,深入讲解了如何将一个复杂的程序分解成多个小部分,然后分别使用 ChatGPT 和 GitHub Copilot 生成不同部分的代码,最后再将这些代码合并成一个大系统。其实应用 ChatGPT 或 GitHub Copilot 的关键点只有一个,就是化繁为简。另外,ChatGPT 与 GitHub Copilot 虽然都能生成代码,但是二者并不能互相取代,二者各有千秋。ChatGPT(尤其是 ChatGPT Plus)生成完整方案的能力要比 GitHub Copilot 强,所以通常使用 ChatGPT 完成初步的代码生成,利用 GitHub Copilot 的代码补全功能对用 ChatGPT 初步生成的代码进行微调,或者根据上下文生成新的函数、方法、语句等,以及完善和检测已经存在的代码。总之,类似于 ChatGPT、GitHub Copilot 这样的 AI 代码生成工具通常要混合使用,才能达到比较理想的效果。

