规范即治理函数:LLM 赋能的软件架构治理与架构设计

news2024/11/27 9:17:37

在我们设计架构治理平台 ArchGuard 2.0 的架构时,一直在强调的点是:基于规范 + 模式的工具化。简单来说,规范是架构设计的共时也是架构知识的显性化。所以,在让 AI 设计架构时,规范是我们要考虑的第一要素,第二要素是:基于现有实现地设计。

在 ArchGuard 里,我们遇到的其中一个挑战是:如何识别不可言表的设计?于是,我们尝试构建 ArchGuard Co-mate 来理解这些设计,挑战也变为:如何让 AI 基于规范和架构已有上下文设计?因此,在这篇文章里,我们将介绍 Co-mate 分析过程与实现方式:基于 AI 原子能力的动态函数生成

TL;DR 版本:

3fb45606d245937ffdbe6730cc2554cd.png

简单来说,本文就是要解释上图的过程。

经典工具的局限性:无法识别不可言表的设计

在年初的 QCon 上,我和同事雨青在《组织级架构治理的正确落地方式》总结了架构治理的现状和挑战。

9e217d2ed9ac526b7de6e7292113ef3c.png

这种现状,我们总结称之为“小”团队、“大”能量的架构治理模式:
  • Think Big。通常来说,组织架构治理的顶层目标和范围都是比较大的,比如整合管理整个组织的应用资产、实现整体IT成本降低、效能提升等等。

  • Start Small。这里的 small 指的是架构治理团队,可能有的叫架构办、有的叫技术委,大多是 3-5 人这个数量级,也有十多人的比较少。和整体研发组织规模相比,很多是属于 1:100 的这个比例,也就是 1 个架构治理人员对应 100 个研发人员,甚至更多。

  • Move on foot。即徒步前行,指的是架构治理工作很多都是手工完成的,包括大规模的架构现状盘点、持续的架构评审等活动,很少有工具支撑的。

尽管,ArchGuard 2.0 能解决一部分问题,但是依旧有问题没有解释:不可言表的设计。这个问题出现在:ArchGuard 一直难以对一个项目的架构建模,有太多抽象的内容无法建模,而这些对于 LLM 是很容易的:

  • 当前(As-Is)架构或者未来(To BE)架构。系统本身是一直在变化的,变化的原因可能出自于多种上下文。

  • 分层架构不规范。如果分层架构(三层架构、DDD/四层架构)本身是规范的,那么工具可以识别出来;然而现实是不规范的分层架构,导致人也难以知道原先是三层还是四层的。

  • 技术栈的百花齐放。过多的技术栈,使得我们难以用工具识别架构的核心所在,而种总结对于人类和 LLM 来说轻而易举。

所以,我们转换了一下思路:如果 LLM 能否抽象这些不可言表的设计呢?所以,如何能否动态生成系统上下文的治理函数?

规范即函数:基于 LLM 原子能力的动态函数生成

在先前的一系列文章里,我们已经介绍了结合 LLM 设计软件架构,需要的是一系列的 DSL。即可以由 LLM 来动态生成,又可以是我们设计的。但是,我并不相信 LLM 的代码能力,所以我更愿意的做法是:让 LLM 来理解文档、DSL,以编排 DSL 来治理架构。

这也是基于 LLM 原子能力来动态生成治理函数的核心所在。

要素一:围绕 LLM 原子能力的设计

回到某个 AIGC 的闭门会议上,路宁老师提到了一个 AI 应用架构设计的要点:我们需要考虑分解 LLM,提取原子能力(类似于微服务)。再基于约束好的工程化步骤,构建完我们的上下文,可以构建出更理想的 AI 应用。

简单来说:结合 AI 的能力,看能解决我们的哪些问题。LLM 擅长什么,不擅长的点是否直接给 ArchGuard 完成。

比如说,在 Co-mate 的 REST API 治理场景下,我们使用的 LLM 能力包括了:

  • 分类:让 LLM 分析 API 文档,让我们后续根据 URI、HTTP Action、安全等几个不同的能力维度来选择适合的工具。

  • 逻辑推理:让 LLM 分析 API 文档的 URI Construction 部分,生成用于检查的 URI 正则表达式部分,以及适合于人类阅读的 by example 部分。当然了,也包含了其它场景之下的推理。

  • 提取:由 LLM 按 API 规范的不同维度来提取一些关键信息。

  • 分类:由 LLM 来总结哪些部分难以简单的通过代码总结,诸如于安全等不适合于所有的 API 场景。

  • ……

由此构成了 “能力映射” 的左图部分,这种方式适用于不同的规范分解。尽管如此,对于当前方式来说,依然还有一系列的可优化的空间,诸如于对 security、 misc 进行进一步的能力分解。

要素二:丰富基于规范的架构治理 “函数”

