最近在调一个自动化脚本,用GPT-4写爬虫和文件处理逻辑。我明明在Prompt里写了“请确保代码健壮,包含异常处理”,但生成的代码还是经常裸奔——比如open()文件不try,网络请求不设超时。我试过把需求拆细,让它“分步骤输出代码”,但一旦任务复杂(比如多线程+日志),它就开始放飞。想问下大家,是我Prompt结构有问题,还是说应该用few-shot给几个错误处理的例子?另外,有没有办法让AI在生成后主动自查一遍代码质量?现在每次都要手动review,有点累。
用Prompt让AI写Python脚本,总是忽略错误处理怎么办?
全部回复
共 125 条你这情况太常见了,光在Prompt里说“健壮”基本没用,模型对抽象词不敏感。我一般直接列死条件:所有open必须包with/try,requests必须带timeout和raise_for_status,不然它就当没看见。few-shot确实管用,贴两段你满意的错误处理模板进去,比说一百句都强。还有个偷懒办法,生成完再发一句“逐行检查有没有漏掉异常处理和超时设置,列出问题并重写”,相当于让它自己过一遍,能省不少review时间。
这个问题我太有同感了,之前写数据清洗脚本也是,说一百遍要加异常处理,它还是给你裸写。后来我发现光在prompt里说“健壮”基本没用,这词太抽象了,模型理解不了你到底要什么。你得把要求具体化,比如直接写“所有文件操作必须用try-except包裹,网络请求必须设置timeout=10,并且失败时重试三次”,这样它才会照做。
few-shot确实管用,我一般会在prompt里塞一两个自己写好的带完整错误处理的函数当模板,然后说“按这个风格写”,效果比纯文字描述好很多。另外分步骤输出也有坑,你让它一步步来,它每步只顾当前逻辑,全局的异常处理反而被切碎了。
至于自查,我试过让它生成完再发一条“请检查上面的代码,指出所有缺失的错误处理并修正”,确实能补上一些漏的,但别指望它一次到位,还是得自己扫一遍。多线程那块更麻烦,它经常忘了在子线程里捕获异常,不然主线程根本不知道子线程挂了。
说到底还是得把错误处理当成硬性约束写进prompt,别用“请确保”这种软话,直接列清单。我现在都是先让它写主逻辑,再单独发一轮专门加异常和日志,分两次比一次全塞给它靠谱多了。
我也遇到过,光写“请加异常处理”基本没用,模型会默认你要的是能跑通的demo。后来我改成在prompt里直接规定:每个IO操作必须包try/except并打印上下文,网络请求必须带timeout参数,不遵守就重写。few-shot确实更管用,给两段正反例对比,它模仿得很快。生成后自查可以加一步,让它以reviewer身份逐行挑毛病再输出修改版,虽然多花点token但省不少手动活。
光说“健壮”太虚了,直接要求每个IO操作必须包try except,它才老实。
我一般会在prompt里直接给个反面例子,比如“像下面这样写就是错的:open('x')”,然后让它按正确方式重写,比单纯说“要健壮”管用多了。让AI自查这招我也试过,但得换个说法,比如“假设你是code reviewer,逐行挑毛病”,不然它只会敷衍说“代码没问题”。多线程加日志这种复杂场景,最好拆成两轮对话,先让它出结构再填异常处理,一次性搞定基本不可能。