ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AI写代码实战:从提示词到多AI协作的完整尝试

AI写代码实战:从提示词到多AI协作的完整尝试 1. 从让AI写代码这件事说起我为什么决定认真试一次AI写代码这四个字放在两三年前还像个噱头现在已经成了不少开发者日常工具箱里的一件常规装备。但真正动手试过的人都知道这件事远没有宣传里那么丝滑——你让它写个快速排序它三秒给你一段能跑的你让它改一个真实项目里的老模块它可能给你埋三个坑还一脸自信。我这次做的AI写代码尝试1就是想抛开那些演示级别的玩具例子认真跑一遍完整流程看看它在真实开发场景里到底能扛多少活、会在哪里掉链子、以及一个普通开发者该怎么用它才不至于被它带沟里。这篇内容适合几类人看一是刚接触AI编程、还在纠结要不要把它纳入工作流的开发者二是已经用过但总觉得差点意思、想搞清楚问题出在哪的人三是对AI Agent、多AI协作这些概念感兴趣想看看落地长什么样的技术爱好者。我会把这次尝试的完整链路拆开讲——从任务怎么拆、提示词怎么写、代码怎么验到踩过的坑和最后沉淀下来的经验。核心关键词就三个AI编程、代码生成、AI Agent但我会尽量说人话不堆术语。先说结论免得你看到一半才发现方向不对AI写代码在有明确输入输出、逻辑相对独立、有成熟范式可循的任务上表现相当能打比如写工具函数、补单元测试、做数据清洗脚本、生成正则表达式但在依赖大量隐式上下文、涉及历史包袱、需要跨模块权衡的任务上它更像一个反应很快但记性一般的实习生你得盯着。这个判断不是拍脑袋来的是这次尝试里一段段代码堆出来的。2. 这次尝试到底想验证什么任务拆解与预期设定2.1 为什么我不选写个快速排序这种演示题网上讲AI编程的内容十有八九拿快速排序、斐波那契、二分查找当例子。这类题有个共同特点训练数据里出现过几万遍模型几乎是背下来的。你让它写它当然又快又好但这根本证明不了它在真实工作里的能力。就像考一个厨师你让他炒蛋炒饭他闭着眼都能炒但这不代表他能应付一桌宴席。所以我给自己定的第一个原则是任务必须是我手头真实存在的、有具体业务背景的活。这次我挑的是一个数据处理场景——把一批格式混乱的日志文件解析成结构化数据再做聚合统计。这个任务有几个特点输入格式不统一有的字段缺失、有的分隔符不一致、需要容错、输出要能直接喂给下游分析。它不复杂但足够真实能暴露出AI在处理脏数据这类活上的真实水平。2.2 我把任务切成了哪几块一次性把整个需求丢给AI是我早期最容易犯的错。这次我刻意做了拆分把大任务切成四个相对独立的子任务格式识别先让AI分析几份样本日志总结出有哪几种格式变体各自的字段结构是什么。解析函数针对每种格式写一个解析函数输入一行原始文本输出一个字典。容错与合并写一个统一入口自动判断格式、调用对应解析器、处理异常行。聚合统计基于解析结果做分组计数和简单指标计算。这么切的好处是每一步的输入输出都很明确AI不容易跑偏我也容易验证。坏处是步骤多了步骤之间的衔接需要我自己把控——这恰恰是AI目前最不擅长的地方后面会细说。2.3 我对结果的预期不追求一次成型动手前我给自己打了个预防针不指望AI一次写出能直接上线的代码。我的预期是它能帮我完成60%到70%的机械性工作剩下的30%到40%由我来补逻辑、改边界、加注释。这个预期后来被证明是比较准的甚至在某些环节它还超预期了但在另一些环节又明显不及格。下面按流程一步步说。3. 提示词怎么写才不让AI跑偏我的四段式结构3.1 直接说帮我写个解析日志的代码会得到什么我第一次偷懒就发了这么一句帮我写个Python脚本解析日志文件输出统计结果。结果它给我的东西是这样的假设日志是标准格式、假设字段用空格分隔、假设没有缺失值、假设时间戳格式统一。代码本身写得挺漂亮函数拆分、类型注解、docstring都有但它假设的那个世界根本不存在。我拿真实日志一跑第一行就报错。这就是典型的AI按最理想情况写代码。它不是不会处理复杂情况而是你没告诉它复杂情况长什么样它就默认走最省事的路。所以提示词的第一要务是把现实世界的脏乱差描述清楚。3.2 我最终用的提示词模板长什么样经过几轮调整我固定下来一个四段式结构后面几个子任务都套这个模板效果稳定很多第一段角色与目标。明确告诉它你是一个处理脏数据的Python工程师目标是写一个健壮的解析函数。第二段输入样本。直接贴2到3行真实的、有代表性的原始数据包括那些格式异常的。第三段输出规格。说清楚输出是什么类型、有哪些字段、字段缺失时填什么、异常行怎么处理。第四段约束条件。比如不要引入第三方库必须处理空行遇到无法解析的行返回None而不是抛异常。举个实际用的例子解析函数那步我的提示词大意是你是处理日志数据的Python工程师。下面是三种真实日志样本[贴样本]。请写一个函数parse_line(line)输入一行文本输出字典字段包括timestamp、level、module、message。如果某字段缺失值设为None。如果整行无法解析返回None。只用标准库不要用正则以外的复杂依赖。这么写之后它给出的代码质量明显上了一个台阶至少字段和异常处理都对上了。3.3 为什么给样本比给描述管用这里有个我反复验证过的经验给AI看三行真实数据胜过写三百字文字描述。因为自然语言描述格式时人会自动省略很多显而易见的细节而AI恰恰缺的就是这些细节。你写时间戳在行首它不知道时间戳是2024-01-01 12:00:00还是2024/01/01 12:00还是Jan 1 12:00。但你贴一行真实数据它一眼就看到了。这跟带新人的道理一样。你跟新人说我们的日志格式比较特殊他一脸懵你直接甩给他一份样本文件他看两眼就懂了。AI也是这个逻辑只不过它看的速度快得多。提示贴样本时一定要包含异常样本不能只贴最规整的那几行。异常样本才是决定代码健壮性的关键也是AI最容易忽略的部分。4. 代码生成实测哪些活它干得漂亮哪些活它露怯4.1 表现超预期的部分工具函数和正则这次尝试里AI表现最好的环节是写独立的工具函数和构造正则表达式。比如我让它写一个把各种时间戳格式统一成标准格式的函数它一次就给了能用的版本还主动考虑了时区、闰年这些边界。正则那块更明显——我描述匹配形如[ERROR] module.name: message的行module里可能带点号message里可能有冒号它给的正则基本一次到位我只微调了一处贪婪匹配。这类任务为什么它擅长我的判断是它们有明确的、可穷举的输入输出空间且训练数据里同类模式极多。时间戳转换、字符串清洗、正则匹配这些是编程里的高频动作模型见过无数遍自然手到擒来。4.2 明显露怯的部分跨步骤的状态管理到了容错与合并那步问题就来了。我要求写一个统一入口自动判断每行属于哪种格式、调用对应解析器、并统计各类异常的数量。AI给的代码逻辑上没错但它把格式判断写成了硬编码的if-else链而且判断顺序有问题——某些格式的前缀有重叠它把更宽泛的判断放在了前面导致后面的分支永远进不去。这个bug很隐蔽因为代码能跑只是统计结果偏了。我是拿一批已知答案的数据去对才发现某类日志全被归到了错误的类别里。这说明AI在处理有状态、有顺序依赖的逻辑时容易只顾局部正确、忽略全局一致。它写每个分支时都是对的但分支之间的优先级它没想清楚。4.3 一个具体的翻车现场它优化掉了我需要的逻辑最让我哭笑不得的一次是我让它优化一段已经能跑的解析代码。它确实优化了——把一段显式的字段校验删掉了理由是这些校验是冗余的因为前面的正则已经保证了格式。听起来有道理但问题是前面的正则只保证了大框架字段级的边界它管不到。结果优化后的版本遇到某些畸形输入直接抛异常而原版是能优雅降级的。这件事给我的教训是让AI优化代码时必须明确告诉它哪些行为是不能改变的。否则它会按代码更短更优雅的目标去改而工程上我们往往更看重行为更稳更可预测。优雅和健壮很多时候是矛盾的。任务类型AI表现我的处理方式独立工具函数优秀基本一次可用直接采用微调边界正则表达式构造优秀偶有贪婪匹配问题采用后补测试用例跨步骤状态管理一般易出顺序/优先级bug重写核心逻辑保留框架代码优化有风险可能删掉必要逻辑明确约束后再让它改5. 验证AI代码的三板斧我是怎么发现那些坑的5.1 第一板斧拿真实数据跑别拿构造数据跑AI生成的代码用你自己构造的标准数据去测大概率是过的。因为你和AI对标准的理解可能一致但真实数据从来不标准。我的做法是代码一生成立刻拿生产环境脱敏后的真实数据跑一遍。这一步能筛掉至少一半的隐藏问题尤其是格式假设类的错误。真实数据里那些意外比如某行多了个尾随空格、某个字段偶尔是空字符串而不是None、某条记录的时间戳是未来时间这些才是检验代码的试金石。构造数据永远构造不出这些惊喜。5.2 第二板斧对拍——用已知答案反推对于统计类、聚合类的代码光看它跑不报错是不够的你得知道结果对不对。我的办法是手工算一小批样本的正确答案然后跟代码输出对拍。这次就是靠对拍发现了前面说的格式判断优先级bug——手工数出来ERROR类有47条代码统计出来只有12条差距太大一查就查到了。对拍的样本不用多几十条就够但一定要覆盖各种格式变体和异常情况。这一步花的时间远比事后在生产环境里排查数据错误要划算。5.3 第三板斧读代码重点读它没写的地方AI写的代码读的时候要特别关注它没处理的情况。它处理了的通常没问题它没处理的才是雷。比如它写了字段缺失返回None但没写字段类型不对怎么办它写了正常行解析但没写空行、注释行怎么跳过。这些沉默的角落是bug的高发区。我现在的习惯是拿到AI代码先通读一遍边读边问自己如果输入是X它会怎样这个X包括空值、超长字符串、特殊字符、编码异常、并发访问。问着问着坑就浮出来了。注意不要因为AI代码看起来专业就放松警惕。类型注解、docstring、漂亮的函数拆分这些都不代表逻辑正确。形式上的规范反而容易让人产生信任错觉。6. 从单次生成到多AI协作我试出来的分工模式6.1 一个AI干到底 vs 多个AI分工单次让一个AI从头写到尾最大的问题是上下文越堆越长它越到后面越容易忘前面。这次尝试到第三步时我已经把前两步的代码和讨论都放在同一个对话里结果它开始记混——把第一步的字段名用到了第三步还振振有词。这不是它笨是长上下文里的信息干扰。后来我换了个思路不同环节用不同的对话甚至不同的模型。格式识别用一个对话解析函数用一个聚合统计再用一个。每个对话只带必要的上下文干净利落。这就是多AI协作最朴素的落地形态——不是让几个AI互相聊天而是让它们各管一段我来做衔接。6.2 我实际用的分工谁负责生成谁负责审查更进一步我试了让一个AI生成、另一个AI审查的模式。具体做法是把生成的代码和需求描述一起丢给第二个AI让它找出这段代码在边界情况下的问题。效果出乎意料地好——第二个AI经常能挑出第一个AI埋的雷因为它的视角是挑刺而不是实现注意力分配完全不同。这有点像代码评审。写代码的人容易陷入自己的思路看不出问题换个人来看一眼就发现这里没处理空值。AI之间也是这个道理。当然审查的AI也会误报说一些其实没问题的地方所以最终判断还是得我来做。6.3 多AI协作的边界别指望它们自己对齐需要泼盆冷水的是多AI协作不会自动产生一致性。你让A写解析、B写统计如果两边对字段名的理解不一致最后拼起来就是错的。衔接的活必须人来做——定义好接口、字段、数据格式然后分别喂给不同的AI。指望它们自己商量好目前还不现实。所以我的定位很清楚AI负责生成候选方案我负责定义契约和最终裁决。这个分工下效率提升是实打实的但前提是我自己得清楚要什么。7. 这次尝试沉淀下来的几条硬经验7.1 提示词里必须写死的三件事复盘下来有三样东西如果提示词里不写死AI几乎必然会给你埋坑异常处理策略遇到坏数据是抛异常、返回None、还是跳过不写清楚它默认抛异常而生产环境往往需要跳过。依赖限制能不能用第三方库不写清楚它可能给你引入一个你环境里没有的包。输出格式的精确规格字段名、类型、缺失值表示这些必须逐条列明不能靠它猜。这三件事写清楚返工率能降一大半。我现在的提示词模板里这三块是固定段落每次只改具体内容。7.2 代码审查不能省但可以分层审AI代码的审查我分两层第一层看逻辑对不对这层必须我自己来因为只有我知道业务规则第二层看边界全不全这层可以交给另一个AI辅助。两层分开效率高也不容易漏。第一层审查的重点是它有没有理解错我的意图第二层的重点是它在极端输入下会不会崩。这两类问题的性质完全不同混在一起审容易顾此失彼。7.3 把AI当快枪手而不是架构师这是我最想强调的一点。AI在给定明确规格快速产出实现这件事上极强但在决定该做什么、怎么组织、边界在哪这件事上很弱。所以正确的用法是我来做架构和规格它来做实现。反过来让它先设计再实现往往得到一堆看似合理但不符合你实际情况的方案。我这次尝试里凡是我想清楚规格再让它写的基本都顺凡是我自己都没想清楚就丢给它的返工都多。这个规律非常稳定。8. 关于AI编程我现在的真实态度试完这一轮我对AI写代码的态度从半信半疑变成了有条件信任。条件就是前面说的那些任务要拆清楚、规格要写死、样本要给全、结果要对拍、审查不能省。满足这些条件它确实能帮我省下大量敲键盘的时间尤其是那些重复性的、有成熟范式的活。不满足这些条件它就是个会自信地写出错误代码的快枪手你还得花更多时间去debug。我也不觉得AI会很快取代开发者。这次尝试里真正决定成败的那些判断——任务怎么切、接口怎么定、边界在哪、结果对不对——全都是人在做。AI把写这一步加速了但想这一步还是得靠人。所以与其焦虑被取代不如把精力放在提升自己想清楚的能力上因为那才是AI暂时替代不了的部分。后续我打算继续试的方向是把它接进更完整的开发流程里比如让它参与写测试、做代码迁移、辅助排查线上问题。这些场景比单纯的生成代码更复杂也更接近真实工作的样子。等有新的体会再接着分享。
返回列表