再回到我们的 API 规范上,我们从网上找了一个 API 规范示例(可以见 ArchGuard Co-mate 源码里的 docs/ ),初步将其分解为五个维度:HttpActionRule、StatusCodeRule、UriConstructionRule、MiscRule、SecurityRule。前三者由传统的规则检查工具来处理,后两者则由 LLM 进行二次的检查。

bd11e6fe1510032f5426e08472596ed5.png

在验证了 LLM 基于文档的检查能力之后,我们将其转换为工具化的一部分。而把所有的 API 直接扔给 LLM 来检查是不合理的,也是不科学的。所以,结合 LLM 的能力、API 分类、检查频率等,将其划分了多个维度:

rest_api {
    uri_construction {
        rule("/api\\/[a-zA-Z0-9]+\\/v[0-9]+\\/[a-zA-Z0-9\\/\\-]+")
        example("/api/petstore/v1/pets/dogs")
    }
    http_action("GET", "POST", "PUT", "DELETE")
    status_code(200, 201, 202, 204, 400, 401, 403, 404, 500, 502, 503, 504)
    security("""Token Based Authentication (Recommended) Ideally, ...""")
    misc("""....""")
}

如在 API 场景下,我们需要对其进行分类。诸如于可以分为通用的 HTTP 资源型 API,登录等其它 API。

  • 通用 HTTP 资源治理。大部分可以直接由本地治理函数来完成。

  • 杂项 API。往往需要通过人或者 LLM 来进行分解,诸如于鉴权、health 等 API。

也因此,在未来我们需要的其实是大语言模型友好的架构规范。而这也是现阶段大部分文档不友好的地方,它们本身对于人是不友好的,工具编写时也缺乏一定的条理性。

要素三:构建实时的、动态的架构治理功能

在由 LLM 分析规范文档、分类的 spec,并生成基本的治理函数之后,我们需要结合两种不同的动态能力,以使它们有机的结合在一起。

在 ArchGuard Co-mate 里,我们依旧使用的是基于 DSL + Kotlin REPL Runtime 的方式来实现这个功能。

  • 治理 DSL。即步骤二的代码示例。其基于 Kotlin 的 Type-safe builders 实现。

  • Kotlin REPL。与之前的 ArchGuard 架构治理工作台一样,基于 Kotlin Jupyter Runtime 构建,并把 Co-mate 的相关依赖添加到进去,以实现直接的函数调用。

在由 ArchGuard API 提取了 API 之后,剩下的部分就可以交由 LLM 来实现,即交由神奇的 prompt 去进行分析:

69297f05860db94e585c7a7112c8d44c.png

作为一个黑盒的函数,调试 prompt 真是一件痛苦的事情。

小结:LLM 编排架构治理函数

对于本文而言,我们主要是通过 LLM 来进行治理函数的提取与编排,进而进行架构的治理。与需要大量上下文的编码相比,LLM 在编排上做得更好,只需要基本的推理和逻辑能力即可。

更详细的内容请阅读源码:https://github.com/archguard/co-mate 

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

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

相关文章

0 基础学脚本:给同事做一个排班表并每日通知「02」

Hello 小伙伴们早上、中午、下午、晚上、深夜好! 我是爱折腾的 jsliang~ 本系列文章和配套直播视频,面向金山文档的「轻维表」「表单」用户。 希望通过【自动化】和【脚本】等能力,让里面数据相互流转起来,从而提升工作效率。 序 …

企业级信息系统开发讲课笔记4.10 配置国际化页面

文章目录 零、学习目标一、使用Thymeleaf配置国际化页面(一)创建Spring Boot项目 - ThymeleafI18N(二)编写多语言国际化配置文件1、在resources下创建i18n目录2、在i18n目录里创建login.properties3、在i18n目录里创建login_zh_CN…

Prompt 用法大全!让 ChatGPT 更智能的六种策略(下)

上两篇介绍了 Pormpt 用法大全中前四种策略,本篇继续讲解后两种策略。‍‍‍‍‍ 点燃创作灵感:Prompt 实践指南揭秘!让 ChatGPT 更智能的六种策略(上) Prompt 用法大全!让 ChatGPT 更智能的六种策略&#…

基于html+css的图展示122

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

docker 的网络模式

一、docker网络概述 1、docker网络实现的原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP, 同时Docker网桥是 每个容器的…

ISO21434 操作和维护(十)

目录 一、概述 二、目标 三、网络安全事件响应 3.1 输入 3.1.1 先决条件 3.1.2 进一步支持信息 3.2 要求和建议 3.3 输出 四、更新 4.1 输入 4.1.1 先决条件 4.1.2 进一步支持信息 4.2 要求和建议 4.3 输出 一、概述 本条款描述了对文件中的项目…

Mysql中explain的用法详解

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

企业级信息系统开发讲课笔记4.8 Spring Boot整合Redis

文章目录 零、学习目标一、Redis概述1、Redis简介2、Redis优点(1)存取速度快(2)数据类型丰富(3)操作具有原子性(4)提供多种功能 3、Redis官网与在线教程 二、使用Spring Boot 整合 R…

