我们是如何在 IDE 中设计 AutoDev 的 AI 编程开发智能体语言与框架?

上周微软发布了自家的 AI 编程和软件开发智能体框架:AutoDev,其与我们开发的 IDE 插件 AutoDev 有颇多的相似之处,特别是一些设计思路,以及在对于辅助软件开发任务的智能体以及一些基础设施上。

稍有不同的是:

  • 交互介质。我们的 AutoDev 构建基于 IDE API 体系构建的,而微软的 AutoDev 则是构建以 CLI 为主。

  • 隔离环境。我们设计了 DevIns 语言来构建隔离环境,而微软的 AutoDev 则是基于 Docker 隔离环境。

当危,我们的 AutoDev 开发人数比较有限,所以相比于微软的 AutoDev 成熟度上是相对比较低的。考虑到我们的 AutoDev 是一年前开源的,而微软的 AutoDev 是最近发布的,他们这取名有点不厚道。

AI 驱动软件开发的本质:“人类—AI—代码”的桥梁

对于 AI 驱动的自动编程来说,无非就是让 AI 能理解好人类的需求,然后实现 AI 与代码环境的自动交互。更详细来说,便是:

  • 人类通过自然语言或者交互描述软件开发任务,如解释代码、生成代码、运行测试等。

  • AI 结合智能体与上下文理解人类的需求,并生成对应的指令文本。

  • 代码环境接收指令文本,并执行对应的操作,再返回结果给人类或者 AI。

也因此,我们所要构建的上是一个基于 “人类—AI—代码环境” 的沟通桥梁。实现让 AI 能理解人类的需求,并不是一件复杂的事情,通过额外的需求澄清、展开, 就有初步得到格式化后的需求。而让 AI 与代码环境进行交互,则是一件更复杂的事情,即如何通过指令文本来实现的。

方式 1:基于文本的函数调用

函数调用(Function calling)可以让开发人员声名一系列的函数,将其与对应的说明传递给语言模型,让语言模型根据这些说明来生成格式化的结果。随后, 在对应的工具中,调用对应的 API 来实现对应的操作。诸如于 Google AI 中语言模型生成的返回结果示例:

{"functionCall": {"name": "find_theaters","args": {"movie": "Barbie","location": "Mountain View, CA"}}
}

相似的方式,还有让 AI 生成对应的代码,如 shell 等,然后执行对应的代码。

方式 2:语言抽象的开发环境

我们对于自动化的探索是来自于 AutoDev 第一个需求,针对 Spring 框架的 AutoCRUD。在这个需求中,我们发现在复杂的软件开发任务中,需要动态生成 高质量上下文,以让 AI 能在对应的问题域中生成对应的代码。诸如于,生成 Controller 代码,需要知道现有 Controller,规范,以及对应的 Service、Repository 等代码。这一系列的信息,意味着,我们需要一个更高级别的语言来描述这些信息。

随后,我们在 AutoDev 中构建了一系列 Auto 功能(针对 React 的 AutoPage、针对鸿蒙操作系统的 AutoArkUI 等),以探索更合适的语言抽象来描述 “人类—AI—代码环境”,即 DevIns 语言。通过语言来作为人机接口,并作为可执行的代码,来实现对代码环境的操作。诸如于:

/patch
```patch
// the patch to apply
```

通过形式化的方式来描述对 IDE 的操作,易于让 AI 理解,也易于让代码环境执行。

设计基于 IDE 的编程智能体开发

在设计 AutoDev 的自动编码功能时,我们依旧是按照在 Unit Mesh 架构范式下的设计思路来设计的, 即 AI 生成的都是可验证的代码。也因此,在我们设计 AutoDev 的自动测试功能时,也是基于这个思路来设计的。当然了,在有了 DevIns 语言后,就能实现 更多的自动化(理论上)。

接下来,让我们从实际的需求出发,以三个例子来看看日常的编码可以如何设计:

  1. 验证生成代码是否工作?

  2. 进行安全的代码信息提交?

  3. 探索自动化问题辅助修复?

当然了,还可以有更多的不同示例,这里就不一一列举了。

示例步骤 1:经验证可工作的代码

d8589fe28ee15013e49771bcd4efd2ce.png

不论是人类,还是 LLM,要验证一段代码是否工作正确,最简单的方式就是运行它。运行它,通常有多种方式:

  1. 直接启动应用。通用 IDE 或者 CLI 来启动应用程序,通过交互界面或者 API 来验证代码的正确性。

  2. 单元测试验证代码。即通过生成单元测试,以验证生成业务代码的正确性。

  3. 构建 REPL 环境。而交互环境对于复杂应用的依赖管理并非易事,所以并非那么容易。

