AutoDev for VSCode 预览版:精准 AI 编程提示词与编辑器的完美融合

在过去的一个月里,我在休着陪产假、看娃的同时,也在闲暇时间里设计了 AutoDev for VSCode 的架构。

我们将 AutoDev for Intellij IDEA 平台的非凡开发者体验带到了 VSCode 平台。在 IDEA 版本中通过构建非常精准的提示词,以及与编辑器的完美融合, 以帮助开发者更好地编写代码。

9026c5439ae3bf223acb023f712c4f97.png

现在,在 VSCode 预览版本(0.1.0)中,你可以体验到这一切。

  • 文档:https://vscode.unitmesh.cc

  • 代码:https://github.com/unit-mesh/auto-dev-vscode

  • 下载安装:在 VSCode 插件商店搜索 AutoDev,即可安装。

AutoDev 设计理念示例:一键精准测试生成

在设计 IDEA 版本时,我们一直致力于避免使用聊天窗口,以提供更好的用户体验。在 VSCode 版本中,我们将这一理念继续发扬光大。

cf87aaa278c20493eb399b36b66a5cd4.png

为了构建这样的能力, 我们不断地重构我们的架构,以实现精准测试生成所需要的上下文件:

  • 输出准确的测试文件路径

  • 与编辑器的完美融合

  • 函数的相关代码类(输入和输出)表示

  • 基于依赖工具的测试框架分析

如下是基于上述的设计理念的 Prompt 示例:

Write unit test for following java code.
- You are working on a project that uses Spring Boot,Spring Core,Spring MVC,JDBC,JPA to build business logic.
// BlogPost 的 UML 类图
Here is the source code to be tested:
// imports 和 package 声明
public BlogPost getBlogById(Long id) {return blogRepository.findById(id).orElse(null);
}
Start getBlogById test code with Markdown code block here:

即:

  • 通过读取依赖文件,如 build.gradle,我们能够准确地知道项目的依赖,以及测试框架的使用。

  • 通过对函数的上下文分析,我们能够准确地知道函数的输入和输出,以及函数的相关代码类。

  • 通过精准的上下文,可以有非常高的信心直接生成测试代码。

通过上述的方式,我们在 VSCode 达到了与 IDEA 版本相同的体验。

AutoDev 本地环境架构

与 Intellij IDEA 平台封闭的 API 相比(我们经常不得不参考一些官方的实现),VSCode 的开放式带来了更多的可能性。借助于我们在 Intellij 平台的经验,我们尝试构建通用的底层架构,以支持精准的编程上下文。如下是 AutoDev for local 的架构图:

4ec4af9d28fb907572dd4ad945a5f47a.png
AutoDev for Local

PS:从其他时间花费上是差不多的,VSCode 插件大部分时间都在调试环境,IDEA 插件大部分时间在等 ide 启动。

AutoDev for VSCode 架构设计原则

在构建 AutoDev for VSCode 时,我们遵循了以下的设计原则:

  • 统一架构。介于在 Intellij 平台上的丰富经验,我们尝试构建一个通用的抽象架构,方便于开发者在不同平台上的开发,并可以在未来实现部分代码通用。

  • 依赖反转的插件架构。我们使用了 Inversify 代替了 XML 来构建依赖注入,以支持多语言、多框架、多工具的动态切换。

  • 事件驱动的 UI 交互。VSCode 本身是基于 Web 技术的,其指令(command)的构建方式也是基于事件驱动的。侧边栏里的聊天 WebView 与主界面的 WebView 交互,也是基于事件驱动的。

有关于介绍的详细介绍,见:https://vscode.unitmesh.cc/development/design-princinple.html

AutoDev for VSCode 的核心接口

在 AutoDev for VSCode 中,我们定义了一系列的核心接口,以支持不同的语言、不同的工具、不同的框架的切换。如下是一些核心接口:

  • LangConfig,用于支持不同语言的解析与静态代码分析。

  • Provider,提供不同工具与功能的支持,如 Java 上下文、测试生成等等。

如下是一下简化的 Java 语言 Provider 支持示例:

container.bind(ToolchainContextProvider).to(SpringContextProvider);
container.bind(ToolchainContextProvider).to(JavaSdkVersionProvider);
container.bind(RelatedCodeProvider).to(JavaRelatedProvider);
container.bind(TestGenProvider).to(JavaTestGenProvider);
container.bind(BuildToolProvider).to(GradleBuildToolProvider);
container.bind(StructurerProvider).to(JavaStructurerProvider);

