算法模型嵌入式 Mendix应用的开发示例

news2024/11/18 20:31:38

一、前言

根据埃森哲最新一项调查,2023年67%的企业持续加大在技术方面的投入,其中数据和AI应用是重中之重。AI在企业内部应用这个话题已经保持了十多年的热度,随着ChatGPT为代表的生成式AI技术的出现,这一话题迎来又一波的高潮。

1.png

生成式AI展示出来的能量固然让人惊叹,企业也应该密切跟进,找到AI创造业务价值的新的结合点。与此同时,站在一个AI新时代(目前看起来是如此)的转折点,企业也有必要回顾一下,过去十多年在AI 应用方面的举措是否达到预期,投入产出是否还有提升空间。

二、问题提出

笔者最近亲历两个客户都在应用AI,在使用方式上却有不同。

客户1: 某外国银行客户,正在推进数字化银行的5年战略计划,拥有230+人的IT团队,另外有15人的数据科学团队隶属于运营部门。与IT团队沟通低代码同时,我们询问这15人的数据科学团队的具体工作,得知其主要是对银行C端B端客户的交易数据进行历史分析,建立机器学习模型并对将来业务进行预测,向运营VP和其它高管提供数据报表,有定期的也有临时的。而这个岗位的平均薪资是IT开发人员的2倍。

客户2: 某国内高科技客户,从事高分子材料的研究和产品开发。其研发团队(非IT)员工基本都有数据分析背景,使用Python进行数据处理是其日常工作,核心研究也涉及机器学习算法的训练。IT部门在向研发部门提供数字化服务时,有大量需要融合算法模型的应用开发需求,目前的做法是应用与Python算法服务独立运行,应用调用Python接口。

对比来看,客户1 的AI投入显著,但产出并未与业务流程强耦合,而是以离线报表的形式供决策者主观参考。这一现象可以称之为“未打通AI应用的最后一公里”,这种模式下ROI往往受限。客户2 业务类型决定了必然有懂算法和数据分析的研发人员,而非额外投入,但难点在于IT部门如何承接研发部门的产出。应用与算法服务独立部署、接口调用固然技术可行,但从应用开发、运维、同步扩展、迁移等角度,会存在效率低下的问题。

三、Mendix的答案

Mendix对于AI在企业应用构建中发挥作用的设想是完全嵌入式的,即在应用全生命周期都应该融入AI的能力。

2.png

  • 应用开发阶段:Mendix IDE自带AI机器人,一方面可以实现基于微流上下文件推荐逻辑组件,另一方面可以扫描整个工程根据Mendix开发最佳实践推荐工程改进建议。预计年底推出的生成式AI能力,Mendix Chat 将最终实现与开发者基于自然语言交流,实现实体和微流的自动生成。

3.png

  • 应用运行阶段:Mendix ML Kit 可以解析ONNX格式的机器学习算法模型,并通过Call ML Kit组件将算法模型按需内嵌到业务流程(微流)中。另外,Mendix 运行时环境中融入了ONNX模型运行时,确保在一套部署环境之下可以同时执行应用程序和算法模型。

4.png

四、示例应用

这里我们打算构建一个销售量预测的场景应用。这个应用核心是算法模型和数据,其次是应用体验。

算法模型和数据

Mendix本身不提供算法,而是在企业自有算法模型之上集成并运行算法。因此,本示例中我们借用Kaggle社区的一个竞赛方案,链接地址https://www.kaggle.com/code/konradb/ts-4-sales-and-demand-forecasting/notebook

历史数据是由沃尔玛提供的3家门店过去5年期间某些商品的销售记录。

5.png

算法目标是基于历史销售记录建立预测模型,对给定时刻起28天特定SKU的销量。

引用的竞赛方案选用的是LGBM模型的回归预测。该算法在150轮训练后RMSE趋于稳定。

6.png

下载竞赛方案 Pynote,通过阅读代码了解算法选取逻辑和数据处理逻辑。该方案中对于过去5年间的销售记录作了如下的特征提取:

  • 对商品、门店、商品类别进行类别化(categorization)处理,即转化为整形数值

  • 对销售数量进行时间序列的特征处理,选取了28天前销售、28天前时刻的最近一周平均销量、28天前时刻的最近四周平均销量

  • 对销售日期分解为月份、季度、月度日期等3个整形数值

