当前位置: 首页 > news >正文

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

一、前言

根据埃森哲最新一项调查,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多家领先的公司采用。

相关文章:

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

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

如何使用Cygwin编译最新版的Redis源码,生成适用于Windows的Redis

文章目录 一、准备Cygwin环境二、下载Redis源码三、编译redis-7.2.01. 执行make命令2. 重新执行make命令3. 再次执行make命令4. 将编译后的可执行文件及依赖放到同一个文件夹5. 测试编译生成的可执行程序 四、换其他redis版本重新编译1. 编译redis-7.0.122. 编译redis-6.2.133.…...

Linux 修改SSH端口

如果防火墙,或防火墙已经开启,需要先开放2222端口 firewall-cmd --add-port2222/tcp --permanent --zonepublic firewall-cmd --reload编辑文件 vim /etc/ssh/sshd_config: #Port 22 Port 2222 # 打开注释,并修改为以下值 Clien…...

Redis经典问题:缓存穿透

(笔记总结自《黑马点评》项目) 一、产生原因 用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力。 常见的解决方式有缓存空对象和布隆过滤器。 二、缓存空对象 思路:当我们客户…...

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION (论文解析)

DEFORMABLE DETR: DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION 摘要1 介绍2 相关工作3 重新审视 Transformers 和 DETR4 方法4.1 用于端到端目标检测的可变形transformer4.2 Deformable Detr的其他改进和变型5 实验5.1 和DETR 比较5.2 消融实验5.3 与最先进方法的…...

网络连接评分机制之NetworkFactory

在开机时,各个提供网络连接的对象需要向ConnectivityService注册自己,并把自己所提供的网络的分值告诉ConnectivityService。 为了ConnectivityService便于统一管理,每一个具备提供网络服务的对象都需要创建一个NetworkFactory的子类对象,并利用该对象注册自己,以及提供自…...

极致精细的jmeter+ant+jenkins 搭建接口自动化测试

一、jmeter 相信大家对jmeter并不陌生哈,如果没有安装和配置环境的小伙伴,可以直接找到我哈,我发给你。 二、ant 安装ant 第一步:下载ant http://ant.apache.org/ 第二步:配置ant window中设置ant环境变量&…...

Unity物体查找方式

参考资料 cUnity中使用GameObject.Find、Transform.Find查找GameObject_思月行云的博客-CSDN博客 GameObject.Find 通过名字或路径查找游戏对象。 GameObject.Find("GameObject"); GameObject.Find("GameObject/ChildGameObject); 使用规范: 1.无法查找隐藏…...

【Spring容器的启动流程】

Spring容器的启动流程主要分为以下几个步骤: 加载配置文件:Spring容器会从指定的配置文件中读取配置信息,包括bean的定义、依赖关系、AOP切面等。 创建容器:Spring容器启动后会创建一个容器实例,容器负责管理bean的生…...

Python---字符串

字符串特点 1. 只可以存储字符串 2. 长度任意 (取决于内存大小) 3. 支持下标索引 4. 允许重复字符串存在 5. 不可以修改 (增加或删除元素等) 6. 支持for和while循环 字符串的下标索引 # 字符串的下标索引 从前向后,下标从0开始 从后向前,下标从-1开始…...

MySQL数据 - 索引

MySQL数据库 - 索引 1:什么是数据库索引?2:都有哪些类型的索引呢?3:MySQL数据库每种索引的底层实现原理,每种索引为什么这么实现?4:上面索引实现基本上是B+树,为什么不用别的数据结构呢?4-1:那为什么不是二叉树呢?4-2:为什么不是红黑树呢?4-3:为什么不是哈希索引…...

长安链BaaS服务平台调研

目录 一、菜单功能二、其他说明2.1、服务平台的部署方式2.2、链本身2.3、建链流程2.4、支持连接已部署的链2.5、链治理投票2.6、支持动态节点操作2.7、支持应用 长安链ChainMaker管理平台文档地址:https://docs.chainmaker.org.cn 一、菜单功能 菜单子菜单/功能点…...

怎么关闭php错误提示?两者方法分享

PHP程序员在开发过程中经常会遇到各种错误。为了方便查错,PHP默认会输出错误提示。但在生产环境中,这些错误提示信息不仅可能暴露你的代码结构,还会影响网站的性能和安全性。因此,关闭 PHP 的错误提示信息是一个很有必要并且很简单…...

Android Aidl跨进程通讯(三)--进阶使用

学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为2478字,预计阅读6分钟 前言 Android的AIDL使用和异常报错都已经介绍过了,今天这篇还是在原来的Demo基础上加入几个AIDL的进阶使用方法。 】 AIDL进阶使用 微卡智享 in,out,inout的使…...

vue.js+nodejs家庭个人理财收支管理系统5x6nf

本收支管理系统以vue.js作为框架,nodejs语言,B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块:用户管理、收入分类、支出分类、每日收入、每日支出等模块。 本文的组织结构如下: 1、绪论。综述了本文的研究背景…...

怎样去掉win11快捷方式的小箭头

前有创造注册表新值的方法,现在有了注册表加文件的方法 开始 先下载这个文件,里面有要用到的信息 下载 保存文件到电脑,并解压 有两个文件, 一个是 Remove_shortcut_arrow_icon.reg 一个是blank.ico 把第二个文件移动到 C:\Windows 文件夹, 然后点击打开文件, 如果提示是…...

Django项目如何配置日志文件信息

1、以dict的方式配置在settings.py中 # 日志文件简单配置LOGGING {"version": 1,"disable_existing_loggers": False,"handlers": {"file": {"level": "DEBUG","class": "logging.FileHandler&…...

遇到一个异步任务后是否会直接加入到异步队列当中

在javascript中,异步任务不会立即加入到异步队列(任务队列)中,而是根据不同的异步操作类型和执行环境,将对应的回调函数函数或事件加入到不同的队列中 javascript中常见的异步操作包括: 定时器&#xff1…...

SUSE Linux文件系统在线扩容

前几天巡检发现,SUSE 12文件系统/vg01下面的某个文件空间不足,挂载点是/oracle,容量不够,需要进行扩容。 新的空间是从一台HP的存储上新映射的。由于映射的LUN是从windows主机上回收,然后直接映射的,所以在linux识别新…...

智能电话机器人的出现,能够解决哪些问题?

经济的繁荣与高速的发展,使得电销这个方式快速地融合在房地产与金融投资等大部分行业上。在电销人员与客户的沟通上,难免会出现很多问题,毕竟所面对的客户都是各行各业,他们有着不同的经历和身份。 对于时常需要处理客户投诉、安…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

AI,如何重构理解、匹配与决策?

AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...