最近在用某款AI Agent写一个内部工具的后端接口,用的Python FastAPI。我发现它生成CRUD和基础查询逻辑确实快,但一涉及事务处理、并发控制或者稍微复杂的ORM关联,就会悄悄埋雷——比如漏掉session.commit,或者async函数里混入阻塞调用。我明明在prompt里写了“注意事务安全”,它还是会犯低级错误。每次都要我agent review时手动挑出来,感觉效率反而没提升多少。是我prompt写得太笼统?还是这类工具目前的上限就这样?有没有用过的朋友分享下你们的workflow?比如是不是应该让它先生成测试用例再写实现?
AI编程助手生成的代码总有小bug,是我姿势不对还是工具就这样?
全部回复
共 52 条说实话你这个问题我太有共鸣了,我最近拿AI写Go的并发任务也踩了类似的坑。我觉得真不是单纯prompt写细点就能解决的,工具对“业务上下文”的理解其实很浅,你写“注意事务安全”它顶多知道要加装饰器,但session生命周期、嵌套事务这些它压根没概念。我更倾向于把AI当成一个超级快的初级程序员,而不是架构师,我现在的workflow是先让它把接口骨架和正常路径跑通,然后我自己专门去补事务、锁、边界条件这些“脏活”。至于让它先生成测试用例再写实现,我试过一次,效果一般,因为它生成的测试用例跟它的实现是同一个思维模型,容易一起错,你不如自己手写几个关键场景的测试,再丢给AI去改代码来通过测试。说到底这工具现在就是个加速器,不是替代者,你得把review当成流程的固定环节,别指望一次生成就能用,心态放平反而省时间。
说实话你这情况我太熟了,之前用某款AI写Go服务也是这德行,CRUD利索得飞起,一到事务边界就开始表演花式埋雷。我觉得真不是prompt写得笼统的问题,是工具对“业务正确性”的理解压根没到那个层级,它擅长的是语法和模式拼接,而不是并发和状态一致性的推演。你让它先生成测试用例这思路我试过,但得小心它连测试都写得跟实现一样天真,比如mock掉事务回滚然后断言成功,反而给你一种安全的错觉。我现在workflow是让它写单文件、无状态的小函数,然后自己手动包一层service层处理事务和锁,相当于把它当个高级自动补全用。另外有个偏方,你可以在prompt里明确要求它“假设数据库连接会随时断开”,或者“每个写操作后必须显式打印日志”,有时候能逼它多生成几行防御性代码。但说到底,这类工具目前的上限就是让你从零写变成改bug,省的是打字时间,省不了逻辑思考时间,你要是追求效率,不如把精力花在让agent review的规则更严格上。
说实话你这情况我太懂了,跟工具本身关系不大,主要是它对“事务安全”的理解停留在字面意思上,你让它写代码它确实写了,但底层那些上下文约束它根本感知不到。我试过把需求拆成更小的单元,比如单独让它生成一个带commit的service函数,再手动拼装,出错率会低一些,但确实费神。至于先写测试再生成实现,我觉得方向是对的,因为测试用例本身就是一种“行为约束”,能逼着它把边界条件想清楚,不过前提是你自己得先把测试逻辑想明白,不然它照样给你生成一堆假通过的空测试。另一个坑是async和同步混用,这基本是模型对FastAPI底层事件循环理解不够,我后来直接在prompt里写死“所有IO操作必须用async库,禁止requests”,效果比什么“注意事务安全”强多了。说到底,这类工具目前还是“高级自动补全”,不是真正的工程师,你得把它当一个手速很快但经常走神的初级同事,代码review省不了。我的workflow现在是让它生成第一版,然后我自己过一遍逻辑,再拿它当结对编程的键盘,专门负责改我指出的问题,这样反而比全自动快。你要是找到能彻底解决事务问题的prompt,记得回来踢我一下,我也想学。
说实话真不全是你的问题,这类工具对“事务边界”和“异步上下文”的理解目前就是很表面,你prompt写“注意安全”它顶多给你加个装饰器,该漏的commit还是漏。我自己试过让它先写测试再写实现,反而容易因为测试太理想化而忽略真实并发场景,倒不如把关键链路拆成小函数,让它一段段生成,你人工盯着连接和session的生命周期。还有个小技巧,让它跑一遍mypy或者pyright再交给你,能过滤掉一部分低级错误,但逻辑雷还是得靠code review。
说实话这真不是姿势问题,我试过把事务边界、锁的粒度全写进prompt里,它该漏还是漏。后来我干脆把复杂逻辑拆成几个小函数让它逐个生成,再自己组装,bug率明显降了。测试用例驱动那个思路我觉得可行,但别指望它自己写全,得你给具体断言场景。现在我的workflow基本是让它出骨架,关键部分手写,review时间反而省了。
说实话你遇到的情况我太熟了,尤其是async函数里塞阻塞调用这种,我甚至怀疑模型对“异步安全”的理解就是表面功夫。我试过把“事务安全”拆成具体规则,比如明确写“每个写操作后必须显式提交,异常时回滚”,但效果还是不稳定,它该漏还是漏。后来我改成让它先生成pytest的测试用例,故意把并发和事务边界的情况写进去,再让它跑测试去改代码,反而靠谱很多——相当于让工具自己当裁判,而不是靠prompt约束。不过我得说,像FastAPI这种框架,ORM的session生命周期本来就容易踩坑,模型可能压根没学会“每个请求独立session”这种最佳实践。你也别全怪自己姿势,这类工具目前更像是“高级补全”,离“理解业务正确性”还差得远。我现在基本把它当结对程序员用,CRUD让它写,复杂的service层逻辑自己来,测试反而成了最花时间但最值得的部分。
说实话这真不是姿势问题,AI编程助手对业务骨架的生成能力确实强,但一到事务边界、并发这些“隐性状态”就露馅,因为它们本质是概率模型,不是真理解业务语义。我现在的workflow是让它先写核心逻辑,再自己补一层显式的异常处理和session管理,prompt里写“注意事务安全”远不如直接给一段你项目里的正确代码示例当few-shot来得管用。至于先生成测试用例再写实现,我试过对简单CRUD有用,但复杂场景下它生成的测试本身可能就带同样的坑,反而更费劲。你用的哪款工具?如果是闭源的,可能还得等它们针对框架做更细的专项训练,现阶段真得靠人肉兜底。
这问题我太熟了,FastAPI加异步ORM这块确实是重灾区,你描述的那些坑我基本都踩过一遍。我现在的做法是prompt里直接给约束模板,比如明确写“所有涉及写操作的路由必须显式commit,async函数内禁止调用同步DB驱动”,比笼统说“注意事务安全”管用得多。另外你说的先写测试再写实现,我觉得方向对,但顺序得反过来——让它先列出接口的边界条件和失败场景,再生成测试,最后才写实现,这样它埋雷的空间会小很多。不过说实话,复杂事务和并发这块,目前这类工具的上限确实就那样,它擅长的是模式化的代码,不是需要推理状态一致性的逻辑。我现在基本把它当成高级代码补全,核心事务逻辑还是自己写,让它帮我补测试和文档。你要是找到更好的workflow也分享一下,这块我也还在摸索。
正常,我都是让它先写测试再写实现,跑完测试才敢用。
我现在的做法是让它先写接口定义和测试用例,跑通测试再让它填实现,这样至少能逼它把事务边界想清楚。但说实话,async里混阻塞调用这种坑还是得靠自己盯,它好像对事件循环没什么概念。提示词写“事务安全”基本没用,得具体到“每个写操作必须显式commit,异常时rollback”这种粒度才行。
先让它写测试再写实现这招我也在用,确实能逼它把边界情况想全。
先让它写测试再写实现确实管用,我最近也这么干,bug少了不少。