最近在尝试用GPT-4辅助写一些Python脚本,发现一个很头疼的现象:简单函数比如“写个快速排序”它没问题,但一旦涉及文件路径、异常处理、或者编码格式这种细节,它经常给我生成“看似合理但一跑就报错”的代码。比如让它读CSV然后处理空值,它居然默认所有文件都有表头,而且没考虑路径里有中文的情况。我试过在Prompt里加“请考虑边界情况”,但效果不稳定。各位平时是怎么设计Prompt的?是会把所有可能异常都列出来,还是有更结构化的写法(比如给输入输出示例)?另外,让它自己先跑一遍再返回代码,这种思路可行吗?
用Prompt写代码总在边界条件翻车,怎么让LLM稳定输出可运行代码?
全部回复
共 124 条给输入输出例子最管用,再让它把异常路径写进注释里,基本能避开八成坑。
我个人是把“考虑边界情况”这种抽象指令直接换成具体例子,比如在prompt里塞一个带中文路径和空值的CSV片段,让它按这个输入写代码,效果比笼统描述好很多。让它自己跑一遍再返回这个思路我觉得可行,就是得提醒它别光看能跑通,还得主动打印几个关键变量的类型和值,不然它自己也会被假象骗过去。另外有个小技巧,让它先写处理主流程的伪代码,再单独列一个“可能出错点”清单,最后合起来生成,翻车概率会低不少。你试过给模型提供那种带陷阱的最小复现文件吗?
我一般会把约束条件写成类似接口文档那种,比如“函数接收str路径,可能含中文,返回DataFrame,空值填0”,再给一两个输入输出例子,比单纯说“考虑边界”稳很多。让模型自己跑一遍不现实,它没法真执行,但你可以让它先输出测试用例,你再拿这些用例去验。还有个偷懒办法,把容易翻车的路径、编码、异常处理写成固定模板塞进prompt,让它填逻辑而不是自由发挥。
这个问题我太有同感了,让模型写业务代码最怕的就是它一本正经地胡说八道。我的经验是光在prompt里写“考虑边界情况”基本没用,得把边界条件具体化成它不得不处理的约束。比如读CSV那个例子,我会直接告诉它“文件可能没有表头,路径可能包含中文和空格,空值用空字符串或NaN表示”,相当于把踩过的坑提前写进需求里。另一个挺管用的做法是给一个最小输入输出示例,让它先按这个例子对齐格式,再让它泛化,这样它跑偏的概率会低不少。至于“让它自己先跑一遍”,思路是对的,但得看工具链,像ChatGPT的代码解释器确实能执行,可它执行成功不代表在你本地环境能跑通,依赖版本和文件系统差异它根本感知不到。我现在更倾向于让它写代码的同时附带pytest测试用例,把异常路径也覆盖进去,这样它自己就得先想清楚各种失败场景。还有个细节是别让它一次写太长,拆成小函数逐个确认,比一口气生成两百行再debug高效多了。