百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

编码数据集生成框架 UnitGen 0.4.0:代码文档生成、测试代码生成

ccwgpt 2024-10-19 03:11 46 浏览 0 评论

UnitGen 是我们从 UnitEval 拆分出来的代码数据集生成项目,旨在为基于开源模型供的私有化部署提供更好的编码数据集。

在结合开源模型 + AutoDev 插件之后,你可以使用 UnitGen 结合企业内部现有的代码生成微调数据集,以让模型生成的代码更适合组织内部的需要,提升开发人员效率。

GitHub:https://github.com/unit-mesh/unit-gen

使用文档:https://gen.unitmesh.cc

UnitGen 数据集生成框架

如在先前的文章所介绍,为了保持 UnitMesh 开源 AI 辅助编码方案的完整性,即 UnitGen + AutoDev + UnitEval 工具的一体化,我们所秉持的设计原则是:

  • 统一提示词(Prompt)。统一工具-微调-评估底层的提示词。

  • 代码质量管道(Pipeline)。诸如于代码复杂性、代码坏味道、测试坏味道、API 设计味道等。

  • 可扩展的质量阈。自定义规则、自定义阈值、自定义质量类型等。

基于上述的思想,我们所实现的 UnitGen 架构所如所示:

在实现上主要分为两部分:

  • 基于 LanguageWorker 的上下文策略实现。即由于不同语言的语法差异,如文档位置、数据 + 行为实现方式,我们需要根据需要做一些差异化的实现。

  • 基于 ArchGuard 的质量检查。我们会先进行一些基本的长度、是否minifid 检查(JavaScript)等。ArchGuard 只是作为阈值的一部分,以支持:代码、测试代码、MVC 代码的质量检查。

在底层,我们使用了自己开源的 Chapi 来实现对于语言的 AST(抽象语法树) 转换和处理分析,以更好处理语言与数据结构的问题。Chapi 是一个开源的通用层次抽象解析器与信息转换器,它可以将不同编程语言的源代码转换为统一的层次抽象模型。

与此同时,由于架构治理平台 ArchGuard 本身也是基于 Chapi 作为其分析引擎的核心语法处理,所以两者可以实现很好的兼容 + 互补。诸如于在完善 UnitGen 功能的同时,ArchGuard 的质量功能也在持续完善。

UnitGen 文档数据集生成

在文档数据生成上,与先前的补全数据集生成,文档的生成逻辑非常简单 —— 找到对应的注释块(类和方法级),然后生成即可。甚至于,我们可以直接使用代码来解释:

  1. container.DataStructures.forEach { dataStruct ->

  2. // build class comment

  3. val methodCommentIns =

  4. dataStruct.Functions

  5. .filter { it.Name != "PrimaryConstructor" }

  6. .map { function ->

  7. // build method comment

  8. }

  9. // return comments

  10. }

在 Chapi 里代码文件是一个 Container,Container 内包含一系列的 DataStructures,每个 DataStructure 则包含了一系列的 Functions。因此,在实现上只需要先构建出所有的注释块,做一些基本的质量检查,再与对应的代码块结合。

UnitGen 测试数据集生成

由于 AutoDev 支持的是整个测试文件的生成,因此在生成测试时要考虑到测试框架和技术框对于项目的影响,所以还需要读取项目的依赖信息。

除此,UnitGen 在测试数据生成上,同样分为类级和方法级,但是方法级的生成比类级稍微复杂一些 —— 需要分析出被测函数。

获取框架与测试框架信息

框架等信息的分析,其实就是 SCA(Software Composition Analysis)软件成分分析。在实现上,我们需要分析出项目的依赖文件、依赖信息,并尝试给出主要的框架。诸如于:

  • 从 package.json 知道项目使用的是 React 框架,并使用了 Jest 作为测试框架

  • 从 build.gradle 中获取项目使用是 Spring Boot 框架,并使用了 spring-boot-starter-test 作为测试框架。

所以,我们在 UnitGen 中创建了 ProjectContextTestStack 来管理它们。而在实现上,由于我们在开源的架构治理平台 ArchGuard 中编写了依赖分析模块 analyser_sca ,随后根据不同的语言编写主流的框架和映射。

函数级测试数据集生成

对于文件级的测试生成来说,实现起来非常简单 —— 通过包名和类名来映射,就能通过测试文件找到被测试文件。但是,对于微调来说,会导致样本过少。与此同时,由于我们通常更想要的实现某个方法的测试,所以需要构建和分析 CG(Call graph,函数调用图),以正确匹配测试方法和被测试方法 —— 当时这并非 100% 正确的,需要测试方法在被测试方法最后调用。

而正好我们在 Chapi 中实现了对应的 CG 静态分析,所以可以直接遍历 Function 的 FunctionCalls 就能实现上述的功能。

  1. dataStruct.Functions.mapIndexed { _, function ->

  2. function. c.map {

  3. val canonicalName = it.Package + "." + it.NodeName + ":" + it.FunctionName

  4. if (it.NodeName != underTestFile.NodeName) return@map

  5. val originalContent = underTestFunctionMap[canonicalName] ?: return@map

  6. if (originalContent.isBlank() || function.Content.isBlank()) return@map

  7. // 生成测试指令

  8. }

  9. }