当项目中使用 Spring 框架时, SpringContextProvider 就会被调用,以在上下文中提供 Spring 的相关信息。诸如 JavaTestGenProvider 则 会用于一键生成 Java 代码的测试文件,创建分析相关代码、测试文件、生成测试代码、运行测试(TODO)等等。

AutoDev for VSCode 0.1.0 的核心功能

5b1609c99dafdcff602dfaa328d0be83.jpeg

在当前的 VSCode 0.1.0 版本中,我们实现了以下的核心功能:

  • 自定义 AI 指令,即通过自定义 prompt 来实现自定义的 AI 指令。

  • 测试生成,即通过 AI 生成测试代码。

  • 注释生成,即通过 AI 生成注释。

  • 语义化搜索核心逻辑,尚未集成到功能中。

在当前的版本,我们更注重于架构的设计,以支持更灵活的功能扩展:

ac5b8e1dcb59d90759e6d2ba3fed13b0.png

如果你有任何的建议或者想法,欢迎在 GitHub 上提出 Issue,或者加入我们。

8daaf5d509e45dc8716496f15eebf086.jpeg

GitHub:https://github.com/unit-mesh/auto-dev-vscode 

参考资源

一个优秀的作品总是可以依赖于其它的开源项目、商业化产品,在构建 AutoDev for Intellij IDEA 时,我们也参考了很多的开源项目、商品化产品。在构建 AutoDev for VSCode 时,也不例外:

  • 在一些交互方式上,我们借鉴了

    • 借鉴了 AutoDev IDEA 版本的实现

    • 参考了 GitHub Copilot Chat 的 UI 实现。

  • 在一些代码实现上,我们复制了(Apache 协议):

    • Bloop 结合图与静态代码的分析能力

    • Continue 的 WebView 与 WebView 交互的实现

  • 在静态代码分析上,我们将我们在 ArchGuard 开源架构治理平台中的静态代码分析引擎应用到了 AutoDev for VSCode 中。

当然了,还有其它的一些开源项目,在这里就不一一列举了,详细见代码仓库 README.md 中的 LICENSE 相关

彩蛋

四月,是一个充满希望的季节。在这个季节里,我们也想分享一下,我们家刚出生的小龙仔:

2a9b50088798ccdc1dd1aa680f65f988.jpeg
小宝贝

感谢我媳妇和小宝宝的支持,让我有了更多的时间来完成这个项目。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

GNU Radio创建时间戳 C++ OOT块

文章目录 前言一、创建自定义的 C OOT 块1、创建 timestamp_sender C OOT 模块①、创建 timestamp_sender OOT 块②、修改 C 代码 2、创建 timestamp_receiver C OOT 模块①、创建 timestamp_receiver OOT 块②、修改 C 代码 3、创建 delayMicroSec C OOT 模块①、创建 delayMi…

Apple OpenELM设备端语言模型

Apple 发布的 OpenELM(一系列专为高效设备上处理而设计的开源语言模型)引发了相当大的争论。一方面,苹果在开源协作和设备端AI处理方面迈出了一步,强调隐私和效率。另一方面,与微软 Phi-3 Mini 等竞争对手相比&#xf…

k8s部署Kubeflow v1.7.0

文章目录 环境介绍部署访问kubeflow ui问题记录 环境介绍 K8S版本:v1.23.17,需要配置默认的sc 参考:https://github.com/kubeflow/manifests/tree/v1.7.0 部署 #获取安装包 wget https://github.com/kubeflow/manifests/archive/refs/tag…

数控六面钻适用场景-不止家具制造

在快节奏的现代生活中,家具作为我们生活的重要组成部分,其美观度和实用性日益受到人们的关注。而在这背后,一个不可或缺的“工匠”正默默地发挥着它的作用——那就是数控六面钻。 数控六面钻,顾名思义,是一种高度自动…

Ansible自动运维工具之playbook

一.inventory主机清单 1.定义 Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。 2.变量 (1)主机变量 [webservers] 192.168.10.14 ansible_port22 ansible_userroot ans…

【Redis分布式缓存】 哨兵机制

Redis 哨兵机制 哨兵作用和原理 Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。 哨兵的作用 监控:Sentinel 会不断检查您的master和slave是否按预期工作自动故障恢复:如果master故障,Sentinel会将一…

(三)Appdesigner-界面转换及数据导入和保存

提示:文章为系列文章,可以在对应学习专栏里面进行学习。对应资源已上传 目录 前言 一、Appdesigner是什么? 二、界面切换 三、数据导入及保存 (一)数据导入 (二)数据保存 总结 前言 Appd…

设置 kafka offset 消费者位移

文章目录 1.重设kafka消费者位移2.示例2.1 通过 offset 位置2.2 通过时间2.3 设置到最早 1.重设kafka消费者位移 维度策略含义位移Earliest把位移调整到当前最早位移处位移Latest把位移调整到当前最新位移处位移Current把位移调整到当前最新提交位移处位移Specified-Offset把位…

0507华为od二面

只记录自己没回答上的问题 1、ZGC的缺点: 1)只是适用于32位系统 2)最大只是支持4TB内存容量 3)最糟糕的情况下吞吐量会下降15%,这都不是事至于吞吐量,通过扩容分分钟解决 4)分代的原因:不同对象的生命周期不相同,可能会扫描整个堆…

对于SOMP算法的测试

刚开始只上传了SOMP算法的代码,并没有过多介绍。 所以本篇文章对SOMP算法用法进行一个介绍 SOMP算法代码 function [X_hat] MMV_SOMP(Y, PHI, s)% SOMP:同时正交匹配追踪 simultaneous orthogonal matching pursuit% 论文:J. Determe, J. Lo…

【verilog-语法】编译命令( compiler directives )

一、前言 编译器指令的范围是从它的出现的点延伸到处理的所有文件,直到另一个编译器指令取代它或处理结束。编所有的编译命令都有重音符 " "引出。在IEEE std1364-2005中共介绍了19条编译命令,这19条命令又可分为12组命令进行独立或组合使用…

指针再学习笔记

概念 示例 类型 示例 作用 注意:有些内存地址可能系统不会允许任意访问 运算 示例 空指针

C语言程序设计(三)

1、数据的两种表现形式 常量:其值不能被改变的量称为常量。 变量: 单撇号内只能包含一个字符。双撇号内可以包含一个字符串。 注意:要区分符号常量和变量,不要把符号常量误认为变量。符号常量不占内存只是一个临时符号,代表一个值,在预编译…

免费地理信息系统(GIS)数据集合网站,500合1

超过500个免费的地理数据网站,数据涵盖多种主题。 这是一个免费的地理信息系统(GIS)数据源列表,涵盖了全球范围内的各种地理数据,包括自然环境、行政边界、人口、交通等多个领域的数据。 该数据列表由作者 Robin Wilson 收集整理&#xff0…

软件设计师-应用技术-UML建模题3

基础知识及技巧: 1. 用例图: 1.1 考点: 题干里面有关项目的详细描述,完整用例图中的某些参与者和某些用来扣掉,根据题干内容和已有用例图补充。根据题干,分析用例图之间的关系。 1.2 基础知识&#xff…

学习通下载PDF资源

今天突然发现,学习通的pdf资源居然是没有下载入口的,这整的我想cv一下我的作业都搞不了,于是我一怒之下,怒了一下。 可以看到学习通的pdf资源是内嵌在网页的,阅读起来很不方便,虽然他内置了阅读器&#xf…

如何更好地使用Kafka? - 运行监控篇

要确保Kafka在使用过程中的稳定性,需要从kafka在业务中的使用周期进行依次保障。主要可以分为:事先预防(通过规范的使用、开发,预防问题产生)、运行时监控(保障集群稳定,出问题能及时发现&#…

技术分享-上海泗博MPI转以太网模块MPI-131实现Node-RED直接访问西门子PLC数据

上海泗博自动化MPI-131是一款用于西门子S7系列PLC(包括S7-200、S7-300、S7-400)以及西门子数控机床(如840D、840DSL等)的以太网通讯模块,无需编程,即插即用,支持通过模块上下载PLC程序和数据监控…

【Linux入门】基础开发工具

本篇博客整理了Linux(centOS版本)中基础开发工具的用途和用法,旨在透过开发工具的使用,帮助读者更好地理解可执行程序的编写、编译、运行等。 目录 一、软件包管理器 yum 1.软件的下载与安装 2.Linux应用商店:yum …

【busybox记录】【shell指令】tr

目录 内容来源: 【GUN】【tr】指令介绍 【busybox】【tr】指令介绍 【linux】【tr】指令介绍 使用示例: 转换字符 - 默认 转换字符 - 不翻译指定字符数组 此指令目前接触少,用得少,把精力放到其他常用指令上 常用组合指令…