LLM as Co-pilot:AutoDev 1.0 发布,开源全流程 AI 辅助编程

四月,在那篇《AutoDev:AI 突破研发效能,探索平台工程新机遇,我们初步拟定了 AI 对于研发的影响。我们有了几个基本的假设:

  • 中大型企业将至少拥有一个私有化的大语言模型。

  • 只有构建端到端工具才能借助 AI 实现增质提效。

围绕于这些假设,我们开始构建 AutoDev,将并将它开源。也在我的博客里,写下开发中的所有心得,以期望能帮助到国内的企业构建自己的 AI 辅助编程能力。

作为一个开源项目,还是先上 GitHub 地址:https://github.com/unit-mesh/auto-dev 。也可直接在 JetBrains IDE 的插件市场搜索:AutoDev。

介绍视频:

围绕开发者体验,设计三种辅助模式

起初,我并没有一个明确的开发蓝图。作为一个天天写代码的、所谓的专家级程序员,我是看我缺什么功能便写什么功能。

随后,围绕于所有的功能,我将其总结为三种辅助模式:

35c87f6932fcd943b917bb35cbbd8065.png

自动模式:规范化的代码生成

触发方式:自动模式都在 Context Actions 下,即与上下文相关的 actions。方式自然是那个那能的快捷键:⌥⏎ (macOS) 或者 Alt+Enter (Windows/Linux)。

设计的初衷是:类似于我们在先前设计 ClickPrompt 时的一键模式。而代码并不是像网的各种炫酷的 demo,你需要考虑团队已有的软件规范和约定,否则生成的代码依旧是不可用的。于是,围绕于可配置,以及一些隐性知识的场景,我们构建了三个体现 AutoDev 的 auto 的场景:

  • 自动 CRUD。读取需求系统的需求,由一个手动编码的 agent,来不断进行交互。寻找合适的 controller,修改方法,添加新的方法等等。当前支持 Kotlin、JavaScript 语言。

  • 自动生成测试。根据选定的类、方法,一键生成测试,并自动运行(在 RunConfiguration 合适的情况下)。当前支持 JavaScript、Kotlin、Java 语言。

  • 自动代码补全。根据光标位置,自动进行代码填充。由于精力不够,在不同语言能力有些差异,在 Java 语言下,会结合读取代码规范;在 Kotlin、Java 语言会根据参数、返回值自动添加类作为上下文;在其它语言下,会通过“类似”(不要问是不是抄的)于 GitHub Copilot、JetBrains AI Assistant 的相似度算法进行计算。

每个自动模式都包含了一系列的自动上下文工作。如下图为可见的、自动代码补全的上下文示例:

90a80491458bd636bd27c31fb4c37536.png

在这个上下文里,结合了一些配置好的规范,以及 BlogController 类相关的 field、parameters、return type,诸如 BlogService 等。

除此,还有一些隐藏的上下文,诸如于,我们在 AutoDev 配置中声名的语言:

You MUST Use 中文 to return your answer!

所以,其实吧,因为只有这么两个 “中文”,目测有大概 50% 的机率不会触发,我在考虑要不要重复三遍。

伴随模式:围绕日常体验设计

在设计伴随模式时,除了围绕于自己的需求设计,还调研、参考了一系列现有工具的实现,诸如于 AI Commit 等等。

由于,伴随模式都需要等待 LLM 返回结果,所以就都扔到 AutoDev Chat 模式下了。

51e333d940fb51b5e2e88191aee150c3.png

不过,我现在发现了在 JetBrains AI Assistant 出来之后,它成了 AutoDev 的最大竞争对手,当然也是参考对象。诸如于,下图的 Explain with AI、Explain error message with AI 的体验就做得很好。在这一点上,确实有待我进一步学习的。

088ed018038400f70906d90312664623.png

像 AutoDev,你只能选中,然后再 Fix This。

除了上述的功能,你还可以用 AutoDev 来:

  • 生成提交信息

  • 生成 release note

  • 解释代码

  • 重构代码

  • …………

总之,别人有的,AutoDev 都可以有,还可以让你直接 create DDL。

聊天模式:一个边缘的功能

在腾出了时间之后,我们重新设计(其实是借鉴了 JetBrains,谁让他不支持广大的中国区用户)了 AutoDev 的 UI,并且支持一键 Chat 的方式,如图一中的 Context Actions。

所以,这就变成了这样:

8938e344f3da8f0a6212001cbec638f1.png

你可以在这里和它聊天。

LLM as Copilot 的思考

对于现阶段来说,LLM 是一个 Copilot。它不会不改变软件工程的专业分工,但增强每个专业技术,基于AI的研发工具平台辅助工程师完成任务,影响个体工作。