7.png

注意:以上的特征提取过程,也是后面在Mendix中构建应用时对业务数据预处理的过程。处理过的业务数据才能作为算法模型输入,获得预测输出。这个示例中,为了简化直接借助原始Python代码对预测数据集进行了特征提取。

模型转化

Mendix ML Kit接受ONNX格式的算法模型,这是一种主流的模型中间格式。Pytorch、TensorFlow、ScikitLearn、Caffee等框架下的模型都有转化ONNX格式的标准工具。更多关于ONNX格式和转换可参考知乎文章。

在原方案中训练好算法模型之后,加上以下Python代码将模型转化并保存为ONNX格式。

8.png

常见的ONNX转化工具包括以下Python 包:

  • onnxmltools

  • convert_sklearn

  • torch.onnx

  • tf2onnx

实际工程中根据算法模型的训练框架选取合适的工具即可。

模型可视化

对于ONNX格式的模型,我们可以借助可视化工具直观理解模型的输入、输出和中间算子(operator)。

这里我们用https://netron.app在线网站查看前面保存下来的ONNX算法模型。

9.png

从图可以清晰看出,该模型输入为长度为10的32位浮点型数组,输出为单个32位浮点型数值,中间算子是一个回归运算算子。输入和输出的-1表示Batch值,在这个算法模型中都为1.

注意:这里的算子是经转换后ONNX对应的实现算子,和原始算法有可能不一一对应,这部分内容不在Mendix主体范围,有兴趣可以阅读相关资料详细了解。

模型导入

ONNX格式算法模型有了,并通过可视化对模型有个直观理解之后,我们就可以开始在Mendix环境中的工作。

第一步就是将模型导入Mendix。在add others中找到ML model mapping.

10.png

选择前面保存的ONNX格式文件。

11.png

导入后得到如上图映射关系,并自动生成输入和输出两个实体。

12.png

注意观察:输入实体只有唯一属性,且是字符串类型,这和我们前面观察到的算法模型有长度为10的32位浮点型数组不一致。正因为如此,我们需要在Mendix中调用模型时,对数据进行预处理,将含有10个浮点型(Mendix中用Decimal)的特征字段转化为字符串类型。输出实体有一个Decimal类型属性,可以直接作为销量预测结果在应用中使用,无需额外处理。

模型调用并数据预处理

创建一个子微流,它可以在其它需要的地方被调用,实现模型调用的基础功能。

13.png

从IDE右侧的工具箱是选取 Call ML Model组件,配置已导入的模型名称、输入输出实体对象。

其中,输入实体对象需要通过一个JavaAction对原始业务数据进行预处理,该JavaAction输入为包含10个特征字段的实体对象,输出为模型映射指定的 ML_Input_Entity_LGBModel.

JavaAction的实现逻辑如下所示:

14.png

注意:对于不同业务数据类型如数值、文本、图片、音频、视频,数据预处理逻辑方式不同,但有固定做法。这是机器学习领域工程师应该掌握的技能,在此不详细展开。

至此,调用算法模型进行预测的子微流构建完毕。

应用设计

接下来我们要构建应用的用户交互层,这个示例中我们设计了以下模块:

  • 主数据模块:用于维护门店、商品等主数据。

  • 交易数据查看模块:用于查看历史销售记录、待预测记录等。

  • 数据导入模块:用于数据从Excel数据集到Mendix的导入。

  • 销售预测绘图模块:用于图形化展示门店/商品组合的历史销量和销量预测。

15.png

效果展示

主数据维护

16.png

数据导入

44ac2467-aef0-4e8f-a4a8-1540b7f0c1cf.png

交易数据查看

sales record.png

未来销量预测

sales feature.png

销量预测图表

chart.png

当然,以上只是基础展示效果,在实际业务应用中,可以将销量预测结果融入采购、仓储、物流等计划执行中,在需要的地方调用Sub_Model_Call 子微流即可,实现算法模型嵌入式的业务流程,让最后一公里变得更为简单。

五、总结

