拆解复杂问题的策略:Flow Engineering
看到 Andrej Karpathy 转发了一篇论文,主题是用 Flow Engineering 提升 AI 生成代码的准确性。我好奇什么是 Flow Engineering 以及其用来解决复杂问题的思路是什么,毕竟让 AI 生成代码算得上是相当复杂的任务了吧。
我们知道,在优化提示词的时候,或者说 Prompt Engineering 的时候,视角是放在如何更清晰地描述问题,以及应用各种技巧让 AI 更好地理解我们的问题,从而输出符合预期的结果。
Flow Engineering,按照我的理解,是把视角拉到一个更高的角度来系统地审视问题的整个解决方案:问题是什么?有哪些可能的解决方案?综合来看哪个方案可以优先尝试?如何进行可行性验证?出问题了如何迭代?
Kimi 比我总结得更好,见图 1。
对于论文中具体的解决代码生成的流程见图 2。我读下来很有启发的地方有 2 点。
1. 让 AI 基于我们的问题描述做阅读理解,然后复述我们的问题。基于问题和阅读理解再针对问题的目标、边界设想可能的解决方案
这分别对应图 1 流程中的 Problem Reflection (问题反思) 和 Generate Possible Solutions (生成可能的解决方案)。
我之前犯过的一个错误是,上来就咔咔咔地对 AI 提要求,意思就是你丫就按照这个来,别整没用的。后来我慢慢意识到,实际上我应该先问问 AI 的想法,再看怎么提要求。
Andrew 老师经常说要把 LLM 当作是一个推理引擎。如果把它当作知识库来查询,它经常过于有“创意” (Hulucination),但如果基于它庞大的知识库,让其在指定的、有清晰边界的问题范围内做推理,那么我们就收获了一个称职的顾问。
多听参考意见,自己做决定。
2. 让 AI 以某种结构化的方式输出回复能帮助 AI 梳理逻辑,从而输出质量更好的结果。论文中针对代码生成,用的是 YAML 结构。YAML 我也没看明白。但这个想法是通用的,比如以列表输出结果。
延伸一下,我猜让 AI 以 Markdown 输出应该是同样符合这个原则的。
由于论文中没有列出具体的让 AI 进行 Problem Reflection 的提示词,我在开源项目中搜了一下,见图 5。完整提示词地址是:
github.com其他流程环节中用到的提示词都在同一个目录,比如生成解决方案,是非常好的参考。
《Code Generation with AlphaCodium: From Prompt Engineering to Flow Engineering》论文地址:
arxiv.org