Drools那些事儿

AI代理安全实践:符号护栏架构设计与金融风控应用 在人工智能工程化落地过程中,确保AI系统的安全、可控与合规是核心挑战。符号逻辑与规则引擎技术为解决这一问题提供了可解释、高确定性的技术路径。其原理在于将领域知识(如法规、业务规则)编码为明确的符号规则,在AI模型的输入、推理过程及输出等关键环节实施实时校验与强制约束,从而在统计模型的灵活性之上叠加一层确定性的安全边界。这一技术价值在于能够显著降低AI在医疗、金融、法律等高敏感领域的应用风险,实现效用与安全的双重保障。其典型应用场景包括对AI代理(Agent)的过程监督、工具调用权限控制及输出合规性检查。本文 阅读详情

Drools那些事儿

1.简单介绍

Drools是一个基于java的规则引擎,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启服务就可以在线上环境生效。

2.语法规则

一个规则通常包括三个部分:属性部分(attribute)、条件部分(LHS)和结果部分(RHS),对于一个完整的规则来说,这三个部分都是可选的,以下规则是合法的
    rule "name"
        when
        then
        end
    when-then:LHS,当LHS为空时,规则引擎自动添加eval(true),即LHS为空的规则总是返回ture

=========================================================== attribute =============================================================================

salience:设置规则执行的优先级,数字越大优先级越高

no-loop:控制已经执行的规则条件再次满足时是否再次执行

activation-group:将若干个规则划为一个组,只要有一个规则被执行,其余规则都不会被执行。可以使用salience控制规则执行先后

$objName:Object([filed约束]) 绑定一个变量objecName,类型为Object,且满足[flied]中的约束

declare:在规则文件中定义一个新的Fact类型
    declare User
        username:String
        age:Integer
    end


date-expires:当系统时间<=date-expires后才会触发,默认格式dd-MM-yyyy,使用System.setProperty("drools.dateformat","yyyy-MM-dd")设置其他类型的格式
    rule "dateRule"
        date-expires "2020-04-06"
        when
            eval(true);
        then
            System.out.println("dateRule is execution");
        end

dete-effective:当系统时间>=date-effective设置的时间值时,规则才会触发执行。date-effective可接受的日期格式为'dd-MMM-yyyy'
    rule 'dete-effective-test'
        date-effective '12-04-2020'
        when
            eval(true)
        then
            System.out.println("rule is execution")
        end

enabled:定义一个规则是否可用,默认是true

dialect:定义规则中使用的语言类型,目前drools支持两种语言类型:mvel和java。默认使用java

duration:如果设置了该属性,那么规则将在该属性值之后在另外线程中触发,单位毫秒
    rule "duration-test"
        duration 3000
        when
            eval(true)
        then
            System.out.println("rule threadId:"+Thread.currrentThread().getId());
        end

lock-on-active:确实规则只执行一次。默认为false。将lock-on-active属性设置为true,可以避免某些Fact对象因属性改变而使已经执行过的规则再次激活执行



=============================================================== LHS ===============================================================================

contains:检查一个Fact对象的某个字段(该字段要是一个Collection或者Array类型)是否包含指定对象【not contains同理】
    when
        $order:Order()
        $Customer:Customer(age >20,orders contains $order)
    then
        System.out.println($Customer.getName());
    end
    //输出年龄大于20且订单包含在Order中的CustomerName

memberOf 判断某个Fact对象的某个字段是否在一个集合(Collection/Array)当中。Object(filedName memberOf value[Collection/Array])【not memberOf】
    when
        $s:String()/List()       //如果类型是String,则比较字符串中是否包含比较字符串,效果等同于contains
        $c:Member(name memberOf $s);
    then
        System.out.println("memberOfRule 规则触发");

matches 用来对某个Fact的字段与标准的Java正则表达式进行相似匹配,被比较的字符串可以是一个标准的正则表达式,正则表达式不用考虑\的转义问题【not matches】
        when
            $customer:Customer(name matches '李.*');
        then
            statement;
        
==================================================== RHS =====================================================

insert(new Object()) 一旦调用insert函数,drools会重新与所有的规则重新匹配一次,对于没有设置no-loop属性为true的规则,如果条件满足,不管其之前是否执行过都会再执行一次。update、retract同样具有该特性
    when             
        eval(true)
    then
        Customer cus = new Customer();
        cus.setName("张三");
        insert(cus);
    end

update 对当前working memory中Fact对象进行更新。

retract 将当前Fact对象从working memory当中删除

modify 表达式块,可以快速实现对Fact对象多个属性进行修改,修改完成后自动跟新到当前的Working Memory当中。使用modify同样会导致引擎重新检查所有的规则匹配条件
    语法格式:
        modify(fact-express){
            <修改Fact属性的表达式>[,<修改Fact属性的表达式>]
        }

    when
        $customer:Customer(name=="张三",age=20)
    then
        System.out.println("modify before customer id:"+$customer.getId()+",age:"+$customer.getAge());
        modify($customer){
            setId("super man"),
                        setAge(30)
        }
    end

3.SpringBoot整合Drools

3.1.新建SpringBoot工程,导入以下maven依赖

<dependency>  
	<groupId>org.drools</groupId> 
	<artifactId>drools-core</artifactId>    
	<version>7.6.0.Final</version>
</dependency>
<dependency>    
	<groupId>org.drools</groupId>    
	<artifactId>drools-compiler</artifactId>    
	<version>7.6.0.Final</version>
</dependency>
<dependency>    
	<groupId>org.drools</groupId>   
	 <artifactId>drools-templates</artifactId>    
	 <version>7.6.0.Final</version>
</dependency>
<dependency>   
	 <groupId>org.kie</groupId>    
	 <artifactId>kie-api</artifactId>    
	 <version>7.6.0.Final</version>
</dependency>
<dependency>    
	<groupId>org.kie</groupId>    
	<artifactId>kie-spring</artifactId>    
	<version>7.6.0.Final</version>
</dependency>

3.2.编写规则引擎配置类

@Configuration
public class RuleEngineConfig {
    private static final Logger logger = LoggerFactory.getLogger(RuleEngineConfig.class);
    private static final String RULES_PATH="droolsRule/";   //规则文件路径
    private final KieServices kieServices = KieServices.Factory.get();
    @Bean
    public KieFileSystem kieFileSystem() throws IOException {
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        Resource[] files = resourcePatternResolver.getResources(RULES_PATH + "*.*");
        String path = null;
        for (Resource file : files) {
            path = RULES_PATH + file.getFilename();
            logger.info("path="+path);
            kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));
        }
        return kieFileSystem;
    }
    @Bean
    public KieContainer kieContainer() throws IOException {
        KieRepository kieRepository = kieServices.getRepository();
        kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());
        kieBuilder.buildAll();
        return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
    }
    @Bean
    public KieBase kieBase() throws IOException {
        return kieContainer().getKieBase();
    }
    @Bean
    public KieSession kieSession() throws IOException {
        return kieContainer().newKieSession();
    }
    @Bean
    public KModuleBeanFactoryPostProcessor kiePostProcessor() {
        return new KModuleBeanFactoryPostProcessor();
    }
}

3.3.编写一个简单规则,举例:将年龄大于20的用户信息输出

package droolsRule;	//对应3.2配置类中的规则路径,规则文件放于文件夹a下,这里就写package a
import com.duang.droolsdemo.entity.Customer


rule "paramCheckNotNull"
    salience 100
//    规则优先级,值越大优先级越高
    when
        $customer:Customer(age >= 20)
    then
        System.out.println($customer.toString());
end

3.4.编写测试类

@SpringBootTest
class DroolsdemoApplicationTests {
    @Resource
    private KieSession kieSession;


    @Test
    void contextLoads() {


    }


    @Test
    public void testDrools(){
        Customer customer = new Customer();
        customer.setName("Alice");
        customer.setAge(20);
        customer.setTime(new Timestamp(System.currentTimeMillis()));
        //调用规则引擎验证数据
        kieSession.insert(customer);
        kieSession.fireAllRules();
    }


}

说点其他的

刚开始接触规则引擎的时候有个疑问,像上面的例子直接使用if-else不是更简单快捷么?后来使用过程中发现了有一个好处就是如果对规则文件进行修改无需重新编译程序即可生效甚至你还可以将规则存于数据库更灵活的修改规则。总而言之,规则引擎的水很深,我也才刚接触它,写篇博客分享心得也给以后做个留念。写的很仓促,疏漏错误之处还请大家多多指教,加油

AI智能体在制造业的落地实践:从数据感知到工艺知识传承 在工业制造领域,工艺知识的传承与过程优化是核心挑战。传统上,这些知识依赖于老师傅的经验,难以固化与传递。其背后原理涉及对生产过程中多源异构数据(如设备状态、工艺参数、质量数据)的实时采集、治理与分析。通过构建“感知-认知-决策”的闭环系统,技术价值在于将隐性经验转化为可计算、可复用的结构化知识,实现生产过程的持续优化与辅助决策。这依赖于时序数据处理、机器学习模型与知识图谱等关键技术。应用场景广泛覆盖设备监控、质量预测、异常诊断与工艺参数推荐等环节。本文聚焦的“AI智能体”正是这一理念的工程实践,它充当“数字 阅读详情

相关推荐

规则引擎中对日期的设置问题

规则引擎生效日期解决方案,此文档中详细说明了系统如何对规则进行排查和筛选

Drools WorkBench日期格式dd-MMM-yyyy的处理

我们要使用WorkBench动态生成jar,又想使用时分秒,编写规则文件后,上面的日期格式显然校验不通过,WorkBench想让我们使用。,可以看出这种格式,很难满足我们的项目需求,如果我们在编写规则文件时想使用时分秒,比如。最终,规则文件通过了校验,通过了编译,动态生成了jar,我也用到了时分秒。索性就遵循它的格式,然后在后面加上时分秒,比如"这种格式,通常情况下可以在项目中使用。",这样就可以校验通过,在项目中使用。Drools 默认的日期格式是。

weixin_44302531的博客 416

S7-200SMART系列全套接线说明

SMART200接线方法,输入,输出,模拟量,面板,扩展糟等,并且详细说明接线原理。

文都龙哥 1万+

drools规则语法(一)

  1、基本的匹配规则 1.1变量 drools使用匹配的方式对Fact进行比对, 比如 account : Account(balance &gt; 100)  这个规则的含义就是在Fact中找到类型为Account,且balance属性值大于100的所有Account实例。 可以指定变量来描述一个类型或者一个映射一个类的属性, 比如 $account : Account($...

kingsun1980 1435

采用离散模型搭建永磁同步电机控制系统

永磁同步电机发电系统分为控制器和发电机,通过simulink仿真软件进行发电系统的离散系统仿真。离散搭建仿真,可以更方便的自动代码生成。通过实践经验离散模块搭建,更能加深对整个控制系统的理解。离散系统在矢量控制中经常涉及到上个开关周期的角度,电压,或者预测下个周期的角度,电流,一般都是通过延时模块实现。PWM比较值寄存器被改写后都是使能了预装载,采样后触发计算到比较值生效可以延时0.5个开关周期Ts,也可以延时1个开关周期Ts,可以通过离散系统进行仿真,大大缩短开发周期。

f1072239934的博客 2863

13、基因相似性度量的相关性及特征选择研究

本文研究了基因相似性度量和特征选择在生物学中的应用,详细介绍了GO术语相似性度量的多种方法,包括语义度量和路径长度度量,并分析了不同方法在酵母和人类数据集上的表现。研究发现,Avg-sum方法和基于路径长度的度量在多数情况下效果较好。此外,通过晚期辐射毒性预测的案例研究,探讨了特征选择的重要性及可能面临的过拟合和噪声干扰问题,并提出了相应的解决策略。

js777的博客 127

36、Drools语法之定时器和日历

定时器 规则现在支持基于 interval(间隔)和 cron 的定时器,替代了过时的 duration(期限) 属性。简单的定时器属性使用第一种写法timer ( int: &lt;initial delay&gt; &lt;repeat interval&gt;? )timer ( int: 30s )timer ( int: 30s 5m )第二种写法timer ( cron: &lt;cr...

u013115157的博客 2716

手把手入门YOLO到改进优化教程 | 【P6进阶篇】YOLOv8模型剪枝优化实战-LAMP剪枝

本节首先介绍LAMP剪枝相关理论。然后结合YOLO框架,手把手搭建剪枝工程,包括配置文件修改、剪枝脚本构建等内容。

嵌入式阿齐Archie 2万+

drools 7 日期时间段校验

本文分享一个drools校验日期区间内时间段的校验方法。 案例如下:电商品台新增一个促销活动,2019年10月份,限时每天10点至13点,下单9折活动。 首先可以用 date-effective 和 date-expires 两个属性限制日期区间为2019-10-01 至 2019-10-31,但是每天10点至11点该怎样限制呢?下面给出我的想法,算是抛砖引玉。 1...

miemieY89 2657

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧

丨汀、的博客 4327

DPABISurf使用教材

严老师的官方教程:http://rfmri.org/Course DPABISurf版本:dpabi50docker.tar.gz MATLAB版本:2018b 一、数据准备 (1)如果是数据的DICOM格式,整理成以下格式(注意文件夹的命名方式): 如果觉得不是很清楚,可以在官网下载Demo数据(http://rfmri.org/DemoData),参照里面的文件格式进行整理即可。 (2)如果数据是nii格式,整理成以下格式: 这里没有使用官网的demo数据进行学习,而是..

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 8520

规则引擎Drools (4)

规则属性(attributes) 参考b站黑马博学谷drools视频,侵权请联系删除 规则属性位于规则体的rulename和when之间。常用的有: (1)enable属性 enabled属性对应的取值为true和false,默认值为true。用于指定当前规则是否启用,如果设置的值为false则当前规则无论是否匹配成功都不会触发。 如: (2)dialect属性 dialec1t属性用于指定当前规则使用的语言类型,取值为java和mvel,默认值为java。 注: mvel是一种基于java语法的表达式

lb4f2525的博客 358

让openclaw接入web端的deepseek或着qwen,使用无限token

🪟 Windows: 提供原生的 PowerShell 一键安装支持!配置过程和官方版本是相同的,唯一的区别就是再选则model时要选择带Browser字样的deepseek或者qwen。安装之前需要先清理官方版本的安装痕迹,否则openclaw版本跳转不到这个中文版本。因为此版本与官方版本存在代差,在配置飞书时可能会出现无法安装飞书的情况。剩下的配置保持和官方版本一致操作即可。选中之后需要进行一次网页端的登录。登录后会出现可选择的model。安装完成后会跳到这个中文界面。涉及到接入飞书机器人的操作。

z1872385的博客 302

drools 工作原理_开源规则引擎drools

开源规则引擎--drools点击上方“技术支持联盟”,选择“置顶公众号”第一时间了解程序员大小事儿作者:菜太咸,不做伪工作者,相信技术的力量,勇于挑战自我,敢于创新变革。简介:Drools(JBoss Rules )具有一个易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。业务分析师或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了...

weixin_42098104的博客 4408

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

activiti集成drools实验

无代码,无真相。 网上的博客代码,都挺片段的。所以,我想找个现成的demo实验代码。 上github ------------------------------------------------- ecipse 配置 github 过程     思路:首先,github配置三种repository获取方式:svn,https, ssh。在eclipse上安装好github的插件之后,放入相...

weixin_34163553的博客 233

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

studio找不到jdk_JDK升级的那点事儿(一)

最近公司进行JDK升级,从6到8。各位看官莫笑,传统企业大多如此,使用JDK1.4及以下的也不在少数。升级内容主要分几大类:框架:首当其冲就是Spring,从Spring4开始完整支持JDK8。其实说到根本也是字节码操作版本的问题,包括annonation的扫描、代理类生成、lamda表达式的应用等。字节码操作类,包括asm、AspectJ等,也需要升级到对应版本支持JDK8。其他工具类,以Hib...

weixin_39562752的博客 183

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

[框架那点事儿-快速开发季]编写自己的数据持久层(7)总结篇

在前面的六篇文章中,针对日常开发常用到的DB的操作对spring框架的jdbcTemplate进行了一定的封装,从增删查改四个方面,针对于全字段、部分字段、单一、批量几个方面展开来一一封装,提供了30多个API,基本能够覆盖日常开发所需的DB操作,降低一定的工作成本,提高工作效率。在这个封装的过程中,遇到了不少在进行这个专题工作前没有思考到的问题,也伴随着不断的代码新增、重构优化,将能考虑到的问题解决,首先先总结一下,自己都遇到哪些方面的问题:1、数据库中获取数据如何交给DO类?同样的,在避免代码中出现sq

quzishen的专栏 6692

基于java的事业单位教师招聘考试可视化系统

2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。二维码(三端):可以生成一个二维码的图片,用手机扫一扫可以查看二维码里面的信息。

qq840612233的博客 383

AI+springboot智慧生产安全设备巡检预警系统的设计与实现

2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。多种统计效果:可以多种统计图效果展示,1、合并效果 2、单独展示3、随模块一起。

QQ3166678367的博客 401

规则引擎基础知识

全称为 业务规则管理系统 ,英文名为 BRMS(即 Business Rule Management System)。规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块(注:领域特定语言)编写业务决策(业务规则)。由用户或开发者在需要时进行配置、管理。需要注意的是规则引擎并不是一个具体的技术框架,而是指的一类系统,即业务规则管理系统。...

aaaak_的博客 1万+

springboot基于个性化智能提醒的社区老年康养管理系统设计与实现

简单说,一个管安全规则,一个管身份凭证,组合起来为Web应用打造可靠防护。2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。

QQ_188083800的博客 424

人工智能+AI的电商平台商城可视化沙箱支付 优惠卷

2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。二维码(三端):可以生成一个二维码的图片,用手机扫一扫可以查看二维码里面的信息。

QQ_188083800的博客 179

Java分布式篇4——Redis

Java分布式篇4——Redis 1、互联网架构的演变历程 1.1、第一阶段 数据访问量不大,简单的架构即可搞定! 1.2、第二阶段 数据访问量大,使用缓存技术来缓解数据库的压力 不同的业务访问不同的数据库 1.3、第三阶段 主从读写分离。 之前的缓存确实能够缓解数据库的压力,但是写和读都集中在一个数据库上,压力又来了,一个数据库负责写,一个数据库负责读,分工合作,让master(主数据库)来响应事务性(增删改)操作,让slave(从数据库)来响应非事务性 (查询)操作,然后再采用主从复制来把ma

gyfghh的博客 4146
上一篇: 快速整合ssh框架搭建简单demo
钮祜禄氏·哆啦A栋
博客等级 码龄10年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值