阿里停更了十年的开源项目终于更新了

开源AI·十一月创作之星挑战赛 10w+人浏览 556人参与

十年磨一剑,阿里这个被遗忘的开源项目突然"复活",体验和性能直接起飞!

QLExpress开源地址

🔥 十年沉寂,一朝重生


近日,阿里巴巴开源社区传来重磅消息:停更近十年的动态脚本引擎QLExpress终于迎来了史上最大更新——QLExpress4!

QLExpress 自 2012 年开源以来,很快就成为了使用最广泛的国产表达式引擎,但是阿里团队对它的维护和更新却不尽如人意,十多年就只从 3.07 更新到了 3.3.1。社区在对3.x版本的缝缝补补中度过了超过十年时光,积累了300多个难以修复的issue。

就在所有人都以为它已经"凉凉"的时候,阿里技术团队却给了所有人一个巨大惊喜。

💪 为什么要重写?


“我们已经不想再在原来的代码上进行修改,于是在一次喝咖啡的时候就决定将代码全部重写掉。”——这是项目负责人的原话。

十年间,解析技术和虚拟机技术都已经发生了翻天覆地的变化,原本的代码架构已经无法满足现代开发需求。更重要的是,AI时代的到来让规则引擎的需求不降反增:

在 2018 到 2025 的 7 年里,QLExpress 的 star 数翻了 10 倍还多,显示出该项目在开源社区中的持续关注和认可。并且它和很多项目的 star 数爆发式增长不同,QLExpress 一直是靠着用户的口碑传播稳步增长,最近一年随着 QLExpress4 的更新才稍有加速。

star趋势

🚀 性能炸裂:10倍提升!


QLExpress4的重构带来了惊人的性能提升:

  • 编译性能提升10倍:不同场景下的编译速度都有了质的飞跃
  • 执行性能翻倍:运行效率直接翻了一倍
  • Token级错误提示:无论是编译还是运行时错误,都能精准到具体位置

性能与体验提升

🌟 AI时代的黑科技


最让人惊喜的是,QLExpress4专门为AI时代做了深度优化:

1. 表达式追踪功能

能够记录计算过程中的每一步结果,这对AI生成规则时的调试特别友好。想象一下,AI写的规则出了问题,现在可以一步步看它是怎么算出来的!

比如表达式 !true || myTest(a, 1),表达式追踪树的结构大概如下(语法树每个节点的左侧为符号,右侧为计算结果):

        || true
       /      \
    ! false  myTest true
    /        /   \
true true  a 10  11

参考 官方文档 我们可以尝试用一下:

Express4Runner express4Runner = new Express4Runner(InitOptions.builder().traceExpression(true).build());
express4Runner.addFunction("myTest", (Predicate<Integer>)i -> i > 10);

Map<String, Object> context = new HashMap<>();
context.put("a", true);
QLResult result = express4Runner
    .execute("a && (!myTest(11) || false)", context, QLOptions.builder().traceExpression(true).build());
Assert.assertFalse((Boolean)result.getResult());

List<ExpressionTrace> expressionTraces = result.getExpressionTraces();
Assert.assertEquals(1, expressionTraces.size());
ExpressionTrace expressionTrace = expressionTraces.get(0);
Assert.assertEquals(
    "OPERATOR && false\n" +
    "  | VARIABLE a true\n" +
    "  | OPERATOR || false\n" +
    "      | OPERATOR ! false\n" +
    "          | FUNCTION myTest true\n" +
    "              | VALUE 11 11\n" +
    "      | VALUE false false\n", expressionTrace.toPrettyString(0));

除了方便对表达式进行调试外,基于表达式追踪可以实现大量酷炫的业务功能,比如对线上的规则进行采样,制作出用户被规则拦截原因的归因报表:

归因报表

2. 原生JSON支持

JSON 已经成为公认的构造对象对方便的方式的。无人是人还是 AI 生成,都更加方便。

QLExpress4原生支持 JSON 语法,除了可以用 JSON 构造简单的列表和映射,还可以直接构造复杂的 Java 对象。

以下代码可以在脚本中构造一个 List<Map> 类型:

list = [
  {
    "name": "Li",
    "age": 10
  },
  {
    "name": "Wang",
    "age": 15
  }
]

assert(list[0].age==[10,15])

也可以直接构造复杂的 Java 对象。

假设如下 Java 类:


public class MyHome {

    private String sofa;

    private String chair;

    // 嵌套对象
    private MyDesk myDesk;

    private String bed;
}

可以直接在脚本中用如下代码构造:


myHome = {
  '@class': 'com.alibaba.qlexpress4.inport.MyHome',
  'sofa': 'a-sofa',
  'chair': 'b-chair',
  'myDesk': {
    'book1': 'Then Moon and Sixpence',
    '@class': 'com.alibaba.qlexpress4.inport.MyDesk'
  }
}
assert(myHome.sofa=='a-sofa')

3. 增强的字符串处理

再也不用为复杂的字符串操作头疼了,新版专门优化了字符串处理能力。

QLExpress4 引入了动态字符串,支持 ${expression} 的格式在字符串中插入表达式计算:

如果想在字符串中原样保持 ${expression},可以使用 \$$ 进行转义

a = 123
assert("hello,${a-1}" == "hello,122")

// escape $ with \$
assert("hello,\${a-1}" == "hello,\${a-1}")

b = "test"
assert("m xx ${
  if (b like 't%') {
      'YYY'
  }
}" == "m xx YYY")

利用动态字符串能力,QLExpress4 也可以作为一个轻量级模板引擎使用。

无需在脚本中手动添加字符串引号,直接调用 executeTemplate 渲染模板字符串, 下面是一个简单的使用示例:

Express4Runner express4Runner = new Express4Runner(InitOptions.DEFAULT_OPTIONS);
Map<String, Object> context = new HashMap<>();
context.put("a", 1);
context.put("b", 2);
context.put("c", "test");
QLResult simpleTemplate = express4Runner.executeTemplate("a ${a};b ${b+2}", context, QLOptions.DEFAULT_OPTIONS);
Assert.assertEquals("a 1;b 4", simpleTemplate.getResult());
QLResult conditionTemplate =
    express4Runner.executeTemplate("m xx ${\n" + "  if (c like 't%') {\n" + "      'YYY'\n" + "  }\n" + "}",
        context,
        QLOptions.DEFAULT_OPTIONS);
Assert.assertEquals("m xx YYY", conditionTemplate.getResult());
QLResult multiLineTemplate = express4Runner.executeTemplate("m\n ${a}\n c", context, QLOptions.DEFAULT_OPTIONS);
Assert.assertEquals("m\n 1\n c", multiLineTemplate.getResult());
QLResult escapeStringTemplate =
    express4Runner.executeTemplate("m \n\"haha\" d\"", context, QLOptions.DEFAULT_OPTIONS);
Assert.assertEquals("m \n\"haha\" d\"", escapeStringTemplate.getResult());

🏢 大厂实战验证


这不是实验室里的玩具,而是在阿里内部得到大规模验证的工业级产品:

  • 淘天集团:用表达式追踪功能做规则归因聚类
  • 钉钉:利用JSON原生支持实现模型动态映射
  • 阿里妈妈:在广告投放场景中提升规则配置效率

🎯 为什么规则引擎在AI时代反而更重要?


很多人可能会问:有了AI,为什么还需要规则引擎?

答案是:AI和规则引擎是完美搭档,不是替代关系

  • AI负责学习和预测,规则引擎负责确定性的业务逻辑
  • AI可以生成规则,但需要规则引擎来执行和调试
  • 在金融、风控等场景中,可解释的规则比黑盒AI更受青睐

🔮 未来展望


QLExpress4的重构不仅仅是技术升级,更是阿里对开源社区承诺的体现。这个项目的"复活"告诉我们:

  1. 好项目不会真正死亡:只要有真实需求,就有重生的可能
  2. 技术债务要及时偿还:拖了十年的技术债,最终还是需要偿还
  3. AI时代需要新工具:传统工具需要适应AI时代的需求

💡 开发者行动指南


如果你想尝试QLExpress4,可以通过如下方式引入:

<dependency>
    <groupId>com.ql.util</groupId>
    <artifactId>qlExpress</artifactId>
    <version>4.0.5</version>
</dependency>

最新版本参考 官方文档

📈 结语


QLExpress4的重构故事,是一个关于技术坚持与创新的故事。它告诉我们,在快速变化的技术世界里,没有真正的"过时",只有不断进化的需求。

这个停更了十年的项目突然"复活",不仅是阿里技术实力的体现,更是对整个开源社区的承诺。在AI大行其道的今天,这样的"老树发新芽"格外令人振奋。

技术圈从不缺少奇迹,缺少的是创造奇迹的坚持和勇气。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值