风控系统之普通规则条件,使用LiteFlow实现

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


提要

参考:智能风控筑基手册:全面了解风控决策引擎

前面有可配置输入参数的接口如何设计和风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法两篇文章,分别提出:

1、风控系统服务动态选择,根据配置处理输入参数,转换为系统参数

2、使用Rediszset结构完成简单的指标计算(特征提取)

他们都是一次风控决策流程的一部分,当然完成的风控系统,比较复杂,涉及的功能模块更多,以下仅仅是我的简单梳理。

如上,服务选择和入参处理可配置输入参数的接口如何设计是这篇文章讨论的内容,风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法讨论的是规则集内普通指标计算。

本篇文章讨论通过LiteFlow这款规则引擎框架实现风控系统的普通规则条件。

规则条件

规则条件是什么?

我将规则划分如下(未来会逐渐完善),规则条件是规则的一部分。

需要注意的是规则条件应该都是灵活可配置,并不是上面这样并列,可以任意复杂的组合。

为什么只是规则条件灵活可配置呢?操作难道不是吗?

可以,但没必要。

如下,是规则(最近24小时转账次数>=10次)示例。

观察可知,其实右半边可以作为一个新的规则独立出去的,所以说,规则操没必要和规则条件混在一起。

规则引擎LiteFlow

规则引擎是为了解耦,编排而生。

LiteFlow官网:🍤LiteFlow简介 | LiteFlow

LiteFlow官方文档写的已经非常清晰,花费不到一上午的时间就可以了完全了解了,所以我也不多说些什么了。

为什么需要规则引擎

因为独立组件+灵活编排的需求和规则引擎不谋而合。

设计与实现

组件

组件是规则引擎中最重要的一部分,他是所有规则表达式最终业务的实现。

不使用规则引擎时

在不使用规则引擎时,针对前面普通规则条件,可以设计如下的结构。

一条规则关联一组规则条件,规则条件又最多分为两级,一级指明了二级规则条件“与或非”关系,二级是具体的规则条件。具体的规则条件关键字段是:系统字段(property)、字段类型(property_data_type)、操作(operator)、希望的值(value)。

有了如下的结构该怎么使用也很清晰了

1、查规则

2、查规则条件组

3、根据父条件,确定子条件关系

4、代码解析操作类型,返回条件结果

iduuidrule_uuidparent_uuidlogic_operatorpropertyproperty_data_typeoperatorvalue
1270a8dc859a940008539f270ae596ad686cbd8adff914f67b576f0046b5b337d
2bfbe53d6b5ae4895aef1c4c453e3e16e86cbd8adff914f67b576f0046b5b337d270a8dc859a940008539f270ae596ad6&&
3cf46348d533a48db8f027e4db4f6bb7a86cbd8adff914f67b576f0046b5b337dbfbe53d6b5ae4895aef1c4c453e3e16eS_N_EVENTHOURINT>=22
4f759541121664847bbc7d944ad1a553f86cbd8adff914f67b576f0046b5b337dbfbe53d6b5ae4895aef1c4c453e3e16eS_N_EVENTHOURINT<=24
5ec1e79cc18734fa4ab3daa51fe8597c886cbd8adff914f67b576f0046b5b337dbfbe53d6b5ae4895aef1c4c453e3e16eC_S_FINANCIALCLIENTSSTRING==
65a3b35c7d1d04466b16ae2da64383e2186cbd8adff914f67b576f0046b5b337d270a8dc859a940008539f270ae596ad6&&
71bed61e83d7e4ad0a813f2fa3bd7b8a986cbd8adff914f67b576f0046b5b337d5a3b35c7d1d04466b16ae2da64383e21S_N_EVENTHOURINT>=0
89446d7a9ec284c1ab52c600ac1cfad2686cbd8adff914f67b576f0046b5b337d5a3b35c7d1d04466b16ae2da64383e21S_N_EVENTHOURINT<6
9690e668a2e7c445c80b04ef5e30d3fa486cbd8adff914f67b576f0046b5b337d5a3b35c7d1d04466b16ae2da64383e21C_S_FINANCIALCLIENTSSTRING==

使用规则引擎后

首先我们定义组件可以完成字段的比较并返回true/false

