GitHub Copilot 深度剖析:一个 AI 产品的性能提升、成本控制与效果评估

2023-07-27 13:29:23 +08:00
 Happy3

GitHub Copilot 深度剖析:一个 AI 产品的性能提升、成本控制与效果评估

背景

最近在实际的项目中接触到帮助程序员写代码的 Coding Copilot ,其中业界翘楚是 GitHub Copilot 。这个领域仍在快速发展中,有非常多的追赶者,包括而不仅限于:

要做好一个 Coding Copilot ,除了后端的代码生成模型(比如 GitHub Copilot 用到的 Codex )至关重要外,客户端(比如 vscode 中的插件)的 Prompt Engineering 同样重要。受 Copilot 官网示例的影响,你可能和我一样,认为只需要将我们的编码需求以注释的方式或者直接将其函数定义直接发送给 Codex 模型,它就能生成我们想要的代码了。这种简化的 Prompt 也被很多项目(比如 StarCoder 、Tabnine )等采用,但写过程序的同学都知道,在实际的编码过程中,一个程序的上下文绝不仅仅只有本文件光标之前的函数定义和注释部分,还会包括光标之后的部分、引用文件、相关文件(比如 python 中同一模块下的其他文件、C 语言中的头文件)等等。如何更好地利用这些上下文,在有限的 Prompt 长度内给模型以更多的、更丰富的信息输入,这些都是 Coding Copilot 工程化要特别关注的重要议题。

作为行业领头羊的 GitHub Copilot 是商业产品,没有开源,因此无法看到它是如何工作的。不过,世上总有好奇、聪明且乐于分享的头脑,会想方设法搞懂新生事物的内部机制,然后公之于众。很有幸,在 GitHub Copilot 上,我在网上邂逅了 thakkarparth007 这位老兄。他对 GitHub Copilot 的工作机制非常好奇,同时他有非常强的 Hacking 能力,通过对 GitHub Copilot 的 VSCode 插件进行逆向工程,从而破解了 GitHub Copilot 客户端的工作秘密。乐于分享的他对此写了专门的文章,开发了一个相关的可视化代码的库:

后来发现国内的工程师也做了类似的工作:

花了大半个月,我终于逆向分析了 Github Copilot

https://zhuanlan.zhihu.com/p/639993637

它用更长的篇幅更细致地介绍了逆向工程的过程以及 Prompt 的生成细节。

在上面两篇文章的基础上,梳理一下 GitHub Copilot 在客户端是如何工作的。

场景

为了让大家更好地理解 GitHub Copilot 的工作,先简要介绍一下其工作场景。程序员一般会在 IDE (集成开发环境)中编写代码,比如上图中,程序员老 A 正在编写一个 python 程序,用来解析日常记录的收支情况。于是他打开了一个名叫 parse_expenses.py 的文件,准备实现一个叫做 parse_expenses 的函数。这个函数包含:

如果没有 Copilot ,老 A 需要一个字母一个字母地敲出上面的所有内容,俗称“编程”;在 Copilot 的加持下,当老 A 敲完第二个"""后,神奇的事情开始发生:函数体自动生成了,一开始以灰色字体出现;老 A 对 AI 生成的代码做一遍检查,如果没有问题(很大概率),他只需按一下 Tab 键,这段代码就被接受,变成图中靓丽的颜色,正式成为代码库的一部分,此为“AI 辅助编程”。

下面就展开说说具体的工作原理,包括:


性能提升 - 提示词工程:Prompt Engineering

Prompt 的组成

最终发送给 Codex 模型的 Prompt 如下:

包括:

总结为下图

前缀的生成

其中主要内容是 Prompt 的前缀部分 prefix 的计算。它包括:

其中最为代码着力最多的部分是SimilarFile,它获取与当前文件相似度较高的内容,作为BeforeCursor强用力的补充,是重要的上下文信息。其计算方法如下:

然后按照下面的优先级(从高到低)做文本处理,然后组合拼装成 prefix 前缀部分:

进而组装成上文所示的完整 Prompt 发送给后端的大模型做代码生成。

小结

以上就是整个 Copilot 的 Prompt 生成过程。正如

硬核 Prompt 赏析:HuggingGPT 告诉你 Prompt 可以有多“工程”

中对 Prompt 的理解一样,这是一个动态过程:每次敲击键盘,都需要重新去计算对应的 Prompt ;而如何计算,反映的是研发团队对用户使用产品场景的理解;具体到编程 Copilot 中,对应的是产品对程序员写代码这件事情的了解程度。

现在的 Prompt 对应的上下文,还仅限于当前文件和最近打开的文件,随着研发的深入,其搜索的范围会逐渐扩大到当前的 codebase 、其他相关 codebase ,甚至是企业的知识库。而代码相似性的计算方法,会从现在基于文本的相似性计算,逐渐扩展到基于语义的相似性计算。这种搜索空间和相似性计算的扩展,会带来更加丰富、也更加精准的上下文信息,值得期待。


成本控制 - 模型触发:Model Invocation

每次大模型的调用,比起传统的应用 API ,都是一个耗时费力的过程。因此,系统在满足功能实现的基础上,应尽可能减少对大模型的触发。那么,GitHub Copilot 在这方面做了哪些工作呢?

UI 拦截

首先,在 UI 前端:

Prompt 拦截

接着,在生成 Prompt 之后:


效果评估 - 远程监测:Telemetry

数据飞轮

如何通过收集用户的行为,从而评估模型的效果,进而不断改进模型,是 AI 产品持续迭代的基础。MidJourney 让用户 4 选 1 ; ChatGPT 通过用户对回答赞或踩; GitHub Copilot 是通过用户对生成代码的接受或者拒绝。这些产品通过各自不同的用户交互实现了梦寐以求的用户数据飞轮。

指标计算

那 GitHub Copilot 是如何评估用户对其代码的接受度的呢? GitHub 团队在 2022 年 6 月的博客中提到:有 40%的代码都是 Copilot 写成的,这个 40%是怎么得来的呢?这就涉及到 Copilot 的另一个模块:远程检测或者叫做遥测,英文是 Telemetry ,是采集远端数据,进行系统性能监控的意思。在这里是指采集用户在 vscode 、neovim 这类代码编辑器中对 Copilot 产生的代码的后续行为,从而判断其接受程度。

如何判断一段建议代码是否被接受?这不是简单计算用户通过按 Tab 键表示接受的比例,因为即使被接受,后续也可能被修改。因此为了精确计算接受率,GitHub 采取的方法是建议代码生成后,在一定的时间点( 15s, 30s, 2min, 5min and 10min )上去检测建议代码是否还保留在代码库中。具体的算法是计算原始的建议代码和代码库中插入点之后一定窗口范围内的代码之间的编辑距离,如果这个编辑距离与建议代码的长度比例小于 50%,就认为代码被接受,保留在代码库中。这个计算过程有点像计算用户的留存率,会有当日、次日、3 日、7 日、15 日、30 日等留存率指标。

这种接受率等指标的计算,往往不是在客户端进行的,因为计算指标必须在大规模用户数据的基础上才有效。因此客户端只负责收集数据,汇集到后台,离线计算指标。这里的客户端数据收集,会采集用户的代码片段,可能会涉及隐私、安全和知识产权。因此 GitHub 在用户协议中,会有 opt-out 选项,在获得许可的基础上才会回传代码片段。

AB 测试

在 Copilot Internals 的文章中,还多次提到 AB 测试,在 Copilot 中有拉取微软 AB 实验平台的代码。诸如后缀比例、Jaccard 计算等因素在 AB 测试中。AB 测试会在不同的用户上运行不同版本的产品,从而比较哪些参数的设定比较合理,哪些 feature 有点改进。这也是产品数据化运营的重要部分。

小结

上面阐述的远程监控,是一个典型的数据闭环过程的基础:采集数据、计算指标以及 AB 测试用以评估产品的效用,为下一步的迭代提供决策依据。这个过程也叫做数据化运营,其核心是设计合理的核心指标来测试并改进产品的有效性。Copilot 通过用户对代码的接受或者拒绝,自带一种天然的数据收集机制,能非常好地建立数据的闭环。


总结

除去后端的大模型训练和部署,通过对 GitHub Copilot 客户端的 Prompt Engineering (提示词工程)、Model Invocation (模型触发)和 Telemetry (远程监测)的系统了解,可以一窥 AI 产品研发的轮廓面貌:

除此之外,对比 ChatGPT 和 GitHub Copilot ,我们可以看到大模型应用的两条不同道路:

[完]


往期相关

硬核 Prompt 赏析:HuggingGPT 告诉你 Prompt 可以有多“工程”

硬核 Prompt 赏析:与 Auto-GPT 的“契约”

硬核 Prompt 赏析:AI 老师长什么样?

1077 次点击
所在节点    OpenAI
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/960196

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX