LLM 优先的软件架构:源自 ArchGuard Co-mate 的四个基本设计原则

news2024/7/6 19:47:53

在优化 ArchGuard 的 AI 辅助架构治理工具 Co-mate 的架构时,发现有一些模式与之前设计 AutoDev、ClickPrompt 等颇为相似。便思考着适合于 ArchGuard Co-mate 的架构设计原则是什么,写下了初步的三条原则。

而正好要在公司内分享 LLM + 架构,便又整理了适合于更通用的四个架构设计原则。以此作为一个参考的架构原则基础,方便于我后续设计其它的 LLM 为核心的软件架构。

476381a95f220ea033d886fe69d08450.png

TL;DR 版本:

  • 用户意图导向设计。设计全新的人机交互体验,构建领域特定的 AI 角色,以更好地理解用户的意图。简单来说,寻找更适合于理解人类意图的的交互方式。

  • 上下文感知。构建适合于获取业务上下文的应用架构,以生成更精准的 prompt,并探索高响应速度的工程化方式。即围绕高质量上下文的 Prompt 工程。

  • 原子能力映射。分析 LLM 所擅长的原子能力,将其与应用所欠缺的能力进行结合,进行能力映射。让每个 AI 做自己擅长的事,诸如于利用好 AI 的推理能力。

  • 语言 API。探索和寻找合适的新一代 API ,以便于 LLM 对服务能力的理解、调度与编排。诸如自然语言作为人机 API,DSL 作为 AI 与机器间的 API 等。

作为一个参考性的架构原则,它在不同的场景之下是需要经过一定裁剪的。以上仅是一些初始想法,还需要进一步的研究和实践来完善。

引子:ArchGuard Co-mate 的三个设计架构原则

Co-mate 是基于 ArchGuard 的分析能力所构建的,并且是以 DSL、规范文档为核心来构建的。所以,我们设计了三条初步的设计原则:

  • DSL 作为统一语言。通过使用领域特定语言(DSL)来增强人机交互,实现高效的人机、机机、机人交流。

  • 原子化 LLM 以用于编排。利用语言模型(LLM)的原子能力,在 DSL 中构建复杂的行为。即我们在上一篇文章《规范即治理函数》提到基于 LLM 原子能力的动态函数生成。

  • 精心设计的分层动态上下文。通过将上下文分为不同的层次,使用 LLM 有效地处理复杂性。

总体关系如下图所示:

f61355e5406b072c577fe589be00850b.png

在 Co-mate 中,我们采用了 Kotlin Type-safe Builder 封装了基础的函数功能,以让 LLM 能根据文档、规范来编排治理函数。

原规范如下所示:

- 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
- 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式,正确的英文拼写和语法可以让阅读者易于理解,避免歧义。
- 类名使用 UpperCamelCase 风格,必须遵从驼峰形式。正例: HelloWorld。

示例 DSL 如下所示:

naming {
    class_level {
        style("CamelCase")
        pattern(".*") { name shouldNotBe contains("$") }
    }
    function_level {
        style("CamelCase")
        pattern(".*") { name shouldNotBe contains("$") }
    }
}

中间的文档转换 DSL 的过程就交给 LLM 来动态处理和生成(进行中)。有了这个基础,我们会发现它与我们先前开源的基于 LLM 的应用,在架构上并没有太多的区别。只是利用的能力有所差异,而又由于交互还没到我们的核心。所以,我添加了一条:用户意图导向设计

LLM 优先的软件架构设计原则

LLM 对于开发人员、架构师来说,即充满了机遇,又充满了挑战。诸如于:LLM 如何辅助架构设计、如何构建基于 LLM 的架构、如何让 LLM 引导架构设计以及如何构建 LLM 为核心的软件架构。

4f1bf24ce5bfca85ca05d01286b248cd.png

不同的模式之下,对于现有的流程和软件都会带来不少的冲击。基于 Thoughtworks 内部的一系列探索、基于 LLM 的软件架构和总结,我重新思考了四个原则:

  • 用户意图导向设计。

  • 上下文感知

  • 原子能力映射。

  • 语言 API。

详细展开如下。

1. 用户意图导向设计