那么上面作为组件的只有id为3、4、5、7、8、9,然后将这些编排成如下表达式即可。

这里简单介绍一些IF表达式,一共三个参数,第一个为条件,后面两个为true执行,false执行,跟三元表达式一样。

IF(OR(AND(3,4,5),AND(7,8,9)),x,y)

是不是很简单,看着确实,但有一个设计必须要搞通,也就是下面我要说的数据上下文。

数据上下文

🍄说明 | LiteFlow

数据上下文这个概念在LiteFlow框架中非常重要,你所有的业务数据都是放在数据上下文中。

要做到可编排,一定是消除每个组件差异性的。如果每个组件出参入参都不一致,那就没法编排了。

LiteFlow对此有独特的设计理念,平时我们写瀑布流的程序时,A调用B,那A一定要把B所需要的参数传递给B,而在LiteFlow框架体系中,每个组件的定义中是不需要接受参数的,也无任何返回的。

每个组件只需要从数据上下文中获取自己关心的数据即可,而不用关心此数据是由谁提供的,同样的,每个组件也只要把自己执行所产生的结果数据放到数据上下文中即可,也不用关心此数据到底是提供给谁用的。这样一来,就从数据层面一定程度的解耦了。从而达到可编排的目的。关于这个理念,也在LiteFlow简介中的设计原则有提到过,给了一个形象的例子,大家可以再去看看。

一旦在数据上下文中放入数据,整个链路中的任一节点都是可以取到的。

我简单说明一下。

如下,表示瀑布流程,从开始到结束,每步调用都需要将数据传递给下一步调用者,完成整个流程。

而对于LiteFlow,更像是下面这样,整个流程存在这样的数据上下文,每个组件只需要去数据上下文中取自己关心的数据,结果也是一样,放进数据上下文即可。

此模式下,要非常注重数据上下文的管理,数据隔离和共享要非常注意。

相同组件数据问题

对于规则条件组件的问题在于:每个规则里的条件非常多,组件该怎么获取当前组件参数(如:appName==Phone)。如IF(OR(AND(3,4,5),AND(7,8,9)),x,y)此表达式转换为我们使用的规则表达式应该是这样的IF(OR(AND(ruleConditionIF,ruleConditionIF,ruleConditionIF),AND(ruleConditionIF,ruleConditionIF,ruleConditionIF)),x,y)ruleConditionIF为规则条件组件。一个表达式中有多个相同的组件意味着他们需要不同的处理,那么数据怎么获取?

LiteFlow提供了三种不同方式:

1、🍉组件参数 | LiteFlow,定义EL表达式时声明数据并传入组件

2、🍍组件标签 | LiteFlow,定义组件tag区别组件

3、🍕私有投递 | LiteFlow,用于私有独有数据传递

下面使用方式二(组件标签)来实现普通条件组件。

表结构与数据

chain

create table de_chain
(
  id               bigint auto_increment comment '主键'
  primary key,
  application_name varchar(32)                 default ''                not null comment '应用名',
  chain_name       varchar(64)                 default ''                not null comment 'chain名',
  el_data          text                                                  not null comment 'el数据',
  enable           bit                         default b'0'              not null comment 'chain状态',
  description      varchar(64) charset utf8mb4 default ''                null comment '描述',
  creator          varchar(64) charset utf8mb4 default ''                null comment '创建者',
  create_time      datetime                    default CURRENT_TIMESTAMP not null comment '创建时间',
  updater          varchar(64) charset utf8mb4 default ''                null comment '更新者',
  update_time      datetime                    default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
  deleted          bit                         default b'0'              not null comment '是否删除',
  constraint uk_code
  unique (chain_name)
)comment 'chain表';

INSERT INTO coolGuard.de_chain (id, application_name, chain_name, el_data, enable, description, creator, create_time, updater, update_time, deleted) VALUES (1, 'coolGuard', 'mainChain', 'THEN(chain1);', true, '', '', '2024-04-04 22:35:36', '', '2024-04-04 22:40:30', false);
INSERT INTO coolGuard.de_chain (id, application_name, chain_name, el_data, enable, description, creator, create_time, updater, update_time, deleted) VALUES (2, 'coolGuard', 'chain1', 'IF(OR(AND(ruleConditionIf.tag("1"),ruleConditionIf.tag("2")),ruleConditionIf.tag("3")),orderMode,worstMode);', true, '', '', '2024-04-04 22:31:16', '', '2024-04-05 13:25:49', false);

