LLM 应用参考架构:ArchGuard Co-mate 实践示例

news/2024/11/23 21:21:05/

随着,对于 LLM 应用于架构领域探索的进一步深入,以及 ArchGuard Co-mate 开发进入深入区,我们发现越来越多的通用模式。

在先前的文章里,我们总结了一系列的设计原则,在这篇文章里,我们将介绍 ArchGuard Co-mate 与参考架构的实践。

开始之前,可以先看看 ArchGuard Co-mate 的演示视频:

LLM 应用参考架构

结合我们在一些 LLM PoC 项目的经验,以及网上的公开资料,我重新汇制了一个 LLM 应用的参考架构图:

796014982713605304771e72ba4a36d9.png

LLM 参考架构

由 ChatGPT 解释如下:

  • UI 层:用户界面层,提供给用户与语言模型交互的界面,可以是网页、移动应用、命令行界面等。

  • 会话处理层:处理用户与语言模型之间的交互会话,包括对用户输入的解析、对话管理、上下文维护等功能。

  • 数据审计层:负责对用户数据进行审计和保护,防止数据泄露、滥用或被攻击。这个层次也可以包括对模型的安全性和可信度进行评估。

  • 操作编排层:这个层级可以管理和协调多个语言模型、工具、智能体的运行,比如多个模型之间的调用、结果的融合等。它可以作为一个简单的流程引擎,将多个模型组合成复杂的工作流程。

  • LLM 增强层:这个层级可以对语言模型进行额外的优化和增强,比如加速推理速度、提供相关上下文、提高模型的准确性、支持特定的任务等。这个层级也可以包括对模型解释性和可解释性的增强。

  • LLM 层:最底层是语言模型本身,它是整个架构的核心。它可以是一个基于深度学习的模型,比如 LSTM、Transformer 等,也可以是一个基于传统 NLP 技术的模型。在这个层级,模型会接收输入并输出相应的文本结果。