如我们所熟悉的一样,现有的应用都以 Chat 方式作为 LLM 的入口之一,而 Chat 的本意是去理解用户的意图,诸如于:“帮我写一篇文章介绍设计原则”。这里的意图就很直接,而为了让用户更好地去表达自己的意图,就需要有意地去引导用户的输入。

在这里,就会呈现不同的引导方式或者封装方式,诸如于封装菜单为指令、封装指令为 prompt、基于用户输入解析成 UI 等等。

为了更好地理解用户意图,我们需要考虑:设计全新的人机交互体验。

8a3b8a51219791cf342160728537acfd.png

总结:通过设计全新的人机交互体验,构建领域特定的 AI 角色,以更好地理解用户的意图。例如,在聊天应用程序中,AI 可以使用自然语言处理来理解用户的意图,从而更好地回答用户的问题。除此之外,还可以探索其他交互方式,如语音识别、手势识别等,以提高用户体验。

2. 上下文感知

在先前的文章里,我们一直在强调上下文工程的重要性。我们原先对其的定义是:上下文工程是一种让 LLM 更好地解决特定问题的方法。它的核心思想是,通过给 LLM 提供一些有关问题的背景信息,比如指令、示例等,来激发它生成我们需要的答案或内容。

而在包含了业务场景的情况下,我们要考虑的是围绕于上下文工程的软件架构。诸如于在 ArchGuard Co-mate 里,我们的思路是:通过分层方法来构建动态的上下文。其原因也主要是:我们对于某个用户意图的理解会存在不同的架构层次里,如业务架构、技术架构、代码等。

235839caf7a2e445727e443fa3c33598.png

总结:通过构建适合于获取业务上下文的应用架构,以生成更精准的 prompt,并探索高响应速度的工程化方式。即围绕高质量上下文的 Prompt 工程。例如,在一个电商应用程序中,AI 可以了解用户的购物历史记录、浏览历史记录等上下文信息,以提供更好的购物建议。

3. 原子能力映射

起初,大部分结合 OpenAI 的应用,都是让 LLM 直接生成 JSON、Yaml 的形式。但是呢,在我们尝试了 3000 条左右的 PlantUML 生成之后,发现有 20% 的概率生成的 UML 是错误的,不可编译的。正是这种场景,让我们思考了 LLM 是否适合去做这样的事情。

而在架构治理治理之下,我们将其定义为:借助 LLM 原子能力显性化架构知识,映射和构建治理函数,动态度量不同场景。

在日常的业务场景里,对于 LLM 的能力分析也是非常重要的一环,诸如于我们不应该让 LLM 进行数学计算,而是通过诸如 Functions Calling 的方式,将意图与系统的功能相结合。

所以,我们分解了 LLM 的能力,按照不同的方式与系统结合在一起。

fc65eb64b0e7c86210f6cd3969bca97c.png

总结:我们需要分析 LLM 所擅长的原子能力,将其与应用所欠缺的能力进行结合,进行能力映射。让每个 AI 做自己擅长的事,诸如于利用好 AI 的推理能力。例如,在一个智能家居应用程序中,AI 可以根据用户的行为自动调整室内温度、光线等,以提供更好的家居体验。

4. 语言 API

在我与诸多架构师讨论之后,我们几乎达到了一个一致意见:我们需要一种新的 API,一种适合于 LLM 的 API。

它或许是一类基于语言的 API。对于人与机器、机器与机器来说,是我们熟悉的诸如于 JSON、YAML 或者其它自定义的 DSL;对于人与机器来说,这个语言 API 是自然语言,又或者是图形等方式。

当我们可视化了自己的软件架构之后,你会发现这一点特别的明显。

7c5fee1348418537db7e23fe36930aff.png

总结:我们需要探索和寻找合适的新一代 API ,以便于 LLM 对服务能力的理解、调度与编排。诸如自然语言作为人机 API,DSL 作为 AI 与机器间的 API 等。例如,在一个在线客服应用程序中,AI 可以使用自然语言处理来理解客户的问题,并根据问题的类型和紧急程度自动分配给不同的客服代表。

总结

来自不成熟的 Notion AI 的总结:

本文介绍了基于 LLM 的软件架构设计原则,包括用户意图导向设计、上下文感知、原子能力映射和语言 API。通过设计全新的人机交互体验、构建适合于获取业务上下文的应用架构、分析 LLM 所擅长的原子能力和探索和寻找合适的新一代 API,可以更好地利用 LLM 辅助架构设计、构建基于 LLM 的架构、让 LLM 引导架构设计以及构建 LLM 为核心的软件架构。

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

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

相关文章

【软考程序员学习笔记】——多媒体基础知识

目录 🍊 一、多媒体的概念及分类 多媒体的分类 🍊二、声音信号的数字化过程 采样 量化 编码 🍊三、常见音频文件格式 🍊四、图形/图像区别 图形 图像 🍊五、常见图像文件格式 🍊六、常见视频文件…

JDK8-2-流(3)- 流操作-distinct

JDK8-2-流&#xff08;3&#xff09;- 流操作-distinct 去重操作&#xff0c;如下开头两个菜品一样&#xff0c;对 menu 去重如下&#xff1a; public class DishDistinctTest1 {public static final List<Dish> menu Arrays.asList(new Dish("pork", false…

享元模式(十四)

每天都是全新的一天&#xff0c;感谢今日努力的自己。 上一章简单介绍了外观模式(十三), 如果没有看过, 请观看上一章 一. 享元模式 引用 菜鸟教程里面的外观模式介绍: https://www.runoob.com/design-pattern/flyweight-pattern.html 享元模式&#xff08;Flyweight Patter…

后,配置文件被清空,导致无法开启WiFi

root cause&#xff1a; /data/vendor/wifi/wpa/wpa_supplicant.conf 是0字节&#xff0c;导致wpa_supplicant_init_iface缺少”p2p_disabled1“的配置就会在走错flow到p2p wpa_supplicant_init_iface 》wpas_p2p_init 从而在HidlManager::registerInterface 进入 if (isP2pIf…

DeepSpeed零冗余优化器Zero Redundancy Optimizer

零冗余优化器 内容 零概述培训环境启用零优化 训练 1.5B 参数 GPT-2 模型训练 10B 参数 GPT-2 模型使用 ZeRO-Infinity 训练万亿级模型 使用 ZeRO-Infinity 卸载到 CPU 和 NVMe分配 Massive Megatron-LM 模型以内存为中心的平铺注册外部参数提取权重 如果您还没有这样做&…

【LeetCode】HOT 100(12)

题单介绍&#xff1a; 精选 100 道力扣&#xff08;LeetCode&#xff09;上最热门的题目&#xff0c;适合初识算法与数据结构的新手和想要在短时间内高效提升的人&#xff0c;熟练掌握这 100 道题&#xff0c;你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

佩戴比较舒适的蓝牙耳机有哪些?值得入手的蓝牙耳机分享

​对于年轻人来说&#xff0c;耳机使用场景丰富&#xff0c;时尚追求度高&#xff0c;喜好的音乐类型也是多种多样&#xff0c;需求侧重也不尽相同。下面我来推荐几款相当不错的蓝牙耳机给大家&#xff0c;总会有喜欢那款&#xff01; 一、南卡OE蓝牙耳机 佩戴舒适度打分&…

【QQ界面展示-设置消息正文的背景图 Objective-C语言】

一、咱们上午说到哪儿了,还记得吗, 1.咱们上午是不是说到这儿了,可以显示正文、可以显示文字、并且,设置好背景图片了, 现在的问题就是,正文里面的文字,是不是超出这个图片了, 正文里面的文字,超出背景图片了, 那么,接下来,就给大家看一下,怎么解决这个问题, …

Macbook Pro双系统装Window10后设置触摸屏滑动方向

最近想给自己的Macbook Pro装Windows10操作系统&#xff0c;毕竟Windows才是真正的生产力工具&#xff0c;装了以后不需要两台笔记本了&#xff0c;直接在一台笔记本上有MacOS和Windows 装好以后发现触摸屏不能轻点触控还有触摸屏的滑动方向是反的 第一个问题&#xff0c;不能轻…

Ansys Zemax | 如何在序列模式下模拟分光棱镜

概述 这篇文章介绍了&#xff1a; 如何在序列模式下使用多重结构创建分光棱镜 如何在布局图以及分析/计算窗口中同时追迹透射和反射光线 在考虑偏振及镀膜的影响下如何计算透射和反射光线的总能量 &#xff08;联系我们获取文章附件&#xff09; 介绍 在 OpticStudio 中…