规则条件表

create table de_rule_condition
(
  id           bigint auto_increment comment '主键'
  primary key,
  chain_name   varchar(64)                 default ''                not null comment 'chain名',
  field_name   varchar(32)                 default ''                not null comment '字段名',
  operate_type int                         default 0                 not null comment '操作类型',
  expect_value varchar(32)                 default ''                not null comment '期望值',
  description  varchar(64) charset utf8mb4 default ''                null comment '描述',
  creator      varchar(64) charset utf8mb4 default ''                null comment '创建者',
  create_time  datetime                    default CURRENT_TIMESTAMP not null comment '创建时间',
  updater      varchar(64) charset utf8mb4 default ''                null comment '更新者',
  update_time  datetime                    default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
  deleted      bit                         default b'0'              not null comment '是否删除'
)comment '规则条件表';

INSERT INTO coolGuard.de_rule_condition (id, chain_name, field_name, operate_type, expect_value, description, creator, create_time, updater, update_time, deleted) VALUES (1, 'chain3', 'appName', 2, 'Phone', '', '', '2024-04-04 22:32:25', '', '2024-04-05 12:24:03', false);
INSERT INTO coolGuard.de_rule_condition (id, chain_name, field_name, operate_type, expect_value, description, creator, create_time, updater, update_time, deleted) VALUES (2, 'chain4', 'customerId', 2, '123456', '', '', '2024-04-05 12:24:03', '', '2024-04-05 12:24:03', false);
INSERT INTO coolGuard.de_rule_condition (id, chain_name, field_name, operate_type, expect_value, description, creator, create_time, updater, update_time, deleted) VALUES (3, 'chain5', 'money', 5, '15', '', '', '2024-04-05 12:24:03', '', '2024-04-05 12:24:03', false);

依赖

<dependency>
  <groupId>com.yomahub</groupId>
  <artifactId>liteflow-spring-boot-starter</artifactId>
  <version>${liteflow.version}</version>
</dependency>
<dependency>
  <groupId>com.yomahub</groupId>
  <artifactId>liteflow-rule-sql</artifactId>
  <version>${liteflow.version}</version>
</dependency>
<dependency>
  <groupId>com.yomahub</groupId>
  <artifactId>liteflow-script-groovy</artifactId>
  <version>${liteflow.version}</version>
</dependency>

配置

liteflow:
  rule-source-ext-data-map:
    url: jdbc:mysql://localhost:3306/coolGuard?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
    driverClassName: com.mysql.cj.jdbc.Driver
    username: wnhyang
    password: 123456
    applicationName: ${spring.application.name}
    #是否开启SQL日志
    sqlLogEnabled: true
    #是否开启SQL数据轮询自动刷新机制 默认不开启
    pollingEnabled: true
    pollingIntervalSeconds: 60
    pollingStartSeconds: 60
    #以下是chain表的配置,这个一定得有
    chainTableName: de_chain
    chainApplicationNameField: application_name
    chainNameField: chain_name
    elDataField: el_data
    chainEnableField: enable
    #以下是script表的配置,如果你没使用到脚本,下面可以不配置

#    scriptTableName: script
#    scriptApplicationNameField: application_name
#    scriptIdField: script_id
#    scriptNameField: script_name
#    scriptDataField: script_data
#    scriptTypeField: script_type
#    scriptLanguageField: script_language
#    scriptEnableField: enable

自定义数据上下文

可以改善,先这样贴出来。

FieldContext表示经过入参处理后的所有字段集合,后面的规则/指标都会用到的。

/**
 * @author wnhyang
 * @date 2024/4/3
 **/
public class FieldContext {

    private final Map<String, String> stringFields = new ConcurrentHashMap<>();

    private final Map<String, Integer> numberFields = new ConcurrentHashMap<>();

    private final Map<String, Boolean> booleanFields = new ConcurrentHashMap<>();

    private final Map<String, String> enumFields = new ConcurrentHashMap<>();

    private final Map<String, LocalDateTime> dateFields = new ConcurrentHashMap<>();

