GitHub Copilot 是一个代码补全工具,它会分析你的代码并在你输入时提供行内建议。
它还提供一个聊天界面,帮助你询问代码库的问题、生成文档、重构代码等。你可以在这里阅读博客。
在这篇博客中,我们将深入探讨在你编写代码时发生了什么,试图了解其工作原理。了解 Copilot 的内部工作机制可以帮助你更高效地使用它。
我们将把系统分为三个组件:代码编辑器、代理服务器(GitHub 服务器)和模型,并逐一了解每个组件。
代码编辑器
在代码补全的情况下,Copilot 不断监控光标位置并分析周围的代码,将所有代码拆分为标记,并对打开的所有其他标签执行 Jacobian 差分算法。
Jacobian 差分算法基本上是比较两段内容的维恩图,这有助于 Copilot 知道哪些代码部分高度重叠或引用相同的变量名和方法名,从而能够组装一个混合了相关内容的提示。编写一个好的提示至关重要,因为它有助于模型获得领域专长。
在聊天界面的情况下,可以在提示中添加其他信息以生成更好的代码建议和聊天回复。一些有用的上下文包括:
目录树:项目中文件和文件夹的层次结构和组织 终端信息:执行的命令、构建日志、系统输出 构建输出:编译结果、错误消息、警告Copilot 还允许你使用 @Workspace 等标签将这些来源的信息拉入提示中。在即将到来的部分中,我们将看到更多有用的附加上下文。
代理服务
代理服务执行两项操作:
预处理 后处理预处理
从代码编辑器获取相关数据后,这些数据会发送到 GitHub 的后台服务,输入会经过清理,去除用户的有害内容、阻止与软件工程无关的提示、检查仇恨言论或黑客攻击或提示注入的证据。
完成这些步骤后,代理服务生成相关提示并送入模型。
模型
清理用户提示后,GitHub 的后台服务将其传递给 ChatGPT。对于代码补全任务(Copilot 在你编程时建议代码片段),为了提供最佳用户体验,GitHub 保持非常低的延迟(300-400 毫秒),因此他们使用 GPT-3.5。
对于对话式 AI 机器人,GitHub 可以容忍更高的延迟,并需要更多的智能,因此他们使用 GPT-4。在这一点上,提示也会从 GitHub 服务器中删除,因为他们不希望使用用户的专有数据。
后处理
从模型返回响应后,代理服务在将结果发送回代码编辑器之前执行后处理任务。
在此步骤中,服务再次检查有害数据、安全漏洞的证据等。GitHub 还编写了一个自定义模型,用于检查安全漏洞、个人可识别信息。
GitHub 在返回过程中还进行另一个重要步骤,即如果模型的响应超过 150 个字符,他们会将数据与 GitHub 中的所有数据(数十亿个文件)进行对比,以确保不违反任何代码许可证。GitHub 在 20-30 毫秒内完成这一工程奇迹。
响应生成并返回给用户显示在代码编辑器中后,如果用户选择该响应或不选择,该指标会发送到 GitHub 服务器。
扩展上下文窗口的另一种方式
除了从代码库、终端信息和构建输出中获取上下文之外,Copilot 还使用 检索增强生成 (RAG) 。
通过 RAG,可以从组织的资产中提取任何对提示有用的附加上下文,例如文档、代码和问题。
Copilot 计划的另一项功能是为插件扩展上下文窗口。这允许 Copilot 调用另一个 API 或服务以收集数据和执行操作。
例如,如果你收到有关服务中断的通知,可以请求 Copilot 检查 Datadog 并检索过去一小时的关键错误列表。然后,你可以请求 Copilot 查找导致这些错误的代码路径的拉取请求和作者。
使用微调的自定义模型
GitHub 还为企业提供自定义模型。更具体地说,他们可以微调 ChatGPT 以生成更好的响应。
微调有用的一些场景包括:
风格偏好:团队可能有特定的编码风格、命名约定、格式指南等。使用微调版本的 ChatGPT 将使 Copilot 遵循这些规则。 API/SDK 版本:团队可能正在使用特定版本的 API/SDK。ChatGPT 模型可以在使用目标版本的代码库上进行微调,以提供兼容并优化特定开发环境的建议。 专有代码库:一些公司有使用不公开技术的专有代码库。微调 ChatGPT 可以让它学习这些代码库的模式,从而提供更相关的建议。参考资料:
YouTube 维基百科 GitHub Copilot 计划原文链接:https://medium.com/stackademic/behind-the-scenes-of-github-copilot-e3703971ea73
总结
**GitHub Copilot深入解析:代码补全与优化的智能助手**GitHub Copilot作为一款先进的代码补全工具,不仅能在编程时即时提供行内建议,还通过聊天界面帮助开发者解决各种代码库问题、生成文档、重构代码等。为了深入理解Copilot的工作原理,我们可以将其系统拆分为三个核心组件:代码编辑器、代理服务器(GitHub 服务器)以及模型。
**1. 代码编辑器**
在代码编辑器中,Copilot通过连续监控光标位置和分析周围代码,运用Jacobian差分算法来识别高度相关的代码片段,从而组装出有价值的提示。此外,它还能接收来自项目目录树、终端信息和构建输出等多种上下文数据,通过特定标签(如@Workspace)整合这些信息,为代码补全和聊天回复生成更精准的建议。
**2. 代理服务**
GitHub的代理服务负责数据的预处理和后处理:
- **预处理**:收集来自编辑器的数据后,进行清洗以排除有害内容、软件工程无关的提示及潜在威胁信息,最后生成优化的提示发送到模型。
- **后处理**:模型返回响应后,代理服务再次检查有害数据、安全漏洞,并与GitHub的数百亿个文件进行比对,确保响应内容不违反代码许可证。如果模型响应超过150字符,还会执行快速的比对以确保合规性。
**3. 模型**
GitHub使用了不同的模型来应对不同的需求。代码补全任务因对实时性要求极高(延迟控制在300-400毫秒内),故采用GPT-3.5。而对于需更高智能的对话式AI机器人,则采用GPT-4。这种方式确保了在不同场景下都能提供最佳体验。
**扩展应用与定制化**
为了进一步提升用户体验,Copilot提供了多种扩展功能,包括通过检索增强生成(RAG)技术从组织资产中提取附加上下文,以及通过插件扩展上下文窗口以调用外部API或服务。此外,GitHub还为企业用户提供自定义模型服务,通过微调ChatGPT来生成更符合特定编码风格、API/SDK版本或专有代码库需求的代码建议。
通过以上解析,我们可以看到GitHub Copilot如何通过整合前沿的算法和强大的模型,为开发者提供全方位的代码辅助与优化服务。无论是提升编码效率还是保障代码质量,Copilot都是一个不可多得的强大工具。