企业决策系统真正困难的部分,往往不是执行一条规则,而是让业务人员能写、技术人员能审、测试人员能验,并且在发布后还能追溯每次结果。伏羲智能决策平台第一版尝试把这条链路打通:用户用自然语言描述业务规则,LLM 智能体生成结构化 DSL,系统经过多层校验后编译为标准 DMN 1.5 XML,再进入版本管理、业务验收、发布运行和数据分析流程。
自然语言不是最终规则,而是建模入口
让业务人员直接描述“年龄大于 18 岁且风险等级不高时允许开户”,确实能降低 DMN、FEEL 和内部 DSL 的学习成本。但在企业环境中,自然语言存在歧义,不能直接成为生产执行依据。
更可靠的链路应当分成几个阶段:
- 提取业务概念:识别输入字段、输出字段、数据类型和枚举范围。
- 生成结构化 DSL:把自然语言转换成可解析、可比较的中间表示。
- 执行多层校验:检查语法、类型、规则覆盖、冲突和不可达分支。
- 编译为 DMN 1.5 XML:形成可交换、可审计的标准产物。
- 由业务人员验收:通过代表性案例确认规则含义,而不是只确认文件能编译。
这里最重要的边界是:LLM 负责提高建模效率,结构化校验和验收流程负责决定规则能否进入生产。模型生成成功,不等于业务规则正确。
为什么要以 DSL 和 DMN 作为双层契约
结构化 DSL 适合平台内部协作。它比 XML 更易阅读,也方便计算差异、做静态检查和生成测试用例。DMN 1.5 XML 则适合作为标准化交付物,可用于系统集成、归档和跨引擎交换。
这两层表示解决的是不同问题:
- DSL 面向建模、审阅和平台内部演进。
- DMN 面向标准兼容、部署和外部交换。
- 自然语言保留业务意图,但不承担精确执行语义。
- 验收案例连接业务语言与机器执行结果。
全栈 Rust 实现也与这类平台的需求契合。解析、校验、编译和运行时都需要明确的数据结构与错误边界,Rust 的类型系统可以让不少字段缺失、枚举非法和状态迁移错误提前暴露。不过,语言本身并不会自动保证业务语义正确,决策表的重叠规则、空值处理和命中策略仍需要专门验证。
可以这样实践一条最小决策流水线
下面是假设性的 API 示例,用于展示自然语言建模、校验、验收和发布之间应如何衔接;端点名称和响应字段需要按实际部署调整。运行前设置平台地址和访问令牌,并确保本机安装了 curl 与 jq。
export FUXI_URL="http://localhost:8080"
export FUXI_TOKEN="replace-with-your-token"
# 1. 用业务语言创建草稿
DRAFT_ID=$(curl -fsS "$FUXI_URL/api/decisions" \
-H "Authorization: Bearer $FUXI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "account-opening-eligibility",
"description": "客户年龄至少为 18 岁,并且风险等级不是 high 时允许开户;其他情况拒绝。"
}' | jq -r '.id')
# 2. 触发结构化生成和校验
curl -fsS -X POST \
"$FUXI_URL/api/decisions/$DRAFT_ID/validate" \
-H "Authorization: Bearer $FUXI_TOKEN" | jq
# 3. 提交业务验收案例
curl -fsS -X POST \
"$FUXI_URL/api/decisions/$DRAFT_ID/acceptance-tests" \
-H "Authorization: Bearer $FUXI_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"cases": [
{"input": {"age": 22, "risk": "low"}, "expected": {"eligible": true}},
{"input": {"age": 17, "risk": "low"}, "expected": {"eligible": false}},
{"input": {"age": 35, "risk": "high"}, "expected": {"eligible": false}}
]
}' | jq
# 4. 仅在校验和验收通过后发布指定版本
curl -fsS -X POST \
"$FUXI_URL/api/decisions/$DRAFT_ID/releases" \
-H "Authorization: Bearer $FUXI_TOKEN" \
-H "Content-Type: application/json" \
-d '{"version": "1.0.0", "format": "dmn-1.5"}' | jq
这段流程体现了一个关键设计:发布操作应引用不可变版本,而不是悄悄使用“最新草稿”。验收案例也应与版本一起保存,否则规则更新后,很难证明某个历史版本当时通过了哪些业务场景。
实际项目还应补充边界案例,例如字段缺失、未知风险等级、年龄为负数,以及年龄恰好等于 18。对于命中策略为 FIRST、UNIQUE 或 COLLECT 的决策表,还要分别检测规则顺序、重复命中和聚合行为。
版本、验收与分析必须形成闭环
决策平台上线后,每次执行至少应记录决策标识、版本号、时间、命中规则和结果。输入数据是否完整留存,则需要根据隐私和合规要求决定。身份证号、收入、医疗信息等敏感字段不应直接进入普通分析日志,可以使用脱敏、哈希或字段白名单。
数据分析的价值不仅是统计调用量,还包括发现规则问题:
- 某条规则长期从未命中,可能是条件不可达。
- 拒绝率在新版本发布后突然上升,可能存在规则回归。
- 大量请求落入默认分支,可能说明输入模型或规则覆盖不足。
- 相同输入在不同版本得到不同结果,需要能够解释具体差异。
因此,版本管理不能只保存一份 DMN XML。更完整的版本快照应包含原始业务描述、生成后的 DSL、校验结果、验收案例、DMN 产物、审批记录和发布状态。
上线前应守住的边界
引入这类平台时,可以从规则稳定、输入明确、结果容易验证的场景开始,例如资格判断、费率分档或工单路由。涉及授信、医疗和合规处罚等高风险决策时,应增加人工审批、双人复核、回滚和审计要求。
上线检查可以压缩为五项:规则是否消除歧义,类型与命中策略是否明确,边界案例是否通过,发布版本是否不可变,运行日志是否兼顾可解释性与隐私。只有自然语言、结构化规则、标准 DMN、验收证据和运行数据能够相互对应,决策自动化才真正具备企业级可维护性。