    private final Map<String, BigDecimal> floatFields = new ConcurrentHashMap<>();

    public void setStringData(String key, String value) {
        stringFields.put(key, value);
    }

    public String getStringData(String key) {
        return stringFields.get(key);
    }

    public boolean hasStringData(String key) {
        return stringFields.containsKey(key);
    }

}

普通规则条件组件

当前还不是很完善,TODO已有说明。

对了,我使用的jdk17,所有switch表达式是下面这样,与jdk8有点区别。

/**
 * @author wnhyang
 * @date 2024/4/4
 **/
@Slf4j
@LiteflowComponent
@RequiredArgsConstructor
public class RuleConditionIf extends NodeIfComponent {

    private final RuleConditionMapper ruleConditionMapper;

    @Override
    public boolean processIf() throws Exception {

        // 获取当前chainName
        String tag = this.getTag();
        log.info("当前tag:{}", tag);

        // 获取当前chainName对应的条件
        RuleCondition ruleCondition = ruleConditionMapper.selectById(tag);
        log.info("当前chainName对应的条件:{}", ruleCondition);

        // 获取上下文
        FieldContext fieldContext = this.getContextBean(FieldContext.class);

        // 获取条件字段
        String fieldName = ruleCondition.getFieldName();
        log.info("条件字段:{}", fieldName);

        // 获取字段值
        // TODO 支持String、Integer、BigDecimal、Boolean等
        String stringData = fieldContext.getStringData(fieldName);
        log.info("字段值:{}", stringData);

        OperateType byType = OperateType.getByType(ruleCondition.getOperateType());
        log.info("操作类型:{}", byType);

        // TODO 当前是常量,之后要考虑变量
        String expectValue = ruleCondition.getExpectValue();
        log.info("期望值值:{}", expectValue);

        return switch (Objects.requireNonNull(byType)) {
            case NULL:
                yield StrUtil.isBlank(stringData);
            case NOT_NULL:
                yield !StrUtil.isBlank(stringData);
            case EQ:
                yield stringData.equals(expectValue);
            case NOT_EQ:
                yield !stringData.equals(expectValue);
            case CONTAINS:
                yield stringData.contains(expectValue);
            case NOT_CONTAINS:
                yield !stringData.contains(expectValue);
            case GT:
                yield Integer.parseInt(stringData) > Integer.parseInt(expectValue);
            case GTE:
                yield Integer.parseInt(stringData) >= Integer.parseInt(expectValue);
            case LT, LTE:
                yield false;
            case IN:
                String[] split1 = expectValue.split(",");
                for (String s : split1) {
                    if (stringData.equals(s)) {
                        yield true;
                    }
                }
            case NOT_IN:
                String[] split2 = expectValue.split(",");
                for (String s : split2) {
                    if (stringData.equals(s)) {
                        yield false;
                    }
                }
            case PREFIX:
                yield stringData.startsWith(expectValue);
            case NOT_PREFIX:
                yield !stringData.startsWith(expectValue);
            case SUFFIX:
                yield stringData.endsWith(expectValue);
            case NOT_SUFFIX:
                yield !stringData.endsWith(expectValue);

        };
    }
}

操作类型枚举

/**
 * @author wnhyang
 * @date 2024/4/3
 **/
@AllArgsConstructor
@Getter
public enum OperateType {

    NULL(0),
    NOT_NULL(1),
    EQ(2),
    NOT_EQ(3),
    GT(4),
    GTE(5),
    LT(6),
    LTE(7),
    IN(8),
    NOT_IN(9),
    CONTAINS(10),
    NOT_CONTAINS(11),
    PREFIX(12),
    NOT_PREFIX(13),
    SUFFIX(14),
    NOT_SUFFIX(15);

    private final Integer type;

    public static OperateType getByType(Integer type) {
        for (OperateType operateType : OperateType.values()) {
            if (operateType.getType().equals(type)) {
                return operateType;
            }
        }
        return null;
    }
}

测试

@Slf4j
@RestController
@RequestMapping("/field")
@RequiredArgsConstructor
public class FieldController {

    private final FieldService fieldService;

    private final FlowExecutor flowExecutor;