与启动应用的效率相比,显然通过测试驱动开发(TDD)来验证代码的正确性更加高效。因此,在结合 IDE 时,则需要多考虑一步:如何运行测试以验证代码。

于是,我们设计了一个简单的测试运行指令:

/run:src/test/java/cc/unitmesh/MathHelperTest.java

这样当我们生成了代码后,便可以通过运行测试来验证代码的正确性。由于 Intellij IDEA 支持不同的语言,但是不同的语言运行方式等是不同的。而由于 JetBrains IDE 使用了统一的底层抽象: RunConfiguration,因此我们构建了一个 RunService 来封装不同语言的运行方式:

interface RunService {fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? = nullfun runFile(project: Project, virtualFile: VirtualFile): String? { }
}

更详细可以参见 RunService.kt 代码。

示例步骤 2:安全的 Git 操作

8509d2fd9236f87d53dd418e993cc84e.png

既然,我们生成了可验证的代码,那么下一步,我们应该考虑的是结合 VCS 来进行代码提交。为了确保不执行不安全的操作,我们不直接执行 Git 操作,而 是借助于 IDE 的 VCS API 来执行对应的操作。

于是,我们设计了 /commit 指令来提交代码:

/commit
```commit
feat: add new feature
```

而对于需要更复杂的场景,诸如于远程生成的任务来说,我们通过 /patch 指令来

示例步骤 3:自动化问题辅助修复

4565132fb38a649742464d566a099a8a.png

接下来,我们的挑战就是如何在 IDE 获取运行结果,并根据结果来进行对应的操作。于是,我们在 AutoDev 中设计了一个 DevInsProcessProcessor 来 处理 DevIns 指令的执行结果:

when {event.exitCode == 0 -> {val comment = lookupFlagComment(devInFile!!).firstOrNull() ?: return/// handle flag comments}event.exitCode != 0 -> {project.service<DevInsConversationService>().tryFixWithLlm(scriptPath)}
}

即:

  • 成功。当 exitCode 为 0 时,我们可以通过 flag comments 来决定如何处理

  • 失败。当 exitCode 不为 0 (如 -1)时,我们则可以继续通过 AI 来尝试修复对应的问题

在失败的场景时,我们需要构建完整的上下文:输入、编译输出、 执行结果/LLM 返回结果,以便于 AI 能更好的理解问题,再给出对应的修复方案。

更详细可以参见 DevInsProcessProcessor.kt 代码。

其它

我们依旧还在设计适用于 IDE 的自动开发框架与 DevIns 语言,如果大家有兴趣,可以参与到我们的开发中来。

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

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

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

相关文章

随手笔记——禾赛Pandar64雷达旋转方向及坐标系定义

随手笔记——禾赛Pandar64雷达旋转方向及坐标系定义 手册下载

Maven学习记录

一、简介 1. Maven&#xff1a; 基于 Java 平台的项目管理和整合工具&#xff0c;将项目的开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09;。开发人员只需要做一些简单的配置&#xff0c;Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。…

【NLP学习记录】Embedding和EmbeddingBag

Embedding与EmbeddingBag详解 ●&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 ●&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 ●&#x1f680; 文章来源&#xff1a;K同学的学习圈子1、Embedding详解 Embedding是Pytorch中最基本…

备考ICA----Istio实验8---请求超时 Request Timeouts 实验

备考ICA----Istio实验8—请求超时 Request Timeouts 实验 1. 重置bookinfo环境 kubectl delete all --all --now kubectl delete dr --all kubectl delete vs --all kubectl delete gw --all kubectl apply -f istio/samples/bookinfo/platform/kube/bookinfo.yaml kubectl a…

STM32-01基于HAL库(CubeMX+MDK+Proteus)仿真开发环境搭建(LED点亮测试实例)

STM32-01基于HAL库&#xff08;CubeMXMDKProteus&#xff09;仿真开发环境搭建&#xff08;LED点亮测试实例&#xff09; 一、 开发工具版本列表二、安装过程三、实例测试&#xff08;点亮单个LED&#xff09;0、功能需求分析1、Proteus绘制电路原理图2、STMCubeMX 配置引脚及模…

微服务day07 -- 搜索引擎 ( 数据聚合 + 自动补全 + 数据同步 + ES集群 )

1.数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f; 这些手机的平均价格、最高价格、最低价格&#xff1f; 这些手机每月的销售情况如何&#xff1f; 实现这些…

【C语言基础】:内存操作函数

文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作…

Prompt提示工程上手指南:基础原理及实践(四)-检索增强生成(RAG)策略下的Prompt

前言 此篇文章已经是本系列的第四篇文章&#xff0c;意味着我们已经进入了Prompt工程的深水区&#xff0c;掌握的知识和技术都在不断提高&#xff0c;对于Prompt的技巧策略也不能只局限于局部运用而要适应LLM大模型的整体框架去进行改进休整。较为主流的LLM模型框架设计可以基…

图解Kafka架构学习笔记(二)

kafka的存储机制 https://segmentfault.com/a/1190000021824942 https://www.lin2j.tech/md/middleware/kafka/Kafka%E7%B3%BB%E5%88%97%E4%B8%83%E5%AD%98%E5%82%A8%E6%9C%BA%E5%88%B6.html https://tech.meituan.com/2015/01/13/kafka-fs-design-theory.html https://feiz…

web前端之罗盘时钟、不一样的补零方式、LED字体、padStart

MENU 效果图htmlJavaScriptstyle 效果图 html <div class"clock"><div class"second-box"></div><div class"minute-box"></div><div class"hour-box"></div><div class"day-box&…

华为数通方向HCIP-DataCom H12-821题库(多选题:181-200)

第181题 在BGP中Community属性为可选过渡属性,是一种路由标记,用于简化路由策略的执行。它分为自定义团体属性和公共团体属性,那么以下属于公共团体属性的是哪些项? A、No_Export_Subconfed B、No_Advertise C、No_Export D、Internet 【正确答案】ABCD 【答案解析】 第18…

Ftrans安全数据摆渡系统 构建便捷的内外网数据交换通道

安全数据摆渡系统是一种设计用于解决内外网环境下&#xff0c;数据传输、管理、共享问题的安全系统&#xff0c;通过加密、访问控制等策略&#xff0c;提供安全可靠的数据传输和共享服务&#xff0c;尤其适用于对网络安全建设要求高的行业&#xff0c;比如研发型企业、党政机构…

LLM2LLM: Boosting LLMs with Novel Iterative Data Enhancement

LLM2LLM: Boosting LLMs with Novel Iterative Data Enhancement 相关链接&#xff1a;arXiv GitHub 关键字&#xff1a;LLM、Data Augmentation、Fine-tuning、NLP、Low-data Regime 摘要 预训练的大型语言模型&#xff08;LLMs&#xff09;目前是解决绝大多数自然语言处理任…

Facebook账号防封方法及解禁方法

Facebook作为跨境主要业务平台&#xff0c;一直以来封号率都非常高。相信点进来的各位或多或少地遇见了个人号被封&#xff0c;广告账户被禁&#xff0c;FB主页被封等情况。针对此类问题&#xff0c;今天就小编也来分享自己的Facebook防封经验。 一、Facebook被封原因 主要有以…

个人周总结

个人周总结&#xff1a; 对于总体方向目标的完成&#xff0c;完成的不是很好&#xff0c;这周内的很多天都在游离&#xff0c;就是事情可能有需要做的&#xff0c;但是动力不很足&#xff0c;期间就是有点摆烂了。后面及时调整调整吧&#xff0c;有这种情况&#xff0c;一个原…

基于springboot的美食分享管理平台+数据库+部署文档+数据库表结构文档+免费远程调试

项目介绍: 基于springboot的美食分享管理平台。Javaee项目&#xff0c;springboot项目&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过SpringBoot MybatisBootstrap来实现。MyS…

【JavaEE】进程是什么?

文章目录 ✍进程的概念✍进程存在的意义✍进程在计算机中的存在形式✍进程调度 ✍进程的概念 每个应⽤程序运⾏于现代操作系统之上时&#xff0c;操作系统会提供⼀种抽象&#xff0c;好像系统上只有这个程序在运⾏&#xff0c;所有的硬件资源都被这个程序在使⽤。这种假象是通…

C语言 | qsort()函数使用

目录&#xff1a; 1.qsort介绍 2.使⽤qsort函数 排序 整型数据 3.使⽤qsort函数 排序 结构体数据 4. qsort函数的模拟实现冒泡排序 qsort()函数 是一个 C语言编译器函数库自带的排序函数&#xff0c; 它可以对指定数组&#xff08;包括字符串&#xff0c;二维数组&#x…

聚观早报 | 滴滴2023年Q4营收;微软推广Copilot

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月25日消息 滴滴2023年Q4营收 微软推广Copilot 极狐汽车将出口西班牙 华为公开智能驾驶新专利 华为P70系列发布…

【分布式】——分布式事务

分布式事务 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/tree-learning-notes ⭐⭐⭐⭐⭐⭐ Spring专栏&#x1f449;https://blog.csdn.net/weixin_53580595/category_12279588.html SpringMVC专…