本文可在 CC 4.0 许可下在 arxiv 上获取。
作者:
(1) 周希宇,武汉大学计算机学院,中国武汉;
(2) 彭亮,武汉大学计算机学院,中国武汉;
(3) 李增阳,华中师范大学计算机学院,中国武汉;
(4) Aakash Ahmad,莱比锡兰卡斯特大学计算与通信学院,德国莱比锡;
(4) Mojtaba Shahin,皇家墨尔本理工大学计算技术学院,澳大利亚墨尔本;
(4) Muhammad Waseem,芬兰于韦斯屈莱大学信息技术学院。
在本节中,我们报告三个 RQ 的研究结果并提供主要发现的分析。在第 III-A 节中,我们介绍了问题的类型,而在第 III-B 节和第 III-C 节中,我们分别介绍了相应问题的原因类型和解决方案。问题类型的结果分为两个级别:类别(例如,建议内容问题)和类型(例如,不太有效的建议)。同时,原因和解决方案的结果仅按类型进行组织(例如,使用合适的版本)。需要注意的是,结果中仅提取并提供已被证明导致问题的原因以及能够解决问题的解决方案。因此,并不是所有的问题都有相应的原因和解决方案。我们提供带有“#”符号的示例,该符号表示提供的数据集中的“GitHub Issue ID”、“GitHub Discussion ID”或“SO Post ID”[13]。
A. 问题类型 (RQ1)
图 2 展示了从我们的数据中提取的问题的分类。可以看出,使用问题(56.9%)占 Copilot 用户面临的大部分问题。此外,大量用户根据用户体验和需求提出了功能请求(15.3%)。还有一部分用户在不同环境下使用 Copilot 时遇到过兼容性问题(15.3%),而较小比例的用户则被认为是建议内容问题(4.9%)、用户体验问题(4.2%)以及版权和政策问题(3.4%)。
• 功能使用问题是指Copilot 提供的各种代码生成相关功能出现异常。除了提供代码建议之外,Copilot 还提供各种交互功能来更好地与用户互动,例如“上一个/下一个建议”、“查看所有建议”以及配置接受建议的快捷键。用户在使用这些功能时可能会遇到异常情况。例如,用户报告“Copilot 不再在 PyCharm 上提出建议”(讨论#11199)。
• 设置/操作问题是指Copilot 初始化或操作期间发生的错误或故障,通常涉及运行时异常。这些问题可能会阻止 Copilot 正确运行,或导致其意外崩溃,例如当用户遇到“VSCode 中的 copilot 启动错误”时(讨论#30996)。
• 身份验证失败是指使用Copilot 时与用户登录和身份验证困难相关的问题。 Copilot 要求用户在使用该服务之前登录其 GitHub 帐户。只有具有访问权限(包括付费订阅、学生身份验证等)的用户才能使用Copilot的代码生成服务。在认证过程中,用户可能会遇到各种与之相关的问题,导致无法使用Copilot。例如,一位用户在论坛中提到“升级后我无法登录”(讨论#18132)。
• 访问失败是指用户无法访问Copilot 服务器的情况,这通常涉及与服务器连接相关的错误。用户可能会遇到类似“GitHub Copilot 无法连接到服务器”的错误消息(讨论#11801)。
• INSTALLATION ISSUE 是指Copilot 安装过程中遇到的问题,包括安装错误、找不到安装方法以及其他相关问题。例如,某些用户可能会遇到“安装 Copilot 时出错”等问题(讨论#17250)。
• 版本控制问题是指用户在调整Copilot 或其运行环境(如IDE)的版本时遇到的问题,包括无法升级Copilot 版本或升级后仍提示升级等异常问题。例如,用户在 IntelliJ IDEA 中使用它时说“copilot 插件无法更新”(讨论#17298)。
分析:作为一款相对较新的AI代码产品,我们在用户与Copilot交互的各个阶段都发现了使用问题。用户也倾向于报告这些问题并寻求帮助,这使得使用问题成为最普遍的问题类别。功能使用问题 (233)、设置/操作问题 (201) 和身份验证失败 (199) 是排名前三的类型。我们将前两类问题出现频率较高的原因归咎于Copilot功能设计和稳定性方面的缺陷,同时也受到用户环境和操作的影响。第三种类型主要与 Copilot 要求用户使用其 GitHub 帐户登录时出现的特定详细信息相关。
2)功能请求(15.3%):功能请求是指用户在使用Copilot时根据自己的体验和实际需求请求添加或改进的功能。这些功能请求不仅有助于改善Copilot的用户体验,也有助于探索AI代码生成工具如何更好地与开发者交互。该类别进一步分为四种类型,如下所示。
• 功能请求是指在Copilot 中开发新功能的请求,通常源于用户的真实需求和使用该工具时遇到的困难。例如,用户建议添加“代码解释功能”可以增强 Copilot 的实用性(讨论#7509)。
• 集成请求是指要求Copilot 在某些平台上可用或与其他插件集成的请求类型。这主要是由于部分用户希望在特定环境下使用Copilot。例如,一位用户呼吁“支持 Intellij 2022.2 EAP 系列”(讨论#17045)。集成的需求也在一定程度上反映了Copilot在开发者中的受欢迎程度。
• UI 请求是指用户对Copilot 用户界面(UI) 进行更改的请求,这可能涉及修改Copilot 图标的外观、调整使用提示以及其他相关方面。这些要求一般都是为了改善Copilot的视觉效果和用户体验。例如,用户可以请求添加“状态指示器”(问题#163)以提供有关 Copilot 当前工作状态的信息。
• PROFESSIONAL COPILOT VERSION 是指某些用户对Copilot 专业版本的请求。
这些用户通常是某些公司内部团队的开发人员,他们希望在实际工作中获得更专业、更可靠的代码生成服务。具体来说,他们对Copilot代码的可靠性、安全性,以及团队认证等方面都有更高的要求。
分析:对于功能请求 (123),我们观察到用户普遍希望在配置 Copilot 时具有更大的灵活性,以更符合他们的开发习惯。例如,常见的请求包括能够逐字接受 Copilot 的建议,并指定 Copilot 应在文件类型或代码开发范围方面自动操作的位置。更具创新性的需求包括需要 Copilot 根据整个项目提供建议,以及代码解释和聊天功能等功能 [15],这些功能已经在 Copilot X 中作为技术预览版推出。集成请求 (75) 反映了开发人员希望在他们熟悉的环境中使用 Copilot。这对 Copilot 团队提出了更高的要求,因为我们已经发现了大量的兼容性问题。
3) 兼容性问题(15.3%):此类别涵盖因 Copilot 与其运行时环境不匹配而产生的问题。 Copilot 在各种 IDE 和文本编辑器(例如 VSCode 和 IntelliJ IDEA)中作为插件运行,环境的复杂性和其他插件的干扰可能会导致兼容性问题的增加。这些问题进一步分为四种类型,如下所述。
• 编辑器/IDE 兼容性问题是指因Copilot 与其IDE 或编辑器之间不匹配而引起的问题。这些问题通常表现为 Copilot 无法在特定 IDE 或编辑器中正常运行。
• 插件兼容性问题是指当Copilot 和其他插件处于活动状态并在同一环境中协同工作时出现的一种匹配问题。此类问题可能会导致 Copilot 和其他插件部分或完全故障,通常可以通过禁用 Copilot 或其他插件等故障排除方法来识别。例如,一名用户报告“键盘快捷键与 Emmet 冲突”(问题 #47),导致他无法接收 Copilot 生成的代码建议。
• 框架兼容性问题是指Copilot 与其运行的框架之间的一种兼容性问题。一个常见的例子是 Copilot.vim [16](专门为 Vim 设计的 Copilot 官方版本)与 Node.js 之间的兼容性问题。
• 键盘兼容性问题是指在某些不常见的键盘布局中无法使用Copilot 功能的情况。例如,使用德语键盘布局的用户无法使用 Copilot 的大部分代码生成相关功能。 (讨论#7094)。
分析:兼容性问题源于用户使用Copilot的复杂操作环境,以及Copilot本身的兼容性鲁棒性。在编辑器/IDE 兼容性问题 (132) 的情况下,正式推荐用于 Copilot 使用的平台 VSCode 收到了更多报告的兼容性问题。我们还在其他广泛使用的 IDE 中发现了类似的问题,例如 Visual Studio、IDEA 和 PyCharm。插件兼容性问题 (72) 的出现不太可预测,典型问题涉及与其他代码完成工具的冲突。
4)建议内容问题(4.9%):此类问题是指与Copilot生成的代码内容相关的问题。代码建议的生成是Copilot等AI代码生成工具的核心功能,建议的质量直接决定用户是否会采纳。因此,生成代码的内容自然是用户、研究人员和 Copilot 团队关注的领域。这些问题又分为七种具体情况,具体如下。
• 低质量建议是指Copilot 无法充分理解上下文以生成有用代码的情况。此类代码建议可能没有任何语法错误,但由于质量较差,不太可能被用户采用。例如,Copilot 曾经生成了一个仅包含 return 语句的空方法,而不满足用户代码中指定的要求(讨论#6631)。
• 无意义的建议是指Copilot 提供的代码建议与用户的需求完全无关或产生奇怪的输出。此类建议被认为几乎无法使用,并且几乎无法为用户提供启发式帮助。例如,用户收到了 Copilot 生成的无法访问的虚假 URL(讨论#14212)。
• 有错误的建议是指Copilot 能够根据上下文生成相关代码,但建议的代码包含一些错误的情况。这可能会导致程序能够运行,但无法按照开发人员预期的方式运行,或者在某些情况下导致错误或崩溃。例如,用户报告 Copilot 建议使用“setState(!state)”而不是“setState(true)”(问题 #43),这会导致代码中出现逻辑错误。
• 无法理解的建议是指Copilot 提供代码建议,但由于代码逻辑复杂或缺乏经验,用户发现难以理解建议的代码,需要额外的来源来验证其正确性。例如,一位用户说“我的 Github Copilot 刚刚为我自动完成了它,然后我在互联网上搜索试图找到与其相关的信息,但找不到”。 (所以#73075410)
• 语法无效的建议是指Copilot 生成的建议可能包含阻止程序正常运行的语法错误的情况。一个例子是建议的代码缺少右括号,导致编辑器显示语法错误(讨论#38941)。
• 不太有效的建议是指由Copilot 生成的代码建议,这些建议在功能上正确并满足用户的要求,但可能会受到执行效率不佳或逻辑复杂的影响,从而可能影响代码的整体质量。
• 不安全建议是指Copilot 生成的引入安全漏洞的代码建议。例如,用户表示他的代码建议缺乏对正在读取的大小的责任(讨论#6636)。
分析:代码建议的质量是决定Copilot实际代码开发能力的关键因素。我们发现了相对少量的建议内容问题,这可能表明与使用相关的问题相比,用户不太愿意报告与建议代码相关的问题。在这些问题中,低质量的建议、无意义的建议和有错误的建议是最常报告的三种类型,而不安全的建议和不太有效的建议则不太常见。这一结果表明,生成代码的质量是用户最关心的问题,而安全性和有效性并不是最重要的。
5) 用户体验问题(4.2%):该类别涵盖用户对 Copilot 使用体验的反馈。与Usage Issue相比,Copilot总体上按预期运行和运行,但用户体验欠佳。用户体验问题可能会因特定的使用场景而出现,或者在各种情况下普遍存在,从而为 Copilot 可以改进的领域提供见解。用户体验问题可以进一步分为四种类型,下面详细介绍。
• 功能体验差是指Copilot 核心代码生成相关功能的使用不令人满意的一种用户体验问题。这些问题往往会阻碍用户和Copilot之间的协调,甚至降低实际开发工作的效率。例如,用户抱怨 Copilot 提供的自动生成的建议非常分散注意力,迫使他手动触发代码生成功能(讨论#13007)。
• 订阅体验不佳是指用户在订阅Copilot 服务的过程中遇到的障碍。 Copilot提供了多种订阅方式(例如学生验证、付费订阅),导致用户在订阅过程中遇到一些不便。例如,一位用户在设置账单后不确定下一步该做什么(讨论#19119)。
• 性能不佳是指Copilot 运行时出现的性能问题,通常会直接影响用户体验。这些问题包括 CPU 使用率高、响应时间长以及服务器访问过于频繁。 • 身份验证体验差是指用户在使用Copilot 之前验证身份时遇到的不便。最常见的情况是 Copilot 频繁提示用户重新登录,这可能会让人感到沮丧。
分析:用户体验问题为改进 Copilot 的方向提供了宝贵的见解。在功能体验不佳的问题 (25) 中,最常报告的问题涉及 Copilot 的内联建议,导致用户的编码过程中断 (5) 以及无法接受建议代码的某些部分 (2) 带来的不便。这些问题与用户在功能请求中提到的一些需求一致,例如,设置 Copilot 何时可以生成代码以及建议代码的长度。
6)版权和政策问题(3.4%):Copilot接受过大型开源代码库的培训,并根据用户的代码上下文生成代码建议。正如一些用户所表达的那样,Copilot 的运作方式引起了人们对潜在版权和政策问题的担忧。这些问题分为三种类型,如下所示。
• 代码版权问题是指一些代码作者提出的关于Copilot 未经授权使用其开源代码进行模型训练的担忧。 GitHub 是目前最流行的基于 Web 的代码托管平台之一,自从 Copilot 发布以来,一些代码作者一直怀疑他们托管在 GitHub 上的代码在没有适当考虑其许可证的情况下被用于培训。
• 代码遥测问题是指用户对Copilot 收集代码以生成建议的方法所表达的担忧,这可能会导致机密代码的泄露。有些用户可能只是不愿意将自己的代码以及 Copilot 为他们生成的代码收集用于其他目的。
• 违反市场政策是一种特殊情况,用户报告尽管使用了建议的API,但Copilot 仍能够在VSCode 市场上发布,而其他插件则被禁止。用户怀疑此行为可能违反市场政策(问题#3)。
分析:版权和政策问题的出现揭示了用户对Copilot工作方式的担忧。 Copilot接受过多语言开源代码的培训,还需要在运行过程中收集用户的代码上下文以生成建议。这两个事实导致人们在使用Copilot时更加关注版权和知识产权问题,尤其是在内部开发中。
B. 原因类型 (RQ2)
2)分析:副驾驶内部问题是最常见的原因,它会导致各种类型的使用问题。由于Copilot是一个闭源项目,其内部细节并不为用户公开。因此,我们将Copilot相关的上游问题归结为Copilot内部问题,包括语言模型、功能设计和服务器端问题,这些问题都是由内部因素引起的。通常,Copilot 内部问题的识别依赖于有关异常使用体验的用户反馈,Copilot 团队需要进一步调查以查明具体的根本原因。此外,Copilot内部问题的发生通常会导致在一定时间段内出现大量用户报告类似问题。例如,服务器端错误部署可能会导致一组用户遇到身份验证失败。
网络连接问题是一种常见的原因,可能导致身份验证失败、运行时异常、访问失败等。大多数与网络相关的问题都归因于用户的网络环境。常见的情况是用户通过 HTTP 代理或 VPN 访问 Copilot,这可能会导致 SSL 干扰并阻止他们使用该服务。不过,好消息是 Copilot 现在支持通过 HTTP 代理进行访问,从而解决了此类问题 [17]。
编辑器/IDE兼容性问题会导致各种使用问题的产生,主要包括功能使用异常和Copilot操作问题等。
不支持的平台是指部分用户无法在某些IDE或文本编辑器中有效使用Copilot的原因,这主要导致一些使用和兼容性方面的问题。由于Copilot并非开源,很多平台在发布后无法立即集成,导致部分用户在使用时遇到各种障碍。因此,我们建议用户尽量使用Copilot官方支持的IDE,因为这将为他们提供更方便、更稳定的代码生成服务,并可以访问成熟的讨论社区,帮助解决大多数常见问题。
不正确的配置/设置是功能使用和兼容性问题的主要原因之一。例如,安装 Copilot 后,其默认配置和设置可能会导致其在特定 IDE 中出现故障或与其他插件发生冲突。其中大部分问题可以通过配置调整来解决。
C. 解决方案类型 (RQ3)
问题类型和解决方案类型与分布的映射如表IV所示,使用缩写来表示每种解决方案类型。例如,“BFC”代表 Copilot 修复的错误。该映射显示,大多数解决方案都是针对使用问题和兼容性问题。针对Feature Requests的主要解决方案主要是等待官方功能实现(FIC)或者通过配置或设置修改(MCS)达到类似的效果。用户体验问题主要由副驾驶团队(BFC)改善。此外,使用适当版本的 Copilot 和编辑器/IDE (USV) 可以带来更好的体验。解决建议内容问题相对具有挑战性,只有少数可以通过修改输入方式(MIW)来解决,而大多数都缺乏有效的解决方案。版权和政策问题的解决方案也相对有限。主要解决方案是通过调整Copilot的设置来控制用户代码的收集。
2)分析:Copilot修复的Bug是解决各种问题的主要解决方案,特别是某些使用和兼容性问题。这是合理的,因为 Copilot 内部问题是最常见的原因,这表明 Copilot 作为一个新工具,很多问题并不是用户自己能够解决的。由于Copilot的闭源特性,用户只能提供反馈,等待Copilot团队的回复和解决方案。
修改配置/设置是解决与不正确的配置或设置相关的问题的常见解决方案,并且可以解决用户自己的功能使用问题、插件兼容性问题和身份验证失败问题。此外,对于某些功能请求,用户只需进行一些配置更改即可实现他们想要的功能,例如更改键盘快捷键绑定以接受代码建议。但我们发现,由于Copilot运行环境的复杂性,很难提供适合所有情况的推荐配置。因此,必须针对每个案例进行单独分析。
使用合适的版本提供了解决设置/操作问题、功能使用问题、安装问题和编辑器/IDE 兼容性问题的有效方法。 Copilot 根据用户反馈和开发计划快速迭代了多个版本。同时,一些IDE也发布了与其兼容的新版本。但是,与最新版本相比,某些旧版本可能更稳定,可能包含一些错误或兼容性问题。因此,使用合适的版本对于用户来说是一个非常有效的解决方案。
重新安装/重新启动/重新授权 Copilot 是用户自行简单解决身份验证失败、设置/操作问题和功能使用问题的另一种解决方案。其原理是重置 Copilot 的当前状态,将之前可能存在的任何错误或设置返回到其初始状态。
Copilot 实现的功能作为官方操作,主要解决用户的功能请求。 Copilot新功能的开发速度比较快,Copilot团队目前正在Copilot X中试验一些最新功能[18]。