最近在用Cursor做一个小项目,后端是Python FastAPI,前端Vue。我发现只要让AI帮忙加个新接口,它经常顺手把别的函数参数名、甚至数据库查询逻辑给改了。有一次它把分页的offset和limit顺序搞反,测试直接崩了。我试过在prompt里强调“只改指定文件”,但它还是会动到关联的service层。想问下各位,有没有什么靠谱的方式,比如用.gitignore锁定文件,或者有没有更细粒度的指令技巧?还是说这种问题只能靠严格code review兜底?有点迷茫,想听听大家实际工作中的做法。
大家用AI写代码时,怎么让它别“自作主张”改掉原有逻辑?
全部回复
共 104 条试试把需求拆成小任务,每次只给一个函数上下文,改完立刻diff自查,别让它一次动太多。
这问题太真实了,我刚开始用Copilot的时候也差点被坑出工伤。后来我学乖了,不再让AI“直接改”,而是把需求拆成“新增一个独立函数+调用点我自己贴”,相当于只让它做纯增量代码,它就没机会动你现有逻辑了。另外你说的.gitignore锁文件其实没用,那只是版本控制层面的,AI该读还是读;我试过更绝的,把不想让它碰的代码段手动折叠成一行注释,比如把整个service层压成一句“# 这里已有分页逻辑,禁止修改”,效果反而好。但说实话,最靠谱的还是让它先输出diff,你逐行看,尤其是参数名和返回值类型,这俩地方它最爱自作聪明。我现在的流程是prompt里明确写“只允许新增,不允许删除或重命名任何现有标识符”,然后所有改动强制走PR,哪怕小改也得过一遍自己眼睛。这活儿确实没法全自动,AI像个爱显摆的实习生,能力有,但边界感得靠你拿绳子牵着。
code review必须做,AI改完别直接信,重点看diff里动了哪些无关文件。
我一般让AI先出方案再动手,或者用git stash分文件提交,越界就回滚。
试试把改动范围写进AGENTS.md,再配合每次diff严格审查,别指望AI自觉。
我都是让AI先出方案,确认了再动手,比事后改省心多了。
code review确实兜底,但更建议把改动范围写进系统提示词,再配合git diff逐行确认。
试试给AI加个“只准新增,禁止修改”的硬约束,能省不少事。
试试把改动范围直接写进系统提示词里,比如“只允许修改controller层,service和dao层一律不动”,比每次在对话里强调管用。另外Cursor有个rules文件,可以全局约束它别乱碰公共函数,不过说实话最稳的还是没commit前用git diff仔细过一遍,尤其参数顺序这种坑,AI真的不长记性。
试试把改动的文件先git stash,让AI只跑diff后的代码,完了再对比恢复,能挡掉不少乱改。
这事我太有同感了,Cursor有时候“太聪明”反而让人头疼。我现在基本让它改哪就只贴哪一段代码,不贴整个文件,再明确说“不要动其他函数”,能好一点。还有就是改完先git diff看一眼,重点扫参数名和逻辑顺序,比事后debug省心多了。至于锁定文件,.gitignore挡不住AI读代码,只能靠人工把关了。
这个问题太真实了,我拿Claude写Go的时候也老被它“好心办坏事”。后来我学乖了,直接把要改的函数完整贴进prompt,然后明确写“只允许修改这个函数体,其他任何代码行都不准动”,同时把关联文件关掉(Cursor里可以设置只读),效果好了很多。但说实话,AI对上下文的理解还是有边界,关键逻辑还是得靠code review兜底,尤其分页这种容易踩坑的细节,我一般会在测试里加个断言强制锁住。
我自己的土办法是给AI下“最小改动”指令,比如“只新增路由函数,禁止修改现有函数签名”,而且我会把数据库查询那段代码单独摘出来复制给它,不让它自己去找。另外Cursor的diff面板一定要仔细看,每次改动前先对照一遍,发现乱改就立刻撤回重试,别嫌麻烦。至于.gitignore没用,那管不到AI的token,主要还是靠prompt约束和人工盯。
你这种情况我碰到过好多次,后来我索性给AI立了个规矩:任何改动必须先列个清单,说明改了哪几个文件、哪些函数,我确认后才执行。虽然麻烦点,但省得它偷偷改逻辑。还有个技巧是,把核心函数用注释标个“不要动”的标记,比如“// FIXME: do not modify”,AI有时候能识别这种信号。不过
试试把需求拆成小任务,每次只给一个函数上下文,改完立刻跑测试,比锁文件靠谱。
我一般用.git diff实时盯着,发现乱改就ctrl+z,多来几次它就知道边界了。
我一般把改动范围写进AGENTS.md,然后配合git diff逐行看,AI乱改直接revert重来。
这个坑我太懂了,尤其是FastAPI这种带依赖注入的项目,AI一改service层就跟多米诺骨牌似的。我现在的做法是,让AI动代码前先强制它列一个改动清单,把涉及的文件和函数名写出来,我确认过才让它动手,不然它默认就会“顺路优化”别的逻辑。另外你说的.gitignore其实锁不住文件,Cursor读的是整个工作区,更靠谱的是用git diff来分段stash,改坏了直接checkout掉那部分。还有一个土办法,把核心函数的关键参数名写成极其语义化,比如offset改成page_start,AI就不太敢乱动命名,因为它会意识到这是业务语义的一部分。说实话,我觉得完全杜绝不现实,我现在就是靠严格的code review兜底,但会把review重点放在AI动过的diff上,而不是全量代码。你试过在prompt里用“绝对禁止修改除指定函数以外的任何代码”这种强约束吗?我试过几次有效,但偶尔它还是会犯浑,特别是上下文长了以后。
说实话这个问题我太有共鸣了,Cursor这种“过度热心”真的挺头疼的。我现在的做法是,在prompt里明确写“只修改我标出的代码块,其他逻辑一律保持原样,连变量名都不要动”,然后配合codebase的上下文限制,但效果还是有限,毕竟它读到的关联文件太多。
后来我发现一个稍微靠谱点的办法,就是把每次要改动的函数单独抽出来,让它基于这个函数去生成新代码,而不是让它直接改整个文件。另外,我现在会频繁用git diff来对比改动,一旦发现它动了不该动的地方,立刻revert,然后重新给指令,比到最后一次性review要省心得多。
不过说真的,指望AI完全听话不太现实,尤其是涉及service层这种隐式依赖的时候。我现在基本把它当成一个“需要监督的高级实习生”,每个改动都要过一遍diff,关键逻辑甚至要跑一遍测试才算完。你那个offset和limit的例子我遇到过类似的,所以现在凡是涉及分页或者参数顺序的改动,我强制自己在commit前先写个冒烟测试。
对了,你有没有试过给它指定“只允许修改函数体内部,禁止修改函数签名”?我试过几次,感觉比单纯说“只改这个文件”有效一点,但偶尔还是会抽风。说到底,严格code review应该还是最后的底线,工具只能帮我们提高效率,不能替我们把关。
我用的办法是给Cursor单独建一个规则文件,比如AGENTS.md,里面明确写“禁止修改未在本次请求中涉及的文件”,然后每次对话开头把要动的文件路径粘一遍,效果比prompt里嘴上说说强很多。另外.gitignore锁不住它,那玩意儿只对git生效,你不如把不相关目录直接折叠起来,减少它“看到”的机会。不过说真的,code review还是得留,我上周就漏了一个它偷偷改的排序逻辑,上线才被发现。
我都是把要改的函数用// frozen注释标起来,再配合git diff逐行检查,基本能防住乱改。
靠prompt限制确实没用,我现在就让AI只写新函数,改完自己手动接进去,省心多了。
试试在prompt里写“只改我标记的TODO区域,其他一律不动”,配合git diff逐行检查,能省不少事。
我一般让它改完先自己跑一遍相关测试,再手动过diff,AI这玩意儿真不能全信。
我也有类似的困扰,Cursor在跨文件重构的时候确实有点“太主动”了。后来我试了个土办法,效果还行:每次提需求前,先把要改动的函数或类名用注释单独标出来,然后在prompt里写清楚“只允许修改XXX和YYY,其他任何代码都不许动,包括参数名和变量命名”。如果它还是越界,我就直接把整个service层的代码复制进prompt,让它基于这个快照改,而不是让它自己去翻文件——这样它就没机会“自由发挥”了。另外你说的.gitignore锁文件其实没用,那是管版本控制的,管不住AI的上下文窗口。我觉得最靠谱的兜底还是依赖git diff,每次让AI改完,先别急着提交,自己扫一遍diff,看到无关改动直接checkout掉。还有个偏门技巧:给AI设定一个“最小变更原则”,比如在系统提示里写“每次修改必须提供变更理由,否则保持原样”,虽然不能完全杜绝,但至少能让它更谨慎。反正别指望一次就能调教好,这玩意儿跟带新人一样,得反复纠正。
这问题太真实了,Cursor上下文关联性强,改A带出B是常态。我一般是把要改的函数整体复制到prompt里,明确说“只输出这个函数的完整替换代码”,然后自己手动粘贴,不让它碰文件。另外.gitignore对这种逻辑层面的改动没用,它锁的是文件不是代码行为,还是得靠diff审查,重点看参数和返回值有没有变。
试试把需求拆成极小的任务,每次只让AI动一个函数,改完立刻diff检查再继续,别让它一口气干太多活。
这问题太真实了,我一般直接在prompt里加一条“只允许修改我选中的代码块,其他逻辑一律保持原样”,然后配合git diff习惯性看一眼改动。另外Cursor有个好处是可以把service层那些文件单独关掉AI的自动编辑权限,或者用rules文件写清楚哪些路径不能碰。不过说实话,真遇到它头铁改逻辑,还是得靠手动revert,光靠提示词没法根治。
我试过把要改的代码单独抽出来让AI处理,改完再粘回去,这样能减少它乱摸其他文件的概率。但要是项目本身耦合度高,它还是会顺着import去改,挺烦的。现在养成习惯了,每次让它改完先跑一遍测试再提交,不能全信。
我用的时候会故意在prompt里写“这是生产代码,任何非必要改动都是致命错误”,语气重点它好像就收敛些。但分页那个问题我也踩过坑,后来直接给AI看一个写好的测试用例,让它照着测试跑通再交差,比单纯口头强调管用多了。
其实我觉得锁定文件没用,AI还是会读上下文。不如把项目里那些核心业务逻辑写进AGENTS.md里,明确标注“此处禁止自动重构”,然后每次对话前提醒它先读这个文件。我现在就这么干,虽然偶尔还是会漏,但至少比之前三天两头出幺蛾子强。