这项由加拿大女王大学的钟苏珍、邹颖以及布拉姆·亚当斯领导的研究发表于2020年9月的《IEEE软件工程期刊》,研究团队深入分析了现实世界中开发者与大语言模型(如ChatGPT和Claude)之间的对话互动。有兴趣深入了解的读者可以通过arXiv:2509.10402访问完整论文。
在当今这个AI助手满天飞的时代,几乎每个程序员都有过这样的经历:遇到棘手的编程问题时,会习惯性地打开ChatGPT或Claude,输入自己的困惑,然后等待AI给出答案。但这些看似简单的对话背后,究竟隐藏着怎样的规律和问题?开发者们最喜欢向AI请教什么?AI生成的代码质量到底如何?这些问题长期以来缺乏系统性的研究,因为商业AI服务商出于隐私和知识产权保护,很少公开真实的对话数据。
为了填补这一空白,研究团队从WildChat数据集中筛选出了一个名为CodeChat的大规模数据集,包含82,845个真实的开发者与AI对话,总计31万多轮交互,生成了36万多个代码片段,覆盖20多种编程语言。这就像是给程序员与AI助手的日常互动拍了一部长达一年多的纪录片,记录了从2023年4月到2024年5月期间发生的真实编程对话。
研究团队想要回答三个核心问题:开发者与AI的对话有什么特征?开发者最常向AI请教哪些编程话题?AI生成的代码质量究竟如何?通过分析这些海量对话数据,他们发现了许多有趣且实用的现象,这些发现不仅能帮助程序员更好地使用AI工具,也为AI助手的改进提供了重要参考。
一、AI助手的话痨特质与对话模式
当我们分析这些真实对话时,第一个跳出来的发现就是AI助手的"话痨"特质。在CodeChat数据集中,AI回复的长度是开发者提问的14倍!这就像你问朋友"今天天气怎么样",结果他给你讲了一整篇关于气象学原理的论文。具体来说,AI回复平均包含约2000个字符,而开发者的提问只有约971个字符,甚至连Stack Overflow上那些详细回答(平均836字符)都显得简洁许多。
这种冗长并非没有代价。在GPT-4这样的商业模型中,生成文本的成本远高于输入文本——每百万个输出token需要20美元,而输入token只需要5美元。AI助手的啰嗦特质意味着用户需要为这些冗长回复付出更高的使用成本。
更有趣的是对话的互动模式。研究发现,68%的对话都是多轮次的,也就是说,开发者通常不会在第一次提问后就满意地离开,而是会继续追问、修改需求或请求更多功能。这就像你向朋友请教做菜方法,结果发现光是一道菜就需要来回讨论好几轮——先问基本做法,然后问调料比例,接着又想知道素食版本的做法。
通过分析连续提问的模式,研究团队发现了造成多轮对话的主要原因。最常见的情况是"不同用例",占37.8%。这意味着开发者经常在同一个对话中跳转到完全不同的编程任务,而不是针对同一问题深入讨论。其次是"缺失规格说明"(14.8%)和"额外功能需求"(12.8%),这反映了开发者往往在初始提问时没有完整表达自己的需求,需要后续补充说明。
在编程语言的分布方面,AI生成的代码呈现出明显的偏好。Python以31%的比例遥遥领先,这与其在机器学习和数据科学领域的流行地位相符。JavaScript排名第二(9%),但有趣的是,这个比例远高于TIOBE编程语言排行榜中JavaScript的位置,说明AI模型在Web开发相关任务上被频繁使用。Bash和Shell脚本也占据了重要位置(8%),尽管它们在传统编程语言排行榜中并不突出。
AI助手还经常在单次回复中生成多种编程语言的代码。最常见的组合是CSS-HTML(17%的多语言代码),这完全符合Web开发的实际需求。HTML-JavaScript(14%)和Java-XML(12%)的组合也很常见,分别对应Web前端交互和企业级开发场景。
代码片段的长度分析显示,不同编程语言有着显著差异。C语言的代码片段最长,中位数达到26行,这可能与C语言的低级特性和需要更多显式声明有关。HTML和C++分别以25行和23行紧随其后。相比之下,Python和JavaScript的代码片段相对简洁,中位数分别为17行和18行。最简洁的是各种Shell脚本,通常只有3行左右,这符合Shell脚本通常执行简单任务的特点。
二、热门编程话题的真实画像
当深入分析开发者向AI请教的具体话题时,研究团队运用了先进的主题建模技术,从52,086个英文对话中识别出了47个不同的编程话题。这就像给程序员的日常困惑绘制了一幅详细地图,揭示了现代软件开发中最受关注的领域。
排在首位的是Web设计和开发,占到所有对话的9.6%。这个结果并不意外,毕竟在今天这个互联网时代,几乎每个公司都需要网站,每个开发者都或多或少要接触Web技术。在这类对话中,HTML占39%,Python占32.3%,JavaScript占26.6%。开发者们经常询问如何创建响应式布局、如何实现特定的用户界面效果,或者如何让不同浏览器上的网页表现一致。常见的关键词包括"div"(HTML中用于页面结构的标签)和"react"(流行的JavaScript框架)。
紧随其后的是机器学习模型训练和AI机器人部署,占8.7%。这反映了AI技术的火爆程度——不仅普通人在使用AI,连开发者们也在大量学习和应用AI技术。在这类对话中,Python占据了绝对主导地位(72.9%),这符合Python在数据科学和机器学习领域的统治地位。开发者们经常询问如何使用PyTorch进行梯度缩放、如何在Keras中设计深度学习架构,以及如何优化多任务学习工作流程。
第三大类话题是汇编级操作和内存处理,占4.9%。这可能让人感到意外,因为这些都是相对底层的技术。但实际上,这反映了现代软件开发的复杂性——即使在高级编程语言盛行的今天,开发者仍然需要处理底层系统问题。在这类对话中,C++和C语言分别占39.8%和16.4%,这些语言天然适合系统级编程。开发者们询问的问题通常涉及精细的内存控制和底层系统行为,包括汇编指令如"mov"、"ptr"和"eax"的使用。
其他重要话题还包括SQL模式设计和ORM持久化(4.8%)、游戏开发和控制机制(4.6%)、图像处理和分析(4.2%),以及二进制补丁和内存处理(3.4%)。每个话题都有其独特的语言偏好和技术特点,展现了现代软件开发的多样性和复杂性。
特别值得注意的是,不同话题的对话长度存在显著差异。AI增强业务工具和策略自动化话题的平均对话轮次最多,达到3.40轮。这类对话往往涉及复杂的业务逻辑和多变的需求,开发者需要反复澄清和调整,导致更长的交互过程。
在分析话题转换模式时,研究团队发现了一个有趣现象:连续三次"不同用例"的模式出现频率最高,占16.0%。这意味着开发者经常在同一个对话中连续跳转不同的编程任务,就像一个人在同一次购物中买菜、买衣服、又买书,完全没有关联。其次是"额外功能→额外功能→不同用例"(2.3%)和"不同用例→不同用例→额外功能"(1.9%)的模式,这些都反映了开发者在使用AI助手时的探索性和多任务特性。
还有一个值得关注的现象是"错误响应→错误响应→错误响应"的三连模式,占1.9%。这表明AI有时会陷入持续生成错误代码的循环,而没有得到有效纠正。这提醒我们,虽然AI助手很有用,但开发者仍需要保持批判性思维,不能盲目信任AI的每一个回复。
三、AI生成代码的质量真相
为了全面评估AI生成代码的质量,研究团队对五种主流编程语言(Python、JavaScript、C++、Java、C#)的63,685个代码片段进行了深入分析。这就像给AI助手的编程能力做了一次全面体检,结果既有令人惊喜的地方,也暴露了不少问题。
在Python代码中,最突出的问题是命名规范。令人震惊的是,83.4%的Python代码片段都存在无效命名问题,也就是说十个代码片段中有八个都不符合Python的PEP8命名规范。这就像是一个外国人说中文,语法可能对了,但总是用错成语和习惯用法,让人听起来怪怪的。除了命名问题,未定义变量也是一个严重困扰,影响30.8%的代码片段。这就像是在菜谱中突然提到一种没有在材料清单中列出的调料,让人摸不着头脑。
导入错误在Python代码中也很常见,出现在20.8%的代码片段中。相比之下,语法错误只影响8.0%的代码,频率相对较低。有趣的是,在人类编写的Jupyter笔记本代码中,未定义变量的比例是46.3%,而AI生成代码中这个比例类似,说明AI在这方面确实"学到了"人类的编程习惯,包括不好的习惯。
JavaScript代码的问题更加严重。75.3%的代码片段存在未定义变量问题,这比Python还要严重。这就像是在对话中频繁使用对方不认识的人名,造成交流障碍。此外,33.7%的代码包含未使用的变量,14.4%存在语法错误。在语法错误中,最常见的是意外的尖括号,出现在5.8%的代码片段中。与人类在Stack Overflow上编写的JavaScript代码相比,AI生成的代码在语法错误方面表现更差——人类代码的语法错误率只有1.9%,而AI代码高达14.4%。
C++代码的主要问题是缺少头文件包含,影响41.1%的代码片段。这就像是在使用电器时忘记插电源线,代码根本无法编译运行。未使用函数的问题也比较常见,出现在17.8%的代码中。相对而言,C++的语法错误率较低,只有9.4%,这比人类在Stack Overflow上编写的C/C++代码表现要好(人类代码的语法错误率约为20%)。
Java代码的最大问题是缺少必需的注释,这影响了75.9%的代码片段。这反映了AI在代码文档方面的不足,生成的代码往往缺乏必要的说明和注释,影响代码的可维护性。此外,45.3%的代码存在局部变量可以声明为final但没有声明的问题,这在人类编写的Java代码中也很常见(41.1%)。
C#代码的主要问题是无法解析的命名空间,影响49.2%的代码片段。这就像是在使用某个工具时,发现工具箱里缺少必要的配件。此外,42.4%的代码缺少文档注释,10%缺少访问修饰符,9.8%存在格式问题。
在多轮对话中,代码质量的变化呈现出有趣的趋势。在Python代码中,未定义变量错误随着对话轮次增加而恶化,从第1轮的23.5%增加到第5轮的32.8%,这在统计上是显著的变化。这说明随着对话的延续,AI可能会失去对变量上下文的追踪能力。然而,导入相关错误却有所改善,从48.3%下降到44.6%,说明AI在多轮对话中能够逐渐补充缺失的导入语句。
Java代码在多轮对话中表现出了积极的改善趋势。文档违规从第1轮的78.1%显著下降到第5轮的63.4%,局部变量final声明问题也从51.6%改善到41.3%。这表明AI在迭代过程中能够学习和改进代码的文档质量和编程规范。
在JavaScript和C++代码中,主要质量问题在多轮对话过程中基本保持稳定,没有显著的改善或恶化趋势。C#代码的情况类似,各种质量指标在多轮对话中变化不大。
当开发者需要修复AI生成代码中的语法错误时,最有效的提示策略是直接指出错误并要求修复,这种方法在22.8%的成功案例中被使用。其次是通过提问来引导正确解决方案(16.9%)和添加具体指令(16.5%)。这三种方法合计占到成功修复案例的56.2%,说明清晰的错误信号、引导性提问和精确指令是获得正确代码的关键策略。
四、对开发者和工具建设者的启示
这项研究的发现对不同群体都有重要的实际指导意义。对于使用AI助手的开发者来说,首要建议是建立系统化的代码验证流程。由于AI生成的代码经常存在语法错误、未定义变量和维护性问题,开发者不应该直接复制粘贴AI的代码,而应该将其视为初稿,需要经过仔细检查和测试。
具体来说,开发者应该养成使用静态分析工具检查AI代码的习惯。对于Python代码,使用Pylint等工具检查命名规范和变量定义;对于JavaScript,使用ESLint检查语法和变量使用;对于其他语言,也有相应的检查工具。这就像是在发表文章前使用拼写检查一样重要。
在提示工程方面,研究揭示了一些有效的策略。当AI生成错误代码时,最好的修复方法是直接指出具体错误并明确要求修复,而不是含糊其辞地说"这个代码有问题"。同时,为了减少不必要的多轮对话,开发者应该在初始提问时尽可能详细地描述需求,包括预期的功能、使用场景和技术约束。
对于会话型代码助手的开发者,研究建议在产品中集成自动化的代码检查和修正工具。现在的AI助手通常只生成代码文本,但如果能够在生成后自动运行静态分析工具,并尝试修复发现的问题,将大大提高用户体验。一些平台已经开始这样做,比如自动保存AI生成的代码为独立文件,便于用户管理和版本控制。
另一个重要建议是改进多语言代码的上下文管理。研究发现开发者经常需要跨多种编程语言的代码解决方案,但现有的AI助手在维护不同语言间的依赖关系方面还有不足。未来的工具应该能够自动检测和管理跨语言的依赖关系,比如HTML文件中引用的CSS和JavaScript文件。
对于IDE工具的构建者,研究建议将会话功能与现有的开发环境深度整合。现在的做法通常是在IDE中开一个聊天窗口,但更好的方案是让AI助手能够直接理解项目上下文,包括已有的文件、依赖关系和编码规范,从而生成更适合项目的代码。
研究还指出了一个重要的成本效益问题。AI回复比开发者提问长14倍,这不仅增加了使用成本,也可能影响开发效率。工具开发者应该考虑提供更简洁的回复选项,让用户可以选择详细解释还是简洁代码。
对于研究者,这项工作揭示了几个值得深入探索的方向。首先是动态令牌分配策略的研究,如何在保证代码质量的同时减少不必要的冗长输出。其次是针对真实开发场景的基准测试开发,现有的编程能力评估多基于算法竞赛题目,但实际开发中更多涉及Web开发、数据处理和系统集成等任务。
最后,这项研究强调了提升AI代码文档生成能力的重要性。32.1%的Python代码和42.4%的C#代码缺少必要的文档注释,这在实际项目中是无法接受的。未来的AI模型应该能够生成不仅功能正确,而且包含清晰文档的代码。
研究团队的这项工作为我们理解开发者与AI助手的真实交互提供了宝贵的洞察。随着AI技术的不断发展,这些发现将有助于构建更智能、更可靠的编程助手,最终提升整个软件开发行业的效率和质量。对于每一个使用AI编程助手的开发者来说,理解这些发现并相应调整自己的使用方式,将有助于更好地发挥AI工具的价值,同时避免潜在的陷阱。
说到底,AI助手就像是一个知识渊博但有时会犯低级错误的编程伙伴。它能够快速提供灵感和初步方案,但最终的代码质量还是需要人类开发者的把关。随着我们对这种人机协作模式理解的加深,相信未来的编程体验会变得更加高效和可靠。
Q&A
Q1:CodeChat数据集包含多少开发者与AI的真实对话?
A:CodeChat数据集包含82,845个真实的开发者与AI对话,总计31万多轮交互,生成了36万多个代码片段,覆盖20多种编程语言,数据收集时间跨度为2023年4月到2024年5月。
Q2:AI生成的代码主要存在哪些质量问题?
A:不同语言的AI代码存在不同问题:Python代码83.4%存在命名规范问题,JavaScript代码75.3%有未定义变量,C++代码41.1%缺少头文件,Java代码75.9%缺少必需注释,C#代码49.2%存在命名空间无法解析的问题。
Q3:开发者最常向AI请教哪些编程话题?
A:最热门的三大话题是:Web设计和开发(9.6%),主要涉及HTML、JavaScript和Python;机器学习模型训练和AI机器人部署(8.7%),以Python为主;汇编级操作和内存处理(4.9%),主要使用C++和C语言。
好文章,需要你的鼓励
Queen's大学研究团队提出结构化智能体软件工程框架SASE,重新定义人机协作模式。该框架将程序员角色从代码编写者转变为AI团队指挥者,建立双向咨询机制和标准化文档系统,解决AI编程中的质量控制难题,为软件工程向智能化协作时代转型提供系统性解决方案。
西北工业大学与中山大学合作开发了首个超声专用AI视觉语言模型EchoVLM,通过收集15家医院20万病例和147万超声图像,采用专家混合架构,实现了比通用AI模型准确率提升10分以上的突破。该系统能自动生成超声报告、进行诊断分析和回答专业问题,为医生提供智能辅助,推动医疗AI向专业化发展。
上海AI实验室团队发现自回归图像生成模型存在局部依赖、语义不一致和空间不变性缺失三大问题,提出ST-AR训练方法。该方法通过掩码注意力、跨步骤对比学习和跨视角对比学习,让AI"先理解再生成"。实验显示,ST-AR将LlamaGen模型的图像理解准确率提升一倍以上,图像生成质量提升42-49%,为构建更智能的多模态AI系统开辟新路径。