《AI AI 》 DIY ( IDE ) AI GitHub CopilotJetBrains AI AssistantAutoDev。主要特性包括:AutoDev for Intellij,基于 JetBrains 平台的全流程 AI 辅助编码工具。、AutoDev for VSCode,基于 VSCode 编辑器的全流程 AI 辅助编码工具。、Unit Eval,代码补全场景下的高质量数据集构建与生成工具。。还包含 2 个其他特性。
《AI AI 》 DIY ( IDE ) AI GitHub CopilotJetBrains AI AssistantAutoDev。主要特性包括:AutoDev for Intellij,基于 JetBrains 平台的全流程 AI 辅助编码工具。、AutoDev for VSCode,基于 VSCode 编辑器的全流程 AI 辅助编码工具。、Unit Eval,代码补全场景下的高质量数据集构建与生成工具。。还包含 2 个其他特性。
2023 年,生成式 AI 的火爆,让越来越多的组织开始引入 AI 辅助编码。与在 2021 年发布的 GitHub Copilot 稍有差异的是,代码补全只是众多场景中的一个。
大量的企业内部在探索结合需求生成完整代码、代码审查等场景,也引入生成式 AI,来提升开发效率。
在这个背景下,我们(Thoughtworks 开源社区)也开源了一系列的 AI 辅助工具,以帮助更多的组织构建自己的 AI 辅助编码助手:
由于,我们设计 AutoDev 时,各类开源模型也在不断演进。在这个背景下,它的步骤是:
也因此,这个教程也是围绕于这三个步骤展开的。 除此,基于我们的经验,本教程的示例技术栈:
由于,我们在 AI 方面的经验相对比较有限,难免会有一些错误,所以,我们也希望能够与更多的开发者一起,来构建这个开源项目。
结合 JetBrains 2023《开发者生态系统》报告的人工智能部分
,我们可以总结出一些通用的场景,这些场景反映了在开发过程中生成式 AI 可以发挥作用的领域。以下是一些主要的场景:
而在我们构建 AutoDev 时,也发现了诸如于创建 SQL DDL、生成需求、TDD 等场景。所以。我们提供了自定义场景的能力,以让开发者可以自定义自己的
AI
能力,详细见:https://ide.unitmesh.cc/customize。
在日常编码时,会存在几类不同场景,对于 AI 响应速度的要求也是不同的(仅作为示例):
| 场景 | 响应速度 | 生成质量要求 | 大小预期 | 说明 |
|---|---|---|---|---|
| 代码补全 | 快 | 中 | 1~6B | 代码补全是日常编码中最常用的场景,响应速度至关重要。 |
| 文档生成 | 中 | 中 | 1 |
文档生成需要充分理解代码结构,速度和质量同样重要。 |
| 代码审查 | 快 | 中 | 1 |
代码审查需要高质量的建议,同时响应速度也需尽可能快。 |
| 单元测试生成 | 快 | 中 | 6B~ | 单元测试生成的上下文较少,响应速度和AI质量同样重要。 |
| 代码重构 | 中 | 高 | 32B~ | 代码重构可能需要更多上下文理解,响应速度可适度减缓。 |
| 需求生成 | 中 | 高 | 32B~ | 需求生成是相对复杂的场景,响应速度可以适度放缓,确保准确性。 |
| 自然语言代码搜索与解释 | 中-低 | 高 | 32B~ | 自然语言代码搜索与解释是相对复杂的场景,响应速度可以适度放缓,确保准确性。 |
PS:这里的 32B 仅作为一个量级表示,因为在更大的模型下,效果会更好。
因此,我们将其总结为:一大一中一微三模型,提供全面 AI 辅助编码:
AI 代码补全能结合 IDE 工具分析代码上下文和程序语言的规则,由 AI 自动生成或建议代码片段。在类似于 GitHub Copilot 的代码补全工具中,
通常会分为三种细分模式:
行内补全(Inline)
类似于 FIM(fill in the middle)的模式,补全的内容在当前行中。诸如于:BlotPost blogpost = new,补全为: BlogPost();,
以实现:BlogPost blogpost = new BlogPost();。
我们可以 Deepseek Coder 作为例子,看在这个场景下的效果:
<|fim▁begin|>def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
left = []
right = []
<|fim▁hole|>
if arr[i] < pivot:
left.append(arr[i])
else:
right.append(arr[i])
return quick_sort(left) + [pivot] + quick_sort(right)<|fim▁end|>
在这里,我们就需要结合光标前和光标后的代码。
块内补全(InBlock)
通过上下文学习(In-Context Learning)来实现,补全的内容在当前函数块中。诸如于,原始的代码是:
fun createBlog(blogDto: CreateBlogDto): BlogPost {
}
补全的代码为:
val blogPost = BlogPost(
title = blogDto.title,
content = blogDto.content,
author = blogDto.author
)
return blogRepository.save(blogPost)
块间补全(AfterBlock)
通过上下文学习(In-Context Learning)来实现,在当前函数块之后补全,如:在当前函数块之后补全一个新的函数。诸如于,原始的代码是:
fun createBlog(blogDto: CreateBlogDto): BlogPost {
//...
}
补全的代码为:
fun updateBlog(id: Long, blogDto: CreateBlogDto): BlogPost {
//...
}
fun deleteBlog(id: Long) {
//...
}
在我们构建对应的 AI 补全功能时,也需要考虑应用到对应的模式数据集,以提升补全的质量,提供更好的用户体验。
编写本文里的一些相关资源:
代码解释旨在帮助开发者更有效地管理和理解大型代码库。这些助手能够回答关于代码库的问题、 提供文档、搜索代码、识别错误源头、减少代码重复等,
从而提高开发效率、降低错误率,并减轻开发者的工作负担。
在这个场景下,取决于我们预期的生成质量,通常会由一大一微或一中一微两个模型组成,更大
# 克隆仓库
git clone https://github.com/unit-mesh/build-your-ai-coding-assistant
# 进入目录
cd build-your-ai-coding-assistant
# 查看文档
cat README.md