在 ArchGuard Co-mate 中,每一个层对应了不同的设计理念/设计原则,如:

  • UI:用户意图导向设计

  • 会话处理层:语言接口

  • 操作编排层:语言接口 + 上下文工程

  • LLM 增强层:语言接口

  • LLM 层:原子能力映射

  • 数据审计层:(由于 ArchGuard 的场景限制,我们并没有设计这一层。

围绕于不同层级需要考虑不同的技术实践。

LLM 应用参考架构示例:ArchGuard Co-mate

ArchGuard Co-mate 是一个 LLM + 架构设计与治理的探索性项目,旨在探索 LLM 作为架构师助手的可能性,并围绕 LLM 来探索架构的未来,诸如于本地语义分析、动态上下文收集 API、架构规范检查等。

详细代码见:https://github.com/archguard/co-mate

UI 层:用户意图导向设计

由于 Co-mate 并不是一个通用能力的系统,所以我们希望限制用户使用 ChatGPT 的能力。除此,在 UI 层上,我们尝试去引导客户来了解系统的能力。

诸如于,为了构建目标系统的上下文,我们需要先 clone 代码、进行基本的代码分析,所以我们需要引导用户:

d5dd0d503c48131d56519632d21e3e0b.png

Co-mate 引导用户

随后,根据用户的输入分析,以分析适合的系统功能是什么,返回给用户来确认。我们将其称为:请求-生成 UI-确认模式

ec640f85db81408c3c32e41dbb0257af.png

Comate Action

而为了提供及时的返回给用户,我们设计的 DSL 改为流式 DSL,即可以实时解析这个 DSL,并及时响应给用户,以显性的告诉用户:系统正在处理您的请求。

会话处理层:本地小模型

在 Co-mate 中,我们在本地引入了 SentenceTransformer 来处理用户的输入,优先在本地分析、匹配用户的输入,并处理。当匹配到结果后直接调用本地的函数,当匹配不到结果时调用远端的处理函数来处理。

在原理上主要是参考了 GitHub Copilot、 Bloop 的实现,通过本地的小模型来处理用户的输入,然后再通过远端的大模型来处理用户的输入。

在这里,需要用到两个核心组件:

  • Onnx Runtime,是一个跨平台推理和训练机器学习加速器。

  • HuggingFace Tokenizers,提供当今最常用的分词器的实现,重点关注性能和多功能性。

从某种程度上来说,它们也算是 LLM 增强层的一部分,只是我尝试用来在处理会话请求,以直接调用系统的功能,并返回给用户。诸如于:

mapOf(ComateCommand.Intro to basicIntroCommand.map { semantic.embed(it) },ComateCommand.LayeredStyle to archStyleCommand.map { semantic.embed(it) },ComateCommand.ApiGovernance to apiGovernanceCommand.map { semantic.embed(it) },ComateCommand.ApiGen to apiGenCommand.map { semantic.embed(it) },ComateCommand.FoundationGovernance to foundationGovernanceCommand.map { semantic.embed(it) },
)

针对所有潜在的、相似的命令在本地进行一次简单的检索。

数据审计层:(暂时没有)

由于懒,以及其它原因,我们暂时没有添加这个功能。

操作编排层:函数即操作

而为了将上述的用户指令转换为对应的系统指令,我们需要结合系统提供的函数功能,交由 LLM 来分析潜在的调用函数是哪一个。

于是,我们参考了 LangChain 的实现,构建了一个轻量级的 API,用来分析用户的输入。当用户输入上述的 Introduce the system … 指令时,我们将通过反射生成函数信息、并生成如下的 prompt,交由 LLM 分析:

Answer the following questions as best you can. You have access to the following tools:
introduce_system: introduce_system is a function to introduce a system.
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [introduce_system]
Action Input: the input to the action (parse from the user input, don't add other additional information)
// end in here. the tool will handle the rest
Begin!
Question: Introduce the following system: https://github.com/archguard/ddd-monolithic-code-sample

是的,这就是一个手动版的 LangChain 实现。而每一个 “函数” 在实现上其实是一个类 —— 为了能通过反射来创建出这个函数,并实现对应的接口调用。然后,将类名转换为 snake_case 方式,如下代码所示:

val defaultConstructor = clazz.declaredConstructors[0]
val dyFunction = defaultConstructor.newInstance(context) as DyFunction
clazz.name.toSnakeCase() to dyFunction

随后,返回对应的函数和输入信息给用户,由用户决定是否调用这个函数。

另外一方面,在 ArchGuard Co-mate 里,我们通过 DSL 来编排功能,而这个 DSL 是由 Kotlin 编写的,并且可以由 ChatGPT 生成的。所以,我们构建了一个基于 DSL 的编排运行时:

// 初始化运行时
val repl = KotlinInterpreter()
val mvcDslSpec = repl.evalCast<FoundationSpec>(InterpreterRequest(code = mvcFoundation))
// 从选择的输入中获取 action
val action = ComateToolingAction.from(action.lowercase())
// 添加默认的 DSL 规范,如 MVC 分层规范
if (action == ComateToolingAction.FOUNDATION_SPEC_GOVERNANCE) {comateContext.spec = mvcDslSpec
}

当用户没有提供一个架构规范相关的函数时,我们将会生成一个 foundation spec,诸如于默认的 MVC 分层架构的规范。随后,从系统中构建更多的上下文,再交由 LLM 去分析。

LLM 增强层:借助 LLM 构建精准、简洁的上下文

从意图上来说,LLM 增强层所做的是,根据用户的输入匹配相关的信息,以构建完整的上下文。对于知识型系统来说,通常会借助矢量数据库来实现。而在一些上下文确定的系统来说,也可以借助本地小模型在本地进行计算。

诸如于 GitHub Copilot 会在本地,根据打开的 tab,来计算相关的代码文件,而不需要提前的 index。毕竟,全局的代码 index 会出现一个问题,与当前用户关注的文件上下文出现不匹配性。所以,用户打开的 tab,就是用户潜在的上下文,以些进行分析结果会比较准确。

另外一个场景是 Bloop 会提前对代码的信息(如类名、函数名)进行 index,以在用户输入问题时,寻找与问题匹配的代码,再交由 LLM 进行分析。

而在 Co-mate 中,我们是在本地预存一些潜在的用户输入指令,以降低对服务端的请求。

在另外一个层面上,我们还可以借助 LLM 来进行对应的上下文简化,特别是当我们的上下文超长时,就可以以类似的方式来进行精简。诸如于,在 Co-mate 中我们会借助 GPT 来拆解用户的文档,变为 DSL 的方式。

LLM 层:流式代理接口

在 LLM 层,除了关注于历史数据之外,我们还需要关注于响应反处理,并提供诸如于流式接口的代理等等。

小结

最后由 Notion AI 帮我们做一个小结:

本文介绍了一个 LLM 应用参考架构:ArchGuard Co-mate 实践示例。架构包括 UI 层、会话处理层、操作编排层、LLM 增强层和 LLM 层。文章详细介绍了每个层级的设计理念和技术实践,并提供了示例代码。其中,会话处理层使用本地小模型处理用户输入,操作编排层使用反射生成函数信息,LLM 增强层借助 LLM 构建精准、简洁的上下文,LLM 层提供流式代理接口等等。


http://www.ppmy.cn/news/684124.html

相关文章

基于沙猫群优化算法的函数寻优算法

文章目录 一、理论基础1、沙猫群优化算法&#xff08;1&#xff09;初始化种群&#xff08;2&#xff09;搜索猎物(探索)&#xff08;3&#xff09;攻击猎物(开发)&#xff08;4&#xff09;探索和开发 2、SCSO算法伪代码 二、仿真实验与结果分析三、参考文献 一、理论基础 1、…

猫和老鼠:博弈论——记忆化搜索

leetcode: cat and mouse 状态表示 考虑状态state[step][mouse][cat]{0, 1, 2}&#xff0c;表示第step步后&#xff0c;老鼠在mouse位置&#xff0c;猫在cat位置&#xff0c;此时猫和老鼠在最佳状态下的游戏结局。 初始化 根据游戏规则&#xff0c;我们可以直接推理出 老鼠…

开源全文搜索引擎MeiliSearch

单独安装 MeiliSearch 似乎并没有什么实际的用途&#xff0c;本文只是记录了老苏一次失败的探索。想法应该是没问题的&#xff0c;奈何实力不够啊。 前言 老苏博客上的搜索变得越来越慢&#xff0c;慢的原因应该主要是 2 个&#xff1a;一个是 search.json 的加载速度&#xf…

用 OpenCV 检测猫脸

Python中的OpenCV猫脸检测代码 使用 OpenCV 的预训练级联分类器可以轻松检测照片或视频中的猫脸。完成所有工作的代码&#xff1a; import cv2cascade cv2.CascadeClassifier(haarcascade_frontalcatface.xml) cap cv2.VideoCapture(0) while True: ret, img cap.read() img…

矿难猫盘救砖刷回OneSpace系统的记录

背景 去年年末看着矿难来了&#xff0c;买了个2.5寸的小猫盘&#xff0c;想着在B站录点小视频的&#xff0c;后来录完开箱&#xff0c;想再录个刷机视频的&#xff0c;第一次刷成功了&#xff0c;但是没录像&#xff0c;第二次录像了&#xff0c;但是没刷成功&#xff0c;一气…

坏坏猫搜索怎么显示服务器异常,坏坏猫APP怎么了?搜索为什么不能用了? - 爱游戏...

坏坏猫APP是一款非常实用的小说阅读器&#xff0c;这款软件最大的优势就是小说多且免费&#xff0c;现在这样的软件不多了。坏坏猫里面有非常多的小说&#xff0c;几乎全网资源都能够搜到&#xff0c;所以要是你想看小说&#xff0c;使用这款软件非常合适。现在已经有非常多的用…

Navicat-导航猫

开发公司 Premiumsoft&#xff08;优质的软件&#xff0c;卓软&#xff09; 关于 PremiumSoft PremiumSoft 成立于 1999 年&#xff0c;开发了适用于 Windows、macOS、Linux 和 iOS 的各种应用程序。 Navicat 是全球超过 500 万数据库用户的选择。来自 7 大洲和 138 个国家/地…

mysql数据库精确匹配搜索_mysql 模糊搜索方法

很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录。在后台,这些程序使用在一个SELECT 查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候。…