xxlJob任务管理平台500:xxl-job remoting error(connect timed out)

目录 一、问题截图 二、问题处理 2.1.查看执行器地址 2.2.查看本地端口 2.3.总结 三、关于地址的题外话 一、问题截图 此时可以看到code500&#xff0c;msg是连接超时&#xff0c;说明地址不通&#xff0c;那就是查看地址配置。 二、问题处理 2.1.查看执行器地址 …

使用CloudOS帮助企业落地云原生PaaS平台

PaaS究竟是什么&#xff1f; IaaS、SaaS的定义很清楚&#xff0c;而PaaS的定义就比较宽泛。所以&#xff0c;很多人把PaaS当做一个万能的“框”&#xff0c;什么都往里装&#xff0c;特别像一排垃圾桶中的那个“其他垃圾”桶&#xff0c;当你拎了一袋垃圾&#xff0c;不知道往…

C++技能 ( 3 ) - 详解泛型模版和特化模版的使用【函数模版、类模版、模版全特化、模版局部特化、可变参数模版、模版模版参数】

系列文章目录 C技能系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01;有更多博文系列等着看哦&#xff0c;会经常更新&#xff01;&#xff01;&#xff01; 因为你的关注激励着我的创作&#xff01…

网安云新品速递 | 移动应用安全检测服务,为App合规与安全保驾护航

移动应用安全攻击层出不穷 近年来&#xff0c;移动应用安全攻击事件频发&#xff0c;衍生出的用户数据安全问题&#xff0c;也逐渐成为用户、社会&#xff0c;乃至整个国家高度重视的问题。立法层面上&#xff0c;数据安全保护不断加强&#xff1b;监管层面上&#xff0c;相关…

当亲戚知道我是程序员后,对我一顿梭哈……

当亲戚知道我是程序员后&#xff1a; 有的让我修电脑&#xff1b; 有的让我PS&#xff1b; 有的让我扯网线&#xff1b; 有的让我搞路由器&#xff1b; 这次的亲戚&#xff0c;让我干起了老本行&#xff1a;软件开发。 他是做人力资源公司的&#xff0c;要让我开发个招聘…

Spark SQL数据源 - 基本操作

文章目录 一、案例演示读取Parquet文件二、在Spark Shell中演示课堂练习1、将4.1节的student.txt文件转换成student.parquet课堂练习2、读取student.parquet文件得到学生数据帧&#xff0c;并显示数据帧内容三、在IntelliJ IDEA里演示 一、案例演示读取Parquet文件 执行命令&a…

#提升开源项目质量与效率:使用 GitHub Actions 自动化流程

提升开源项目质量与效率&#xff1a;使用 GitHub Actions 自动化流程 简介&#xff1a; 在开源项目中&#xff0c;质量和效率是至关重要的因素。本文将介绍如何利用 GitHub Actions&#xff0c;结合 ChatGPT Code Review、Autofix、Codecov 和 Publish PyPI 四个强大的 Actio…

unbound配置cache服务器

unbound 安装unbound配置unbound生成DOT证书配置日志监听哪个IP允许哪些客户端查询配置转发DNSSEC开启domain-insecure生成密钥 检查配置查看缓存启动Unbound服务&#xff1a; 结果验证方法1&#xff1a;方法2: 排错方法 安装unbound 以下是将DNS over TLS&#xff08;DoT&…

一文吃透Spring集成MyBatis

个人主页&#xff1a; 几分醉意的CSDN博客_传送门 文章目录 &#x1f496;集成思路✨怎么使用MyBatis✨集成的步骤✨pom加入依赖✨创建MyBatis使用代码✨创建Service类✨创建Spring配置文件和测试集成MyBatis✨使用外部属性配置文件 &#x1f496;图书推荐 Java28岁了&#xff…

CRC校验(2):CRC32查表法详解、代码实现和CRC反转

对于现在的CPU来说&#xff0c;基本上都在硬件上实现了CRC校验。但我们还是想用软件来实现一下CRC的代码&#xff0c;这样可以更深入地理解里面的原理。所以这一节就来详细地解释如何使用查表法从软件上来实现CRC-32的校验。另外&#xff0c;CRC还有一种反转的情况&#xff0c;…