c++11 标准模板(STL)(std::ios_base)(二)

定义于头文件 <ios> class ios_base; 类 ios_base 是作为所有 I/O 流类的基类工作的多用途类。它维护数种数据&#xff1a; 1) 状态信息&#xff1a;流状态标志&#xff1b; 2) 控制信息&#xff1a;控制输入和输出序列格式化和感染的本地环境的标志&#xff1b; 3)…

音视频技术开发周刊 | 297

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 Geenee AR为品牌商和零售商提供虚拟试穿应用 这意味着Geenee AR的虚拟试穿解决方案能够与品牌商现有的销售渠道无缝集成。 谁说苹果掉队了&#xff1f;WWDC上只字未提AI&a…

macbook pro存储空间不足怎么办? MacBook Pro怎么优化或清理Mac磁盘空间?

MacBook Pro用久了之后都会堆积很多残留文件或缓存垃圾&#xff0c;久经之下MacBook Pro磁盘空间将会面临不够用的情况。 macbook pro存储空间不足怎么办&#xff1f;macbook pro笔记本中的存储空间不足&#xff0c;想要优化一下&#xff0c;该怎么优化呢&#xff1f; 这时候…

【电路】电路与电子技术基础 课堂笔记 第8章 负反馈放大电路

反馈放大电路有很多好处&#xff0c;可以增加放大电路的输入电阻&#xff0c;使输出电流京可能稳定&#xff0c;保证输出电压随负载变化波动较小&#xff0c;减小电路元件参数变化对电路性能的影响等。 反馈放大电路分为正反馈和负反馈放大电路。 8.1 反馈的基本概念 8.1.1 反…

在(Linux)ubuntu下通过GTK调用libvlc开发视频播放器

一、项目介绍 本项目实现了一个基于GTK和libvlc的视频播放器。使用GTK创建GUI界面,使用libvlc播放视频。用户可以通过选择视频文件,然后启动播放器来观看视频。 二、VLC介绍 VLC是一款自由、开放源代码的跨平台媒体播放器,支持播放几乎所有常见的音频和视频格式。最初于20…

STM32管脚模拟协议驱动双路16位DAC芯片TM8211

STM32管脚模拟协议驱动双路16位DAC芯片TM8211 TM8211是一款国产的低成本双路16位DAC驱动芯片&#xff0c;可以应用于普通数模转换领域及音频转换领域等。这里介绍STM32 HAL库驱动TM8211的逻辑,时序和代码。 TM8211的功能特性为&#xff1a; TM8211的内部电路功能框图为&…

一个人最大的愚蠢,就是 “习惯性反驳”

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 每个人都有“反驳的义务”&#xff0c;这是全球顶级咨询公司麦肯锡&#xff0c;对所有员工的行为要求&#xff0c;即对于自己不认同的看法和意见&#xff0c;明确表示出自己的想法并提出反驳。麦肯锡认…

揭秘报表新玩法!标配插件不再单调,手把手教你如何在浏览器中引入柱形图插件。

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 图表作为一款用于可视化数据的工具&#xff0c;可以帮助我们更好的分析和理解数…

【Rust日报】2023-06-10

nt-apiset: 一个用于 WindowsAPI API Set Map文件 的 Rust 解析器 我的bootloader程序项目的下一个构建块已经准备好了&#xff01;Nt-apiset 是用 Rust 编写的用于 Windows10及更高版本的 API Set Map 文件的解析器。 API Set是名称以“ API-”或“ ext-”开头的 PE 可执行文件…

【MySQL】View 视图用法及作用

文章目录 1. 视图概述1.1 为什么使用视图&#xff1f;1.2 视图的理解 2. 创建视图2.1 创建单表视图2.2 创建多表联合视图2.3 基于视图创建视图 3. 查看视图4. 更新视图的数据4.1 一般情况4.2 不可更新的视图 5. 删除视图6. 总结6.1 视图优点6.2 视图缺点 1. 视图概述 1.1 为什么…

STL之优先级队列(堆)的模拟实现与仿函数(8千字长文详解!)

STL之优先级队列&#xff08;堆&#xff09;的模拟实现与仿函数 文章目录 STL之优先级队列&#xff08;堆&#xff09;的模拟实现与仿函数优先级队列的概念priority_queue的接口介绍优先级队列的构造函数 priority_queue模拟实现类成员构造函数向下调整算法——正常实现 push向…

正负10V电压输入±电流输出伺服阀控制器

10V、4~20mA模拟指令输入伺服阀放大器是一种控制元件&#xff0c;用于控制液压系统中的比例阀或伺服阀。它主要由三个部分组成&#xff1a;比例阀或伺服阀、放大器。 比例阀或伺服阀是控制流量或压力的元件&#xff0c;它的输出信号通常是电压或电流。放大器用于将实际值转换为…