构建全面 AI Agent 解决方案:Chocolate Factory 框架的文本到 UI、图表和测试用例生成...

news2024/11/18 1:30:53

长太不看版:基于领域驱动设计思考的 AI Agent 框架 Chocolate Factory,框架现在还在 PoC 阶段,欢迎加入开发。(当前主要关注于 SDLC + AIGC 的场景)。

GitHub:https://github.com/unit-mesh/chocolate-factory

Demo 视频:

在过去的一段时间,我们尝试从先前的 AIGC 应用经验里,进行一些再提炼和总结。从起先的 ClickPrompt(https://www.clickprompt.org/)、ChatFlow,到我们的 AI + 软件开发组织 Unit Mesh 下构建了一系列应用:

  • AutoDev。一个具备多语言支持 🌐、自动生成代码 🏗️ 和有用的错误修复助手 🐞 的AI驱动编程巫师!包括可定制的提示 🎨 和神奇的自动测试功能 🧪!🚀

  • DevTi。一个基于 LLM 的微调来提供全面智能化解决方案,助力开发人员高效完成开发任务,以实现自动化用户任务拆解、用户故事生成、自动化代码生成、自动化测试生成等等。

  • CoUnit。一个基于 LLM 的虚拟团队接口人(API),通过向量化文档、知识库、SDK和 API 等,结合 LLM 智能化团队间对接与协作。

  • 以及我们在其它海外、国内的内外部项目上的应用经验。

于是乎,我们开始构建 Chocolate Factory 框架,以实现一个内部的目标:如何在 1 天内将一个复杂场景做成 PoC?

引子 1:回顾 LLM + 工作流

22668234383849995423bc656eb3449f.jpeg

半年前,我们构建了 ChatFlow:https://github.com/prompt-engineering/chat-flow ,一个围绕 ChatGPT 构建的简易工作流引擎。简单来说:将做事的套路工具化,结合 AI 进行自动化。具体来说:

  1. 我们认为每个具体的问题可以拆为 N 步。

  2. 每一步都需要结合具体的规范和上下文。

  3. N 步之间都是有关联的,诸如于通过 DSL。

我们先前设计的 DSL 如下所示:

# ....
  - name: 分析需求,编写用户故事
    ask: |
      story: $$placeholder$$
    cachedResponseRegex: .*
    values:
      placeholder: |
        用户通过主菜单进入“权限管理”模块,选择“账号管理”Tab页,可以看到“新增账号”按钮。
        点击“新增账号”按钮,系统弹出新增账号窗口(可能还会写一句“背景置灰”)。
        用户可在窗口中填写姓名、登录邮箱……
        若用户未填写必填字段,则点击“确认”时给出错误提醒“请完成所有必填字段的填写!”
        点击“确认”按钮后弹出二次确认窗口,二次确认信息为“确认创建该账号?账号一旦创建成功即会邮件通知对应用户”。用户再次选择“确认”则系统创建账号,若用户选择“取消”则返回填写账号窗口。
  - name: Mermaid 绘制流程图
    ask: |
      我会给你一个模糊的需求,你需要:
      1. 分析和完善需求,但是不需要返回结果给我。
      2. 使用 Mermaid 绘制时序图,但是不需要返回给我。
      3. 最后,只返回 Mermaid 代码,如:"""```mermaid graph {}""",只返回 Mermaid 代码。
      需求,如下:
      """
      $$response:1$$
      """

而在使用 RAG 技术时,即结合向量数据库时,我们可以添加更多的 examples 作为上下文,就可以使 LLM 更理解我们的问题,以输出更理想的解决方案。

引子 2:DDD 的问题空间与解空间

软件系统的构建实则是对问题空间的求解,以此获得构建解空间的设计方案。—— 《解构领域驱动设计》

在领域驱动设计(Domain-Driven Design,简称DDD)中,问题空间(Problem Space)和解空间(Solution Space)是两个关键的概念,用于帮助开发团队理解和建模复杂的领域问题以及设计相应的软件解决方案:(由 ChatGPT 生成

  • 问题空间(Problem Space) 问题空间是指领域中实际的业务问题、需求和挑战,它关注的是业务领域的本质问题和业务需求。在问题空间中,团队与领域专家合作,收集和理解领域的业务规则、流程、概念以及业务需求。

  • 解空间(Solution Space)是指基于问题空间的理解所提出的软件解决方案,包括软件架构、设计模式、编码实现等。在解空间中,开发团队将问题空间的概念和需求映射到具体的代码和技术实现上。

DDD 强调问题空间和解空间之间的分离,这意味着在开始开发之前,团队应该首先深入了解问题空间,与领域专家合作,确保对领域的理解是准确的。然后,他们可以将这个理解映射到解空间,设计和实现相应的软件系统。

Chocolate Factory:将 DDD 应用于 Agent 设计

73c8ca80caaa7d64e7c8aa347dc90fd9.png

(在 Chocolate Factory 中,右边才是真正 AI Agent 的使用领域)

围绕于上面的思考,也就有了 Chocolate Factory 三个核心思想:

  1. 基于问题域的用户意图识别与引导。

  2. 以 DSL 作为问题域与解决方案的中间语言。

  3. 围绕解决方案的内容生成与执行结果。

而如何设计中间的 DSL,以作为问题域的精炼,并作为解决方案的输入,则需要取决于不同领域的场景。

基于我们现有的框架能力,我们在三个场景下构建了示例:

  • text2UI,文本生成前端 UI。步骤分为三个阶段:问题澄清、方案设计和方案执行。

  • text2code,文本生成代码。步骤只有一个阶段:方案执行。

  • text2testcases,文本生成测试用例。

详细可以见前面的参考视频。

6c1fc89b5ebfd9d529cf903bf1fd7128.png

Text2UI 示例

当然了,这么说有一些抽象,我们可以先看个例子。如下是 Chocolate Factory 的文本转 UI 的步骤:

  • 步骤 1:ProblemClarifier:使用响应式布局,编写一个聊天页面

    • 步骤 1.1:ProblemClarifier:左边是一个导航,中间是聊天区,聊天区的下方是一个输入按钮。

  • 步骤 2:SolutionDesigner:请确认以下的设计是否符合您的要求。如果符合,请回复"YES",如果不符合,请提出你的要求。

  • 步骤 3:SolutionExecutor:生成一个聊天页面

最后效果图如下:

eae2cec50c50a214f9f11bfe3f2d776f.png

Chocolate Factory 的 Stage 设计

根据上面的思想,我们设计了五个 Stage:

  • ProblemClarifier.kt:根据用户提供的文本来澄清问题,以确保准确理解用户的需求。问题澄清器的任务是分析用户的输入,提取关键信息,可能要求用户提供更多详细信息以确保问题清晰,并将清晰的问题描述传递给下一步。

  • ProblemAnalyzer.kt:可以进一步分析问题,将问题细化成更具体的子问题或任务,以帮助解决方案的设计和执行。

  • SolutionDesigner.kt:根据经过问题澄清和分析后的用户需求,设计一个解决方案。解决方案设计师的任务是将问题领域的需求转化为可执行的计划或设计,确保解决方案符合用户的期望和要求。

  • SolutionReviewer.kt:负责审核已经设计好的解决方案,以确保其质量、安全性和合规性。审核员可能会对解决方案进行测试和评估,并提出建议或修改,以满足特定标准和要求。

  • SolutionExecutor.kt:负责实际执行解决方案的步骤,根据设计好的计划来生成结果。根据具体情况,解决方案执行者的任务可以包括编程、自动化、生成文档等。

在不同的领域里,会根据场景不同,而有所取舍。诸如在测试用例的场景下,text2tecases 的步骤如下:

  • 步骤 1:ProblemAnalyzer 分析用户的需求,确认是否是一个测试用例生成的需求

    • 多 Temperature 模式:TemperatureMode.Default, TemperatureMode.Creative

  • 步骤 2:SolutionDesigner 设计测试用例生成的方案

  • 步骤 3:SolutionReviewer 确认方案是否符合用户的需求

当然,后续还可以继续结合执行场景的代码:

9f00b76c6358eb9563e9ffd54258035a.png

部署和开发 Chocolate Factory

只需要下载项目,并启动 docker compose 就行了。

git clone https://github.com/unit-mesh/chocolate-factory
# modify OPENAI_API_KEY and OPENAI_HOST in docker-compose.yml
docker-compose up

模块:Code Interpreter

我们从加强了开发的 Unit Runtime 中提供的 REPL 功能,除了原先的 Spring、Ktor 框架的代码段运行,现在还可以支持绘图功能。

模块:Local Embedding

在代码场景上,由于已经有 Bloop 的成功经验,所以我们采用了同样的方式 —— 使用本地 Sentence Transformers 进行 embedding,并进对应的向量化搜索。

小结

Chocolate Factory 框架为解决复杂问题提供了一个结构化的方法,通过结合领域驱动设计和AI生成代码技术,可以快速实现复杂场景的Proof of Concept(PoC)。这个框架的开源性使得更多开发者可以参与并贡献,推动了 AIGC 领域的发展。

框架现在还在 PoC 阶段,欢迎加入框架的开发。

GitHub:https://github.com/unit-mesh/chocolate-factory

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

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

相关文章

MySQL的架构和性能优化

一、架构 MySQL逻辑架构整体分为三层,最上层为客户端,并非MySQL独有,诸如:连接处理,授权认证,安全等功能均在这一层处理 MySQL大多数核心服务均在中间这一层,包括查询解析,分析优化…

【Mysql】数据库第三讲(表的约束、基本查询语句)

表的约束和基本查询 1.表的约束1.1 空属性1.2默认值1.3列描述1.4 zerofill1.5主键1.6 自增长1.7 唯一键1.8外键 1.表的约束 真正约束字段的是数据类型,但是数据类型约束很单一, 需要有一些额外的约束, 更好的保证数据的合法性,从…

【Flowable】FlowableUI使用以及在IDEA使用flowable插件(二)

前言 之前有需要使用到Flowable,鉴于网上的资料不是很多也不是很全也是捣鼓了半天,因此争取能在这里简单分享一下经验,帮助有需要的朋友,也非常欢迎大家指出不足的地方。 一、部署FlowableUI 1.准备war包 在这里提供了&#xf…

Java之Hashset的原理及解析

4.数据结构 4.1二叉树【理解】 二叉树的特点 二叉树中,任意一个节点的度要小于等于2 节点: 在树结构中,每一个元素称之为节点 度: 每一个节点的子节点数量称之为度 二叉树结构图 4.2二叉查找树【理解】 二叉查找树的特点 二叉查找树,又称二叉排序树或者二叉搜索树 每一…

【算法专题突破】双指针 - 最大连续1的个数 III(11)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:1004. 最大连续1的个数 III - 力扣(Leetcode) 这道题不难理解,其实就是求出最长的连续是1的子数组, 但是,他支…

[学习笔记]PageRank算法

参考资料:改变世界的谷歌PageRank算法 pagerank算法用于计算节点重要度 思想 如果网页被更多的入度(被引用),则网页更重要。 被重要网站引用比被普通网站引用更加凸显重要性。 所以考虑一个网站是否重要,需要看引用它的网站是否重要&#…

Mysql binlog的三种模式statement,row,mixed详解,以及无主键造成复制延时的测试

2.1 Statement 模式的概念 Statement 是基于语句的复制模式。 Statement 模式将数据库中执行的修改操作记录为 SQL 语句,再从数据库上执行相同的 SQL 语句来实现数据同步。 2.2 Statement 模式的优点 Statement 模式的优点是简单明了,易于理解和实现。…

工作不好找,普通打工人如何破局

大家好,我是苍何,我的一位阿里朋友被裁后,找工作找了一个月都没结果,很多到最后一面被pass了,不由得做一下感慨,即使是大厂背景又如何,面对经济环境和大环境市场,每个人都不容易。 …

关于一个left join的易错点

很多人在学习mysql的时候应该都出现过很多问题,特别是连接方面的问题应该最多,希望这篇文章帮助到正在找bug的你 Java报错数据返回数量出现错误 遇到这种问题一定要看日志 很明显通过left join查询除了两条数据并且为空 马上思考错误的原因,…

【playwright】访问不同链接方法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 访问不同页面方法方法比较 browser.new_page() page context.new_page() 1. 访问不同url 1.1 方法一 browser.new_page() 打开多个浏览器&#xff0…

JS如何判断一个变量是否为数组类型?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Array.isArray() 方法⭐ 使用 instanceof 操作符⭐ 使用 Object.prototype.toString.call() 方法⭐ 使用 Array.from() 方法⭐ 使用 Array.prototype.isArray 属性(不推荐)⭐ 写在最后 ⭐ 专栏简介 前端入门之…

人机融合的熵增定律

在信息论中,熵增定律是指在信息传输或处理过程中,总的熵(即不确定性或信息的度量)通常会增加。然而,对于人机融合的情况,熵增定律并不是一个普适的定律,而是取决于具体情境和应用。 当人与机器进…

uniapp-小程序登录授权框

微信官方文档 不弹出授权框原因 因为版本问题,目前的最新的版本是不支持 wx.getUserInfo 去主动弹出授权框 只能引导用户去点击 butten 去授权 解决方法 我的思路是参考了其他的微信微信小程序, 就是跳转到我的页面的时候 在钩子函数内去触发一个封装的模态框,状…

STM32-HAL库07-软件SPI驱动0.96寸OLED

STM32-HAL库07-软件SPI驱动0.96寸OLED 一、所用材料: STM32VGT6自制控制板 STM32CUBEMX(HAL库软件) MDK5 二、所学内容: 通过HAL库配置四个GPIO输出口,对其进行软件模拟SPI发送规则,进而驱动OLED进行数…

VisualStudio Code 支持C++11插件配置

问题 Visual Studio Code中的插件: Code Runner 支持运行C、C、Java、JS、PHP、Python等多种语言。 但是它不支持C11特性的一些使用,比如类似错误: binarySearch.cpp:26:17: error: non-aggregate type ‘vector’ cannot be initialized with an ini…

C++(day4)

思维导图 封装Mystring #include <iostream> #include<cstring>using namespace std;class Mystring{ public://无参构造函数Mystring():size(10){strnew char[size];strcpy(str,"");cout<<"无参构造函数"<<endl;}//有参构造函数…

前端内存泄漏和溢出的情况以及解决办法

写在前面&#xff1a; 在平时写代码时&#xff0c;内存泄漏的情况会时有发生&#xff0c;虽然js有内存回收机制&#xff0c;但在平时编程中还是需要注意避免内存泄漏的情况&#xff1b;前几天做移动端时遇到一个内存泄漏造成移动端页面卡顿的问题&#xff0c;所以想总结下前端…

GO语言网络编程(并发编程)Channel

GO语言网络编程&#xff08;并发编程&#xff09;Channel 1、Channel 1.1.1 Channel 单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。 虽然可以使用共享内存进行数据交换&#xff0c;但是共享内存在不同的goroutine中容易发生竞态…

Linux Debian12使用git将本地项目打标签、创建分支和分支合并到master再上传到码云(gitee)远程仓库

一、git创建分支并克隆指定分支到本地 gitee官网&#xff1a;https://gitee.com/ 登录上gitee账号,我这用test仓库作测试。新建分支名称为develop&#xff0c;分支起点选择master&#xff0c;创建即可&#xff0c;如下图所示&#xff1a; 使用git管理代码版本时&#xff0…

SpringBoot 中的事务管理讲解

Spring Boot 中的事务管理 在实际的开发中&#xff0c;事务是非常重要的一个概念。在 Spring Boot 中&#xff0c;我们可以使用事务管理器来管理事务。事务管理器可以确保一系列操作要么全部成功&#xff0c;要么全部失败&#xff0c;从而保证数据的一致性和完整性。在本文中&…