    @GetMapping("/test")
    public CommonResult<String> test(@RequestParam("appName") String appName, @RequestParam("customerId") String customerId, @RequestParam("money") String money) {
        FieldContext fieldContext = new FieldContext();
        fieldContext.setStringData("appName", appName);
        fieldContext.setStringData("customerId", customerId);
        fieldContext.setStringData("money", money);
        LiteflowResponse main1 = flowExecutor.execute2Resp("mainChain", null, fieldContext);
        log.info(String.valueOf(main1));
        return success("test");
    }
}

结果

mainChainEL表达式为THEN(chain1);chain1为子流程

IF(OR(AND(ruleConditionIf.tag("1"),ruleConditionIf.tag("2")),ruleConditionIf.tag("3")),orderMode,worstMode);ruleConditionIf为上面的规则条件组件。

最终应该是这样的:THEN(IF(OR(AND(ruleConditionIf.tag("1"),ruleConditionIf.tag("2")),ruleConditionIf.tag("3")),orderMode,worstMode));

参数为:appName:Phone,customerId:235246,money:35

此时执行流程为:ruleConditionIf<17>==>ruleConditionIf<2>==>ruleConditionIf<2>==>orderMode<0>

参数为:appName:Phone,customerId:235246,money:3

此时执行流程为:ruleConditionIf<42>==>ruleConditionIf<2>==>ruleConditionIf<1>==>worstMode<0>

总结

LiteFlow可玩性还是很强的,未来我还会继续完善打造自己设计并实现的风控系统。冲冲冲!!!

写在最后

拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。


个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gson的用法

1. 导入依赖 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version> </dependency> 2. 使用Gson进行解析 2.1 Gson解析普通对象 package com.jiang.partnetbackend.…

六、企业级架构缓存篇之memcached

一、memcached概述 1、网站架构优化流程&#xff1a; LNMP架构中网站应用访问流程&#xff1a; 浏览器 (app) → web 服务器 → 后端服务 (php) → 数据库 (mysql) 访问流程越多&#xff0c;访问速度越慢&#xff0c;出现问题的几率也越大。 网站访问流程优化思路&#xff1…

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例&#xff08;Test Case&#xff09;是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准&#xff1a; 用例表达清楚&#xff0c;无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…

c语言之向main函数传递参数

在c语言中&#xff0c;main函数也是可以传递传递参数的&#xff0c;业内向main函数传递参数的格式是 main(int argc,char *argv[]) 向main函数传递参数不是通过代码传递的&#xff0c;一般是通过dos命令传递 举个例子 #include<stdio.h> void main(int argc,char *ar…

算法刷题应用知识补充--基础算法、数据结构篇

这里写目录标题 位运算&#xff08;均是拷贝运算&#xff0c;不会影响原数据&#xff0c;这点要注意&#xff09;&、|、^位运算特性细节知识补充对于n-1的理解异或来实现数字交换找到只出现一次的数据&#xff0c;其余数据出现偶数次 >> 、<<二进制中相邻的位的…

算法设计与分析实验报告c++实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、 编…

为什么mac文件拖拽不了 mac文件拖不进硬盘里 macbookpro文件无法拖进移动硬盘 Tuxera NTFS for Mac 2023绿色

如果你是一位Mac用户&#xff0c;你可能会遇到这样的问题&#xff1a;你想把Mac上的文件拖拽到其他位置&#xff0c;比如桌面、文件夹或者外接硬盘&#xff0c;但是却发现无法操作&#xff0c;这是为什么呢&#xff1f;这篇文章将为你解答为什么mac文件拖拽不了&#xff0c;以及…

Web安全-浏览器安全策略及跨站脚本攻击与请求伪造漏洞原理

Web安全-浏览器安全策略及跨站脚本攻击与请求伪造漏洞原理 Web服务组件分层概念 静态层 &#xff1a;web前端框架&#xff1a;Bootstrap&#xff0c;jQuery,HTML5框架等&#xff0c;主要存在跨站脚本攻击脚本层&#xff1a;web应用&#xff0c;web开发框架&#xff0c;web服务…

Linux从入门到精通 --- 2.基本命令入门