Mendix 提供基于ML Kit的机器学习算法模型嵌入组件,支持Pytorch、Tensorflow、Scikitlearn、Caffee等主流训练框架下的算法模型转化为ONNX格式后导入应用,在所需要的业务流程中通过一个Call ML Model组件轻松被调用。这种方式下,算法模型和业务应用在一套运行时环境中,相比传统的算法服务独立运行并通过接口调用的方式,不仅构建更快,而且调用延时更低,还方便统一运维,打通应用最后一公里,实现算法模型对业务的赋能。

本示例提供了端到端的开发实现参考。如果您手头正有融合算法模型的应用开发需求,或者您已经在使用Mendix希望融合算法模型,可以在评论区留下联系方式,我们会与您沟通并提供所需帮助。

关于Mendix公司

在一个数字化先行的世界中,客户希望自己的每一项需求都得到满足,员工希望使用更好的工具来完成工作,而企业意识到自己只有通过全面数字化转型才能生存并取得成功。Mendix公司,a Siemens business正在迅速成为企业数字化转型的推动者。其业内领先的低代码平台和全方位的生态系统整合最先进的技术,帮助企业创造出提高互动性、简化操作和克服IT瓶颈的解决方案。Mendix公司以抽象化、自动化、云和协作为四大支柱,大幅提升开发者的生产力,并且依靠自己的工程协作能力和直观的可视化界面,帮助大量不熟悉技术的“公民”开发者在他们所擅长的领域创建应用程序。Mendix公司是权威行业分析师眼中的领导者和远见者,也是一个云原生、开放、可扩展、敏捷和饱经考验的平台。从人工智能和增强现实,到智能自动化和原生移动,Mendix公司已成为数字化先行企业的骨干。Mendix公司企业低代码平台已被全球4000多家领先的公司采用。

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

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

相关文章

ios 运行ipa包 日志查看方式

方法一: 使用ideviceinstaller工具 # 安装ipa命令 brew install ideviceinstaller ideviceinstaller -i xxx.ipa# 查看运行日志 idevicesyslog# idevicesyslog 查找命令 idevicesyslog | grep test -A 3 -B 2 # 输出关键字所在行后3行,前2行) idevic…

海康威视二次开发适配安卓电视盒子

收到一个需求,需要在安卓电视盒子上适配海康威视摄像头视频: 1.类似电视家app界面,左边滑动菜单显示通道列表、设置按钮,遥控器呼出菜单。 2.遥控器操作:切换视频通道、云台上下左右控制、缩放等。 3.服务器域名、用…

计算机网络的故事——简单的HTTP协议

简单的HTTP协议 文章目录 简单的HTTP协议一、简单的HTTP协议 一、简单的HTTP协议 HTTP是不保存状态的协议,为了实现保存状态功能于是引入了Cookie技术。 method: get:获取资源 post:传输实体主体 put:传输文件 head:获取报文首部,用于确认URI的有效性以…

vue前端解决跨域

1,首先 axios请求,看后端接口路径,http://122.226.146.110:25002/api/xx/ResxxList,所以baseURL地址改成 ‘/api’ let setAxios originAxios.create({baseURL: /api, //这里要改掉timeout: 20000 // request timeout}); export default s…

C++day7模板、异常、auto关键字、lambda表达式、数据类型转换、STL、list、文件操作

作业 封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象(至少3个) 再把该容器中的对象,保存到文件中。 再把这些学生从文件中读取出来,放入另一个容器中并且遍历输出该容器里的学生。 #include …

【人月神话】深入了解软件工程和项目管理

文章目录 👨‍⚖️《人月神话》的主要观点👨‍🏫《人月神话》的主要内容👨‍💻作者介绍 🌸🌸🌸🌷🌷🌷💐💐💐&a…

pytest笔记2: fixture

1. fixture 通常是对测试方法和测试函数,测试类整个测试文件进行初始化或是还原测试环境 # 功能函数 def multiply(a, b):return a * b # ------------ fixture---------------def setup_module(module):print("setup_module 在当前文件中所有测试用例之前&q…

Redis的数据类型到底有什么奥秘

这里我们先只介绍五种常用的数据类型~ 目录 1、string 2、hash 3、list 4、set 5、zset 6、示例 1、string 数据类型:string内部编码:raw、int、embstr 说明: raw是最基本的字符串--底层是一个char数组(此处的char是一个字…

UNIX网络编程卷一 学习笔记 第三十章 客户/服务器程序设计范式

开发一个Unix服务器程序时,我们本书做过的进程控制: 1.迭代服务器(iterative server),它的适用情形极为有限,因为这样的服务器在完成对当前客户的服务前无法处理已等待服务的新客户。 2.并发服务器&#x…

肖sir__设计测试用例方法之边界值03_(黑盒测试)

设计测试用例方法之边界值 边界点定义 上点:边界上的点 离点:离上点最近的点(即上点左右两边最邻近的点) 内点:在域范围内的点 案例:qq号:5-12位 闭区间: 离点:5 位 &…

go语言基本操作---三

变量的内存和变量的地址 指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go语言对指针的支持介于java语言和C/C语言之间,它即没有想Java语言那样取消了代码对指针的直接操作的能力,也避免了C/C语言中由…

[Rust GUI]0.10.0版本iced代码示例 - progress_bar

-1 字体支持 iced0.10.0 仅支持指定系统内置字体(用iced的默认字体是乱码) iced0.10.0 手动加载字体的功能已经砍了,想手动加载就用0.9.0版本,文档0.9.0版本 想显示中文则需要运行在一个自带字体的Windows系统上。而且这个字体最好不要钱。 (Windows闲着…

《计算机算法设计与分析》第一章:算法概述

第一章 算法概述 1.1 算法复杂性分析 公共标准:渐进时间复杂度 (1)大O表示法: 例如: 大O表示法和前面的最坏时间复杂度的区别在于:大O表示法表示的更为简洁, 而最坏时间复杂度相对就比较繁琐&am…

【Android Framework系列】第14章 Fragment核心原理(AndroidX版本)

1 简介 Fragment是一个历史悠久的组件,从API 11引入至今,已经成为Android开发中最常用的组件之一。 Fragment表示应用界面中可重复使用的一部分。Fragment定义和管理自己的布局,具有自己的生命周期,并且可以处理自己的输入事件。…

processflow流程图多人协作预热

前言 在线上办公如火如荼的今天,多人协作功能是每个应用绕不开的门槛。processflow在线流程图(前身基于drawio二次开发)沉寂两年之久,经过长时间设计开发,调整,最终完成了多人协作的核心模块设计。废话不多…

SeaTunnel扩展Transform插件,自定义转换插件

代码结构 在seatunnel-transforms-v2中新建数据包名,新建XXXTransform,XXXTransformConfig,XXXTransformFactory三个类 自定义转换插件功能说明 这是个适配KafkaSource的转换插件,接收到的原文格式为: {"path&…

使用Akka的Actor模拟Spark的Master和Worker工作机制

使用Akka的Actor模拟Spark的Master和Worker工作机制 Spark的Master和Worker协调工作原理 在 Apache Spark 中,Master 和 Worker 之间通过心跳机制进行通信和保持活动状态。下面是 Master 和 Worker 之间心跳机制的工作流程: Worker 启动后&#xff0c…

【Unity】VS Code 没有自动补全 MonoBehaviour 的方法

正常来说,在VS Code 输入类似 OnTriggerEnter2D等方法名时,VS Code会根据已经输入的前缀自动提示相关方法。 在不正常的情况下,根据StackOverFlow上面的回答,依次试过了 安装 .NET SDK安装 .NET Framework Dev PackVS Code安装 …

【ES6】js中的__proto__和prototype

在JavaScript中,__proto__和prototype都是用于实现对象继承的关键概念。 1、proto __proto__是一个非标准的属性,用于设置或获取一个对象的原型。这个属性提供了直接访问对象内部原型对象的途径。对于浏览器中的宿主对象和大多数对象来说,可…

【STM32】学习笔记-PWR(Power Control)电源控制

PWR(Power Control)电源控制 PWR(Power Control)电源控制是一种技术或设备,用于控制电源的开关和输出。它通常用于电源管理和节能,可以通过控制电源的工作状态来延长电子设备的使用寿命,减少能…