而考虑到不同的开发人员编写测试的习惯不一样,所以还需要检查一下测试代码的命名规则:

  1. val namingStyle = dataStruct.checkNamingStyle()

人生苦短,我有:https://github.com/phodal/chapi 。

Chapi 支持主流语言(我喜欢使用的)的 FunctionCall,所以在这些语言的 FunctionCall 功能相对比较完整:

关于 Chapi 的更多介绍见:https://chapi.phodal.com/ 。

其它

在外部测试时,我们使用了 ThoughtWorks 开源项目作为核心,并结合一些框架的官方 examples,诸如 Spring Data Examples, ArchUnit Examples,以更好地辅助开发人员编写对应的测试。

同时,在生成第二个版本的 AutoDev Coder 数据集时,我们人工 review 了一部分代码,结合 OpenAI 重构了注释和一些测试的实现,以提升数据级的质量 —— 以实现真正的人工-智能。


相关推荐

一个基于.Net Core遵循Clean Architecture原则开源架构

今天给大家推荐一个遵循CleanArchitecture原则开源架构。项目简介这是基于Asp.netCore6开发的,遵循CleanArchitecture原则,可以高效、快速地构建基于Ra...

AI写代码翻车无数次,我发现只要提前做好这3步,bug立减80%

写十万行全是bug之后终于找到方法了开发"提示词管理助手"新版本那会儿,我差点被bug整崩溃。刚开始两周,全靠AI改代码架构,结果十万行程序漏洞百出。本来以为AI说没问题就稳了,结果...

OneCode低代码平台的事件驱动设计:架构解析与实践

引言:低代码平台的事件驱动范式在现代软件开发中,事件驱动架构(EDA)已成为构建灵活、松耦合系统的核心范式。OneCode低代码平台通过创新性的注解驱动设计,将事件驱动理念深度融入平台架构,实现了业务...

国内大厂AI插件评测:根据UI图生成Vue前端代码

在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件登录腾讯的CodeBuddy后,大模型选择deepseek-v3,输入提示语:...

AI+低代码技术揭秘(二):核心架构

本文档介绍了为VTJ低代码平台提供支持的基本架构组件,包括Engine编排层、Provider服务系统、数据模型和代码生成管道。有关UI组件库和widget系统的信息,请参阅UI...

GitDiagram用AI把代码库变成可视化架构图

这是一个名为gitdiagram的开源工具,可将GitHub仓库实时转换为交互式架构图,帮助开发者快速理解代码结构。核心功能一键可视化:替换GitHubURL中的"hub...

30天自制操作系统:第六天:代码架构整理与中断处理

1.拆开bootpack.c文件。根据设计模式将对应的功能封装成独立的文件。2.初始化pic:pic(可编程中断控制器):在设计上,cpu单独只能处理一个中断。而pic是将8个中断信号集合成一个中断...

AI写代码越帮越忙?2025年研究揭露惊人真相

近年来,AI工具如雨后春笋般涌现,许多人开始幻想程序员的未来就是“对着AI说几句话”,就能轻松写出完美的代码。然而,2025年的一项最新研究却颠覆了这一期待,揭示了一个令人意外的结果。研究邀请了16位...

一键理解开源项目:两个自动生成GitHub代码架构图与说明书工具

一、GitDiagram可以一键生成github代码仓库的架构图如果想要可视化github开源项目:https://github.com/luler/reflex_ai_fast,也可以直接把域名替换...

5分钟掌握 c# 网络通讯架构及代码示例

以下是C#网络通讯架构的核心要点及代码示例,按协议类型分类整理:一、TCP协议(可靠连接)1.同步通信//服务器端usingSystem.Net.Sockets;usingTcpListene...

从复杂到优雅:用建造者和责任链重塑代码架构

引用设计模式是软件开发中的重要工具,它为解决常见问题提供了标准化的解决方案,提高了代码的可维护性和可扩展性,提升了开发效率,促进了团队协作,提高了软件质量,并帮助开发者更好地适应需求变化。通过学习和应...

低代码开发当道,我还需要学习LangChain这些框架吗?| IT杂谈

专注LLM深度应用,关注我不迷路前两天有位兄弟问了个问题:当然我很能理解这位朋友的担忧:期望效率最大化,时间用在刀刃上,“不要重新发明轮子”嘛。铺天盖地的AI信息轰炸与概念炒作,很容易让人浮躁与迷茫。...

框架设计并不是简单粗暴地写代码,而是要先弄清逻辑

3.框架设计3.框架设计本节我们要开发一个UI框架,底层以白鹭引擎为例。框架设计的第一步并不是直接撸代码,而是先想清楚设计思想,抽象。一个一个的UI窗口是独立的吗?不是的,...

大佬用 Avalonia 框架开发的 C# 代码 IDE

AvalonStudioAvalonStudio是一个开源的跨平台的开发编辑器(IDE),AvalonStudio的目标是成为一个功能齐全,并且可以让开发者快速使用的IDE,提高开发的生产力。A...

轻量级框架Lagent 仅需20行代码即可构建自己的智能代理

站长之家(ChinaZ.com)8月30日消息:Lagent是一个专注于基于LLM模型的代理开发的轻量级框架。它的设计旨在简化和提高这种模型下代理的开发效率。LLM模型是一种强大的工具,可以...

取消回复欢迎 发表评论: