我们过去关于DMN的大多数帖子都假设读者知道它是什么,并且可能已经在使用它。但毫无疑问,有一大群读者听说过它,但并不真正了解它的全部内容。可能还有一个同样大的群体,他们从批评者那里听说过它,并有一些误解。因此,在这篇文章中,我们将尝试解释它是什么以及它是如何工作的。
DMN代表决策模型和符号,是一种基于模型的业务决策逻辑语言。此外,它是由对象管理组(OMG)维护的供应商中立标准,OMG是BPMN、CMMN和其他标准背后的组织。与OMG的其他业务建模标准一样,“模型”意味着每个语言元素的名称、含义和执行行为在UML元模型中正式定义,而“符号”意味着语言的很大一部分是以图形方式定义的,在图表和表格中使用链接到模型元素的特定形状和符号。换句话说,业务决策、业务流程或案例的逻辑由具有精确含义的图表定义,与创建它们的工具无关。以图形方式定义逻辑的主要原因是让非程序员(即业务人员)参与其创建和维护。
DMN对运营决策的逻辑进行建模,这些决策每天多次遵循相同的明确规则。示例包括批准贷款、验证提交的数据或确定客户服务请求中的下一个最佳操作。这些决策通常取决于多种因素,并且逻辑通常很复杂。DMN逻辑最熟悉的形式是决策表。所有DMN工具都支持决策表,这是因为业务人员无需接受任何培训即可轻松理解它们。考虑下面的决策表,该表估计了有资格获得住房抵押贷款的可能性:

获得住房抵押贷款的资格主要取决于三个因素:借款人的信用评分,衡量信誉的指标;抵押贷款比率,将贷款金额除以物业评估价值,以百分比表示;以及借款人的债务收入比率,将每月住房成本加上其他贷款支付除以每月收入,以百分比表示。这三个决策表输入由左侧浅蓝色表头的列表示。决策表输出(此处称为“贷款资格审核”)的可能值为“可能通过审批”、“可能会被批准”、“可能被拒绝”或“不批准”,是右侧深蓝色表头的列。列名称下方是其数据类型,包括允许的值。表格中的每一行编号都是一个决策规则。输入列中的单元格是输入的条件,如果规则的所有输入条件的计算结果都为true,则称该规则匹配,并将输出列中的值选为决策表输出值。
输入列中的连字符表示规则中未使用输入;默认情况下,条件为true。因此,第一条规则说,如果信用评分低于620,则贷款资格预审为“不批准”。数值范围显示为由两个点分隔的值,所有值都用括号或方括号括起来。括号表示排除范围内的端点;方括号表示包括它。因此,规则4规定,如果信用评分大于或等于620且小于660,而抵押贷款比大于75且小于或等于80,并且债务收入比大于36且小于或等于45,则贷款资格预审为“可能被拒绝”。一旦你得到了数字范围符号,决策表的含义就很清楚了,这也是DMN被认为是商业友好型的一个关键原因。
但是,如果您仔细考虑一下,您会发现,虽然信用评分可能是一个已知的输入值,但抵押贷款比和债务收入比不是。它们是派生值。它们是根据已知的输入值计算的,例如贷款金额、评估的房产价值、月收入、住房费用(包括抵押贷款支付)、税收和保险以及其他贷款支付。在DMN中,这些计算作为顶层决策贷款资格预审的支持决策提供。基于其他支持决策,每个计算本身都可能很复杂。这导致了DMN的另一个普遍支持的功能,即决策需求图DRD。下面您会看到贷款资格预审的DRD。椭圆是输入数据、已知输入值,矩形是决策或计算值。指向决策的实心箭头称为信息需求,用于定义决策计算的输入,输入数据或支持决策。

与决策表一样,业务用户很容易理解DRD,他们可以创建它们来概述整体逻辑的依赖关系。在上面的视图中,我们显示了DRD中每个输入数据和决策的数据类型。内置数据类型包括String、Number、Boolean等内容以及这些数据类型的集合,但DMN还允许建模者创建用户定义的类型,这些类型表示对内置类型的约束(例如“信用评分”类型的数值范围为300到850)和结构化类型,指定为组件的层次结构。例如,描述输入数据“贷款”的类型“贷款”是如下所示的结构:

结构的各个组件使用点表示法进行引用。例如,“贷款金额”值为贷款.金额。
因此,一个完整的DRD,包括所有支持决策的数据类型,直至输入数据,提供了巨大的业务价值,并且可以由主题专家轻松创建。因此,所有DMN工具都支持DRD。但仅凭DRD和顶级决策表不足以评估决策。为此,您需要为支持决策提供逻辑。在这里,DMN社区内部存在一些分歧。一些工具供应商认为DMN应该只用于提供基于模型的业务需求。然后,这些需求被移交给开发人员,以使用其他语言(如Java等编程语言或专有业务规则语言(如IBMODM))完成决策逻辑。我们称这些工具为DMNLite,因为完全实现的DMN允许主题专家自己定义完整的、完全可执行的决策逻辑,而无需编程。
全DMN为DRD和决策表增加了两项关键创新:表达式语言FEEL和称为盒装表达式的标准化表格格式。使用盒装表达式和FEEL,真正的DMN工具允许非程序员创建可执行的决策模型,即使逻辑非常复杂。因此,您可以将DMN视为一种低代码语言,用于决策逻辑,对业务友好、透明且可执行。
在这种语言中,DRD中的形状定义变量(具有分配的数据类型),形状标签定义变量名称。通过绘制DRD来定义变量解释了FEEL的一个不寻常的特性,即变量名称可能包含空格和其他编程语言通常不允许的标点符号。每个单独决策的值表达式是根据其输入值或信息要求计算该决策变量的值。FEEL和盒装表达式的意图是,不是程序员的主题专家可以自己创建价值表达式。
FEEL被称为表达式语言,一种类似于Excel公式的公式语言,而不是编程语言。FEEL只是提供了一个公式,用于根据一组输入值计算输出值。它不会创建输出和输入变量;DRD就是这样做的。回到我们的DRD,让我们看一下抵押贷款比的价值表达式,即以百分比表示的贷款价值比率。FEEL表达式如下所示:

这是简单的算术。任何人都可以理解它。这是最简单的盒装表达式类型,称为文字表达式,只是一个框中的FEEL公式,决策名称和数据类型位于顶部的选项卡中。决策表是另一种盒装表达式类型,还有更多类型。每种盒装表达式类型都具有不同的表格格式和含义,这些表中的单元格是FEEL表达式。以类似的方式,以下是债务收入比的文字表达式:

棘手的是抵押贷款付款。它也只是算术,基于贷款的组成部分。但这个公式很难记住,更难推导出来。这是在贷款中一直使用的一种。为此,计算被委托给一些可重用的决策逻辑,称为业务知识模型(BKM)。在DRD中,它表示为一个带有两个剪裁角的框,虚线箭头将其连接到决策。BKM没有传入的实心箭头或信息要求。相反,它的输入是由BKM本身定义的参数。BKM有两个好处:第一,它们允许决策建模者将计算委托给另一个用户,可能具有更多的技术或主题知识,并在模型中使用它。第二,它允许一次定义计算,并在多个决策模型中重复使用。虚线箭头称为知识要求,表示箭头顶部的决策将参数值传递给BKM,然后BKM将其输出值返回给决策。我们说这个决定调用了BKM,就像调用api一样。BKM参数名称通常与调用它们的决策中的变量名称不同。相反,调用是数据映射。
在这里,我们之前以“贷款摊销公式”的名义将BKM保存在我的模型存储库中。在Togeher平台上,我们可以简单地将其引用到DRD上,并用它替换BKM付款计算。BKM定义如下所示,以及BKM描述面板中对其用法的说明。它有三个参数——p、r和n,代表贷款金额、利率和期限内的还款次数——显示在值表达式上方的括号中。值表达式再次是FEEL文本表达式。它只能引用参数。这个公式只是算术——**符号是FEEL的幂运算符——但正如你所看到的,它很复杂。

决策按揭付款通过向参数p、r和n提供值来调用BKM,这些值来自决策本身的输入贷款。为此,我们可以使用文字表达式,但DMN提供了另一种称为调用的盒装表达式类型,它对业务更友好:

在盒装调用中,调用的BKM的名称位于选项卡下方,其下方是一个两列表,BKM参数名称位于第一列,其值表达式位于第二列。请注意,由于“贷款.利率”表示为百分比,因此我们需要将其值除以100才能得到r,这是一个十进制值,而不是百分比。
至此,我们的决策模型已经完成。但我们需要测试它!我们怎么强调都不为过,确保你的决策逻辑运行没有错误并返回预期的结果是多么重要。因此,现在让我们使用下面的输入数据值来执行此操作:

在这里,贷款资格预审返回“可能会被批准”,并且支持决策值看起来很合理。我们可以查看决策表,发现规则8是匹配的。

所以你看,DMN是不是程序员的主题专家可以在他们的日常工作中使用的东西。当然,FEEL表达式可以做的不仅仅是算术,而且与Excel公式一样,该语言包含一长串内置函数,这些函数对文本、数字、日期和时间、数据结构和列表进行操作。我们在之前关于DMN的帖子中已经讨论过很多。但是,学习使用FEEL和盒装表达式的全部功能(您在现实世界的决策建模项目中将需要这些功能)通常需要培训。我们的培训为您提供了所有这些,包括使用Together建模器、大量动手练习、测试您的理解的模型,您需要创建包含某些必需元素的决策模型。实际上,正是在完善认证模型的过程中,培训的细节才最终得以体现。您需要整整60天才能真正了解DMN的功能。
DMN通过让主题专家直接参与解决方案,让您加快价值实现时间。如果您想了解DMN是否适合您,请参加我们的培训。