如果不断要求 AI 改进代码会怎样?
微wx笑 2025-01-10【人工智能】 0 0关键字: AI 代码生成
最近看到一篇文章探讨了通过不断要求大型语言模型(LLM)改进代码,能否使代码变得更好的问题,并通过实验展示了这一过程及其结果,以下是文章的核心内容概述:实验背景作者提到在2023
实验背景
作者提到在2023年11月,OpenAI允许ChatGPT在网页界面内使用DALL-E 3生成图像后,曾出现一个短暂的网络迷因,用户给LLM一个基础图像并不断要求其“使其更_X_”,结果发现这些图像最终都会变得非常相似且无趣,但这一现象从学术角度来看仍具有一定的趣味性。
实验过程
初始尝试
:作者最初并不喜欢使用LLM代码辅助工具,如GitHub Copilot,因为频繁在“LLM自动补全代码”和“检查LLM生成代码是否正确”之间切换思维,使得使用AI带来的任何生产力提升都微乎其微。但Claude 3.5 Sonnet的出现改变了作者的看法,其对各种提示(尤其是编程提示)的出色遵循能力令人印象深刻。 实验提示
:作者为实验编写了一个简单的编程提示,要求使用Python解决一个既简单又可被大量优化的问题——给定一个包含100万个1到100000之间的随机整数的列表,找出数字之和为30的最小和最大数字之间的差值。 迭代改进
: 第一次迭代
:Claude将代码重构为一个Python类,使其更具面向对象特性,并通过整数运算而非类型转换来计算数字之和,还预先计算了所有可能数字的数字之和并存储在字节数组中,以避免重复计算,使代码速度比初始版本快2.7倍。 第二次迭代
:Claude引入了多线程和numpy的矢量化操作,将大列表分成可以独立处理的块,并实现了计算数字之和的矢量化方法,但这一实现存在一些问题,如生成子进程导致无法直接内联运行等,修复这些问题后,代码速度比基础实现快5.1倍。 第三次迭代
:这次Claude返回的实现声称使用了更高级的技术和现代Python特性,但实际上并没有显著的算法改进,甚至在数字之和的计算上出现了退步,代码库也变得更加臃肿,性能比上一实现略有下降,现在比基础实现快4.1倍。 第四次迭代
:Claude提供了声称具有“尖端优化和企业级特性”的实现,创建了更多优化,如使用numba Python库调用JIT编译器,以及使用Python的asyncio进行并行化等,尽管async和numba在Python中都是并行化的方法,可能会导致冗余和开销,但经过测试,算法速度极快,每次运行约6毫秒,比原始实现快100倍。
有方向的提示工程
作者指出,为了从LLM中获得最佳结果,仍然需要进行提示工程。通过明确告诉LLM具体想要什么,甚至给出一些想要的例子,可以比构建这些提示所需的努力更客观地提高LLM的输出质量。 重新实验
:作者使用系统提示和用户提示重新进行了代码优化实验,明确要求LLM编写完全优化的代码,并给出了具体的优化示例。这次的初始实现就使用了numpy和numba,并使用整数运算来计算数字之和,代码比初始实现更简洁,运行速度也更快,平均11.2毫秒,比初始实现快59倍。 后续迭代
:后续的迭代中,作者通过更详细的提示让Claude进一步优化代码,虽然过程中出现了一些问题,如错误的数字之和实现、对numba并行化的误解等,但最终经过调整,代码运行速度极快,比原始基础实现快95倍。
结论与展望
通过实验,作者发现不断要求LLM改进代码确实可以使代码变得更好,但“更好”的定义因人而异。使用通用的迭代提示可以使代码在功能和速度上得到客观的提升,而有方向的提示工程则能更快、更一致地提升代码性能,但也更容易引入微妙的错误。 作者指出,尽管LLM提出了一些有趣的思路和工具建议,但它们不会很快取代软件工程师,因为需要深厚的工程背景才能识别出真正的好主意,以及考虑其他特定领域的约束。LLM无法在没有指导的情况下区分平均代码和高性能代码。 作者还提到,尽管LLM在实验中没有识别和实现一些优化方法,如去重和排序搜索等,但它们确实提出了一些有价值的想法。此外,作者暗示了使用Rust等其他语言进行高性能编程的可能性,并确认Claude 3.5 Sonnet能够生成符合PyO3规范的Python和Rust代码,但这将是另一个话题的内容。 最后,作者以一种幽默的方式指出,虽然让LLM改进代码是一种更实际的AI使用方式,但也可以让它们尝试“使其更酷”,尽管结果可能参差不齐。
我个人的使用感受:
代码质量提升
逻辑优化
:AI 会不断分析代码的逻辑结构,通过多次改进,能够使代码逻辑更加清晰、简洁。例如,对于一个复杂的排序算法代码,AI 可能会逐步去除冗余的判断语句,将嵌套过深的循环结构进行合理拆分,使代码更容易理解。像将一个包含多个嵌套 if - else 的排序逻辑,优化为几个简洁的函数调用,每个函数负责不同的排序环节,这样不仅减少了代码量,还提高了代码的可读性。 性能增强
:AI 可以根据代码的运行效率进行优化。它会考虑算法的时间复杂度和空间复杂度。比如在处理大数据量的搜索算法时,AI 可能会将原本的线性搜索代码逐步改进为二分查找(对于有序数据)或者哈希表查找(对于无序数据)等更高效的搜索方式,从而大大减少代码的执行时间,提高程序的性能。 健壮性提高
:通过不断改进,AI 能够帮助代码更好地应对各种边界情况和异常情况。例如,在处理网络请求的代码中,AI 可以增加对网络超时、数据格式错误等异常情况的处理逻辑。原本可能只是简单地抛出一个异常,经过 AI 多次改进后,代码可以合理地重试请求、记录错误日志并给出友好的错误提示,使程序在面对复杂环境时更加稳定可靠。 知识积累与创新
AI 学习进步
:对于 AI 来说,每一次改进代码的过程都是学习的机会。它会接触到不同类型的代码问题和解决方案,不断丰富自己的知识库。比如在处理图像处理代码时,AI 会学习到各种图像滤波、边缘检测等算法的优缺点,以及如何根据不同的图像应用场景(如医学图像分析、卫星图像识别等)进行代码优化。随着经验的积累,AI 对于类似问题的解决能力会越来越强,能够更快地提出有效的改进方案。 激发创新思维
:不断要求改进代码可能会促使 AI 产生一些创新的想法。例如,在优化一个机器学习模型训练代码的过程中,AI 可能会尝试引入新的优化算法(如自适应学习率算法),或者结合不同的模型架构(如将卷积神经网络和循环神经网络进行融合)来改进代码。这些创新的想法有可能带来新的技术突破,为软件开发领域带来新的思路和方法。 开发效率提升
减少人工调试时间
:当 AI 能够持续改进代码时,很多原本需要人工花费大量时间调试的问题可以由 AI 来解决。例如,在开发一个复杂的软件系统时,其中涉及到多个模块之间的数据交互。人工调试这些模块之间的接口可能需要花费数天甚至数周的时间来查找数据错误、通信协议不匹配等问题。而 AI 可以快速分析代码,通过改进代码来修复这些问题,大大缩短开发周期,提高开发效率。 代码复用性增强
:经过 AI 多次改进的代码往往具有更好的结构和通用性。例如,一个原本只适用于特定数据格式处理的代码片段,在 AI 的优化下,可以被改写成一个通用的数据处理函数库。这个函数库可以被不同的项目复用,开发者只需要根据具体需求调用相应的函数即可,减少了重复编写相似代码的工作量,提高了开发的整体效率。
资源消耗问题
计算资源压力
:每次要求 AI 改进代码,AI 都需要消耗大量的计算资源来进行代码分析、优化算法的运行等操作。如果频繁地要求改进,尤其是对于大型复杂代码项目,这会对服务器的 CPU、内存等资源造成巨大压力。例如,一个包含数百万行代码的大型软件系统,AI 在进行代码改进时可能需要调用复杂的深度学习模型来分析代码模式,这可能会使服务器的 CPU 使用率长时间保持在高位,甚至可能导致服务器过载,影响其他正常的服务运行。 能源浪费
:从能源角度来看,频繁的代码改进请求也会导致能源的浪费。服务器为了处理这些请求需要持续运行,消耗大量的电力。如果这种改进请求是不必要的或者改进效果微乎其微,那么这些能源消耗就是一种浪费。而且在一些大规模的数据中心,这种浪费会进一步放大,对环境也会产生一定的负面影响。 过度优化风险
可维护性降低
:虽然代码在性能等方面可能得到了优化,但如果过度优化,可能会使代码变得难以维护。例如,为了追求极致的性能,AI 可能会将代码改写成高度复杂的形式,使用大量的位运算、内联汇编等技巧。对于后续的开发者来说,理解这样的代码会非常困难,当需要对代码进行修改或者添加新功能时,可能会因为代码结构过于复杂而无从下手,增加了维护成本。 引入新问题
:在不断改进代码的过程中,可能会引入新的问题。比如,AI 在优化代码以提高并发处理能力时,可能引入了新的线程安全问题。原本代码在单线程环境下运行良好,经过 AI 改进后,多个线程同时访问共享资源,却因为缺乏合适的同步机制(如锁的使用不当)而导致数据错乱。而且随着代码的不断变化,新问题可能会不断出现,需要花费额外的时间和精力来修复。 依赖风险
对 AI 的过度依赖
:如果开发者频繁地依赖 AI 来改进代码,可能会逐渐失去自己独立思考和解决问题的能力。例如,一些初级开发者在遇到代码问题时,不再主动去学习相关的编程知识和调试技巧,而是直接交给 AI 处理。长此以往,他们可能会对 AI 产生过度依赖,在没有 AI 辅助的情况下,面对一些简单的代码问题也会束手无策,不利于个人编程技能的提升。 AI 算法局限性
:AI 的代码改进能力是基于其算法和训练数据的。如果 AI 的算法存在缺陷或者训练数据不全面,那么它改进后的代码可能会有潜在的问题。例如,AI 的代码优化算法可能没有考虑到某种特殊的硬件架构,导致优化后的代码在该硬件上运行反而出现性能下降的情况。而且当 AI 的算法更新或者训练数据发生变化时,之前改进的代码可能需要重新评估和调整,给开发工作带来额外的负担。
本文由 微wx笑 创作,采用 署名-非商业性使用-相同方式共享 4.0 许可协议,转载请附上原文出处链接及本声明。
原文链接:https://www.ivu4e.cn/blog/ai/2025-01-10/2017.html
下一篇:返回列表