f5aad833917febbbaa1be1fba8d3ef0e.png

它应该解决“我懒得做”及“我重复做”的事儿,诸如于写单元测试、编写代码、解决 issue、提交代码等等。作为一个程序员,我们应该多挖一些坑,多做一些有创造性的设计。

在 AutoDev 里,我们关注的是:AI 如何更好地辅助人类完成工作,并且它应该是伴随在工程师的 IDE 旅程上,尽可能让工程师不离开 IDE 就可以工作。

而对于 LLM as Copilot 这一理念来说,越来越多的工具将完善一点。

作为一个资深的 AI 应用工程师,我们正在思考 LLM as Co-Integrator 将如何真正的提升效能。

FAQ

如何接入国产、私有化 LLM ?

在项目的源码里,我们提供了一个 Custom LLM Server 的 Python 接口示例,需要将接口转为 AutoDev 所能接受的。由于精力有限,我只测试过公司内部部署的 ChatGLM2 等模型,所以接口并不是很完善。如果大家有其它需要,可以来 GitHub issue 讨论。

为什么只有 Intellij 版本?

作为一个开发过新的语言插件、深入过 Intellij Community、Android Studio 源码,并且优化过 Harmony OS IDE 架构的人,我真的只擅长 JetBrains IDE 的开发。

什么时候会有 VS Code 版?

简单来说:短期内不会有功能一致的版本。

虽然,我也认真研究过 VS Code、X Editor 等编辑器的源码,但是兄弟姐妹们,VS Code 只是一个编辑器,不是一个 IDE 啊,它缺少太多的接口了。而如果只是简单的功能,现有的开源版本已经有很好的实现了。

除了上面的原因,还有:

其一:集成度低,开发困难。方式 1:VS Code 的 Tokenization 引擎是基于 TextMate 语法,由 Oniguruma 结合又长又臭的正则表达式实现,非常不靠谱;方式 2:基于 LSP 引擎,据我先前所试的,远景很美好。

其二:没有可供参考的代码和实现样板。如我们的 README 所提及:JetBrain plugin development is no walk in the park! Oops, we cheekily borrowed some code from the GitHub Copilot, JetBrains Community version and the super cool JetBrains AI Assistant plugin in our codebase. But fret not, we are working our magic to clean it up diligently!

所以,理想的方式是像 GitHub Copilot 一样,开发一套 IDE 无关的 Agent 机制,结合 TreeSitter 来实现编程语言相关的处理。

其它

AutoDev 的思想是将 LLM(Large Language Model)作为辅助开发者的 Copilot,通过提供辅助工具来解决一些繁琐的任务,让工程师能够更专注于有创造性的设计和思考。

欢迎加入 AutoDev 的开发:https://github.com/unit-mesh/auto-dev

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/26833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32入门——定时器

内容为江科大STM32标准库学习记录 TIM简介 TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时&…

React、Vue和Angular的优缺点

React React 是一个用于构建用户界面的 JAVASCRIPT 库。React 主要用于构建 UI,很多人认为 React 是 MVC 中的 V(视图)。React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源。React …

Unity3D GPU Selector/Picker

Unity3D GPU Selector/Picker 一、概述 1.动机 Unity3D中通常情况下使用物理系统进行物体点击选择的基础,对于含大量对象的场景,添加Collider组件会增加内容占用,因此使用基于GPU的点击选择方案 2.实现思路 对于场景的每个物体,…

批量导出pdf为zip文件(可以修改zip中pdf名称)

