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

长太不看版:基于领域驱动设计思考的 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.mzph.cn/news/76183.shtml

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

相关文章

ffmpeg安装及使用

centos linux下安装ffmpeg 1、下载解压 wget http://www.ffmpeg.org/releases/ffmpeg-3.1.tar.gz tar -zxvf ffmpeg-3.1.tar.gz 2、 进入解压后目录,输入如下命令/usr/local/ffmpeg为自己指定的安装目录 cd ffmpeg-3.1 ./configure --prefix/usr/local/ffmpeg make &&a…

文件上传之图片马混淆绕过与条件竞争

一、图片马混淆绕过 1.上传gif imagecreatefromxxxx函数把图片内容打散,,但是不会影响图片正常显示 $is_upload false; $msg null; if (isset($_POST[submit])){// 获得上传文件的基本信息,文件名,类型,大小&…

Web jQuery—属性、元素、尺寸和位置

jQuery 属性、元素、尺寸和位置 代码下载 jQuery 属性操作 jQuery 常用属性操作有三种:prop() / attr() / data() ; 元素固有属性值 prop() 所谓元素固有属性就是元素本身自带的属性,比如 元素里面的 href ,比如 元素里面的 type。 语…

迷你无人车 Navigation 导航(3)

迷你无人车 Navigation 导航&#xff08;3&#xff09; 自己实现了对于迷你无人车关节的控制&#xff0c;由于原本的关节布置仅支持阿克曼转向&#xff0c;因此先进行阿克曼转向的控制 修改 URDF 文件 添加 transmission 标签&#xff0c;定义关节的驱动 <transmission …

ant-design-vue table 同时勾选或者取消勾选某字段值相同的数据

Ant-design-vue 库中 Table 组件 API 有个 rowKey 属性&#xff1a;表格行 key 的取值&#xff0c;既可以是字符串&#xff0c;也可以是一个函数&#xff0c;它在 rowSelection 选择功能的配置中尤为重要。 在勾选或者取消选中项回调的 onChange 事件中&#xff0c;有两个参数返…

Linux 中的 comm 命令及示例

comm 逐行比较两个排序的文件并写入标准输出;常见的线条和独特的线条。 假设您有两个人员列表,并且要求您找出其中一个列表中可用而另一个列表中不可用的名称,甚至是两个列表中共有的名称。comm是帮助您实现这一目标的命令。它需要两个排序的文件,并逐行比较。在进一步讨论…

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

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

基于Java SSM+layui+mysql实现的图书借记管理系统源代码+数据库

介绍 本项目使用的技术栈是SSMlayuimysql&#xff0c;服务器使用的是tomcat 其中书籍图片存放的位置需要先在tomcat根目录下conf/setting.xml中配置虚拟路径&#xff0c;本项目配置的是D:\upload 完整代码下载地址&#xff1a;图书借记管理系统 用户角色划分 游客 使用本系…

ArcGis地图

1、概述 官网&#xff1a;https://developers.arcgis.com/qt/ 官网&#xff1a;官网指导 官网&#xff1a;Add graphics to a map view 官网&#xff1a;Esri官方博客 官网(github)&#xff1a;https://github.com/Esri Arcgis runtime sdk for Qt 开发记录&#xff08;系列文…

Vue+NodeJS实现邮件发送

一.邮箱配置 这里以QQ邮箱为例,网易邮箱类似. 设置->账号 二.后端服务搭建 index.js const express require(express) const router require(./router); const app express()// 使用路由文件 app.use(/,router);app.listen(3000, () > {console.log(server…

项目上线部署--》网站运行机制

网站运行机制 &#x1f31f;名词解释 域名 DNS 服务器 服务器 &#x1f31f; 网站请求流程 静态页面 动态页面 前后端分离的页面 前后端不分离的页面 &#x1f31f;写在最后 &#x1f31f;名词解释 域名 www.baidu.comwww.taobao.comwww.qq.com 域名俗称网址&#xf…

MVCC

MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是数据库管理系统&#xff08;DBMS&#xff09;中的一种技术&#xff0c;用于管理并发访问数据&#xff0c;允许多个事务同时进行而不互相干扰&#xff0c;同时保持数据的一致性。 MVCC 的工作原理如下&#xf…

AI入门指南:探索人工智能的基础原理和实际应用

引言 介绍AI的基本概念&#xff1a;什么是人工智能&#xff0c;为什么它如此重要。 引出博客的主要内容&#xff0c;即AI的基础原理和实际应用。 第一部分&#xff1a;AI的基础原理 什么是人工智能&#xff1a; 解释AI的定义和范畴。 介绍AI的历史和发展。 机器学习入门&#x…

高级深入--day22

机器视觉 从 Google 的无人驾驶汽车到可以识别假钞的自动售卖机&#xff0c;机器视觉一直都是一个应用广 泛且具有深远的影响和雄伟的愿景的领域。 我们将重点介绍机器视觉的一个分支&#xff1a;文字识别&#xff0c;介绍如何用一些 Python库来识别和使用在线图片中的文字。…

Qt 10进制和16进制转换

10进制和16进制转换 通过标准库std::stringstream进行10进制和16进制转换10进制转换成16进制16进制转换成10进制 通过QString::number()和toInt()、setNumbe()等方法进行转换10进制转换成16进制16进制转换成10进制 格式化输出 在项目开发中&#xff0c;如何进行进制转换&#x…

Linux centos7 bash编程训练__打印各类形状

利用for循环&#xff0c;打印各种不同的三角形、矩形和菱形。 主要是fort循环嵌套使用&#xff0c;及条件判断等。 因方法简单&#xff0c;不作更多解释&#xff0c;部分注释可以帮助初学者掌握代码。 下面列出代码&#xff0c;供参考。 #! /bin/bash ## 打印输出各种*型形…

觉非科技数据闭环系列 | BEV感知研发实践

随着自动驾驶迈向量产场景&#xff0c;“BEV感知数据闭环”已成为新一代自动驾驶量产系统的核心架构。数据成为了至关重要的技术驱动力&#xff0c;发挥数据闭环的飞轮效应或将成为下半场从1到N的胜负关键。 觉非科技在此方面已进行了大量的研究工作&#xff0c;并在实际量产项…

解决nbsp;不生效的问题

代码块 {{title}} title:附 \xa0\xa0\xa0件,//或者 <span v-html"title"></span> title:附 件&#xff1a;,效果图

volatile 变量是什么?volatile 变量和 atomic 变量有什么不同?

volatile 变量是一种在Java中用于修饰字段的关键字,用于确保多线程之间的可见性和禁止指令重排序。volatile 修饰的变量具有以下特性: 可见性(Visibility):volatile 变量的值对所有线程都是可见的。当一个线程修改了 volatile 变量的值,其他线程会立即看到这个变化。 禁止…

Elasticsearch近实时架构

1 Elasticsearch 与 Lucene 的结构理解 一个Elasticsearch索引由一个或多个分片&#xff08;shards&#xff09;组成。这些分片可以是主分片&#xff08;primary shard&#xff09;或副本分片&#xff08;replica shard&#xff09;。每个分片都是一个独立的Lucene索引&#xf…