文章目录 第二章&#xff1a;2.1 Linux的目录结构2.1.1 路径描述方式 2.2 Linux命令入门2.2.1 Linux命令基础格式2.2.2 ls命令2.2.3 ls命令的参数和选项2.2.4 ls命令选项的组合使用 2.3 目录切换相关命令2.3.1 cd切换工作目录2.3.2 pwd查看当前工作目录2.4 相对路径、绝对路径和…

vue2+elementUi的两个el-date-picker日期组件进行联动

vue2elementUi的两个el-date-picker日期组件进行联动 <template><el-form><el-form-item label"起始日期"><el-date-picker v-model"form.startTime" change"startTimeChange" :picker-options"startTimePickerOption…

c# wpf template itemtemplate+ListBox

1.概要 2.代码 <Window x:Class"WpfApp2.Window7"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expression/blend/…

【opencv】示例 3calibration.cpp 利用OpenCV库进行三路相机校准

此代码是一个利用OpenCV库进行三路相机校准的C程序。这个示例程序主要用于校准水平摆放的三台相机。 以下是关键函数及其功能的简要总结&#xff1a; help(char** argv): 显示程序的使用方法。calcChessboardCorners(Size boardSize, float squareSize, vector<Point3f>&…

Vue 事件处理 -- 事件修饰符(prevent、stop、capture、self、once)

1. 事件修饰符 Vue中的事件修饰符&#xff1a; prevent&#xff1a;阻止默认事件&#xff08;常用&#xff09;&#xff1b;stop&#xff1a;阻止事件冒泡&#xff08;常用&#xff09;&#xff1b;once&#xff1a;事件只触发一次&#xff08;常用&#xff09;&#xff1b;cap…

软考 系统架构设计师系列知识点之数据库基本概念(1)

所属章节&#xff1a; 第6章. 数据库设计基础知识 第1节 数据库基本概念 数据&#xff08;Data&#xff09;是描述事务的符号记录&#xff0c;它具有多种表现形式&#xff0c;可以是文字、图形、图像、声音和语言等。信息&#xff08;Information&#xff09;是现实世界事物的…

考研回忆录【二本->211】

备考时长差不多快一年半&#xff0c;从22年的11月底开始陆陆续续地准备考研&#xff0c;因为开始的早所以整个备考过程显得压力不是很大&#xff0c;中途还去一些地方旅游&#xff0c;我不喜欢把自己绷得太紧。虽然考的不是很好&#xff0c;考完我甚至都没准备复试&#xff0c;…

ChatGPT 的核心 GPT 模型:探究其生成式预训练变换架构的革新与应用潜力

GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型是一种深度学习模型&#xff0c;由OpenAI于2018年首次提出&#xff0c;并在随后的几年中不断迭代发展&#xff0c;包括GPT-2、GPT-3以及最新的GPT-4。GPT模型在自然语言处理&#xff08;NLP&#xff09;领域…

JAVA毕业设计132—基于Java+Springboot+Vue的自习室座位预约小程序管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的自习室座位预约小程序管理系统(源代码数据库)132 一、系统介绍 本项目前后端分离带小程序&#xff0c;分为管理员、用户两种角色 1、用户&#xff1a; 注…

跨平台的组播测试工具mping、udp_sender及udp_reciver的源码及使用教程

文章目录 1.前言2.mping工具编译3.mping工具使用3.1 参数说明3.1 组播播发&#xff08;-s&#xff09;3.1 组播播发&#xff08;-r&#xff09;3.3 Linux下mping测试 4.Linux组播udp_sender及udp_reciver使用4.1 udp_sender源码4.1 udp_reciver源码4.3 编译方法4.4 测试使用4.4…

Star GAN论文解析

论文地址&#xff1a;https://arxiv.org/pdf/1912.01865v1.pdf https://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf 源码&#xff1a;stargan项目实战及源码解读-CSDN博客 1. 概述 在传统方法中&#x…

电子商务平台中大数据的应用|主流电商平台大数据采集API接口

(一)电商平台物流管理中大数据的应用 电商平台订单详情订单列表物流信息API接口应用 电子商务企业对射频识别设备、条形码扫描设备、全球定位系统及销售网站、交通、库存等管理软件数据进行实时或近实时的分析研究,提高物流速度和准确性。部分电商平台已建立高效的物流配送网…