核心代码 public static void compressZip1(HashMap<String,File> map, String rootPath, String zipFileName) throws FileNotFoundException {FileOutputStream fileOutputStream new FileOutputStream(zipFileName);ZipOutputStream zipOutputStream new ZipOutputS…

Java超级玛丽小游戏制作过程讲解 第四天 创建并完成常量类03

今天继续来完成常量类。 package com.sxt;import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List;public class StaticValue {//背景public static Buff…

【Docker】性能测试监控平台搭建:InfluxDB+Grafana+Jmeter+cAdvisor

前言 在做性能测试时&#xff0c;如果有一个性能测试结果实时展示的页面&#xff0c;可以极大的提高我们对系统性能表现的掌握程度&#xff0c;进而提高我们的测试效率。但是我们每次打开Jmeter都会有几个硕大的字提示别用GUI模式进行负载测试&#xff0c;而且它自带的监视器效…

系统架构设计师-软件架构设计(7)

目录 大型网站系统架构演化 一、第一阶段&#xff1a;单体架构 到 第二阶段&#xff1a;垂直架构 二、第三阶段&#xff1a;使用缓存改善网站性能 1、缓存与数据库的数据一致性问题 2、缓存技术对比【MemCache与Redis】 3、Redis分布式存储方案 4、Redis集群切片的常见方式 …

FFmpeg中相关结构体介绍

AVFormatContext&#xff1a;此结构体存储音视频封装格式中包含的信息&#xff0c;并且这个结构体是贯穿整个播放流程的。在这个结构体中主要包含AVInputFormat&#xff0c;AVOutputFormat、AVStream等。 struct AVInputFormat *iformat; // 输入数据的封装格式 AVIOContext *…

PostGIS v3.4.0Orc1版本特性

PostGIS 3.4.0rc1 2023/08/05自 3.4.0beta2 发布以来的变化- &#xff03;5442&#xff0c;[postgis_tiger_geocoder&#xff0c;postgis_topology]数据库search_path不做它打算做什么&#xff08;Jelte Fennema&#xff09;PostGIS 3.4.0beta2 2023/07/29自 3.4.0beta1 发布以…

解决log4j.xml的url没有注册问题

在对log4j.xml配置文件配置时出现http//jakarta.apache.org/log4j/爆红&#xff0c;IDEA提示uri is not registered。源代码如下 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j"http://jakarta.apache.org/lo…

c++ boost circular_buffer

boost库中的 circular_buffer顾名思义是一个循环缓冲器&#xff0c;其 capcity是固定的当容量满了以后&#xff0c;插入一个元素时&#xff0c;会在容器的开头或结尾处删除一个元素。 circular_buffer为了效率考虑&#xff0c;使用了连续内存块保存元素 使用固定内存&#x…

Spring DBCP配置

Spring DBCP配置 BasicDataSource对应的依赖&#xff1a; <dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.5.0</version></dependency><dependency><groupId…

为什么要选择文件传输软件?有哪些最佳高速文件传输软件?

是否经历过这样的场景&#xff0c;正在努力地完成工作任务&#xff0c;但是由于制作的数据无法及时传送给合作伙伴&#xff0c;工作流程被打断了&#xff1f;这听起来很令人沮丧&#xff0c;对吧&#xff1f;可是&#xff0c;这种情况在现实中并不罕见。 因此&#xff0c;需要…

OpenCv.js(图像处理)学习历程

opencv.js官网 4.5.0文档 以下内容整理于opencv.js官网。 简介 OpenCV由Gary Bradski于1999年在英特尔创建。第一次发行是在2000年。OpenCV支持c、Python、Java等多种编程语言&#xff0c;支持Windows、Linux、Os X、Android、iOS等平台。基于CUDA和OpenCL的高速GPU操作接口也…

java泛型和通配符的使用

泛型机制 本质是参数化类型(与方法的形式参数比较&#xff0c;方法是参数化对象)。 优势:将类型检查由运行期提前到编译期。减少了很多错误。 泛型是jdk5.0的新特性。 集合中使用泛型 总结&#xff1a; ① 集合接口或集合类在jdk5.0时都修改为带泛型的结构② 在实例化集合类时…

Unity数字可视化学校_昼夜(三)

1、删除不需要的 UI using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class EnvControl : MonoBehaviour {//UIprivate Button btnTime;private Text txtTime; //材质public List<Material> matListnew Li…

docker中的jenkins去配置sonarQube

docker中的jenkins去配置sonarQube 1、拉取sonarQube macdeMacBook-Pro:~ mac$ docker pull sonarqube:8.9.6-community 8.9.6-community: Pulling from library/sonarqube 8572bc8fb8a3: Pull complete 702f1610d53e: Pull complete 8c951e69c28d: Pull complete f95e4f8…

C++解决TCP粘包

目录 TCP粘包问题TCP客户端TCP服务端源码测试 TCP粘包问题 TCP是面向连接的&#xff0c;面向流的可靠性传输。TCP会将多个间隔较小且数据量小的数据&#xff0c;合并成一个大的数据块&#xff0c;然后进行封包发送&#xff0c;这样一个数据包里就可能含有多个消息的数据&#…

mysql 拼接字符串,截取字符串 常用方式

1&#xff0c;拼接字符串常用&#xff1a;CONCAT(‘需要拼接的字符串’,列名) select a.UserState,a.OrgUserId,a.UserName, CONCAT(,b.Telephone),b.AreaCode from T_UserInfo b inner join T_User a on a .UserIdb.UserId and a.UserName!admin and a.UserState!Resigned…

02-状态模式

1 意图 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。&#xff08;这里的对象指的就是模型中的Context&#xff0c;行为指的就是State的子类&#xff09; 2 动机 考虑一个问题&#xff1a;实现一个表示网络连接的类TCPConnection&am…