
现在企业数字化转型越走越深,智能决策系统说白了,就是要既守住合规风控的底线,又能做好用户体验,这两者平衡好了,业务才能稳。很多传统企业早就用Drools规则引擎,搭起了一套成熟的刚性决策逻辑,靠着明确的IF-THEN规则,把业务底线守得牢牢的,不管是合同审核、合规检查,还是客服流程,只要触碰到规则红线,就能精准拦截风险,这也是企业合规治理的核心底气。但说实话,纯靠规则引擎也有短板,而且越到实际应用中越明显:非结构化的文本它读不懂,那些没明确规则的长尾模糊场景它处理不了,输出的结果也冷冰冰的,一点不人性化,跟不上现在复杂多变的业务节奏,也满足不了用户对体验的要求。
而大模型技术的普及,刚好给这个难题提供了实实在在的破局办法。它最厉害的就是能读懂自然语言、能结合上下文推理,还能柔性生成内容,正好补上了规则引擎的短板,不用再死卡规则,能对业务内容做智能解读、优化表述,还能给出合理化建议,把原来冷冰冰的判定,变成了有温度的柔性服务。
现在我们把Drools规则引擎和大模型深度结合,搭一套“硬规则兜底、大模型做柔性处理”的双引擎决策架构:规则引擎管死合规底线,坚决不碰风险;大模型专注优化业务体验,搞定那些柔性场景。今天我们就从Drools的核心组件讲起,结合大模型协同落地,把“规则管底线,大模型管体验”这个实用的企业智能决策方式弄个清楚明白。




维度 | Drools 规则引擎(硬规则) | 大模型(柔性处理) |
|---|---|---|
核心目标 | 合规管控、风险拦截、守住底线 | 体验提升、内容优化、建议生成 |
规则形式 | 明确 IF-THEN 规则,可量化 | 无固定规则,依赖上下文推理 |
结果特性 | 确定性、可解释、零容错 | 灵活性、人性化、可容错 |
典型输出 | “违规,驳回”“合规,通过” | “条款建议优化为 XXX”“回复语气可更温和” |
Drools 规则引擎的核心组件围绕“规则怎么存、数据怎么放、怎么匹配执行”三大核心问题设计,我们可以把 Drools 比作一位企业合规审核员,每个组件对应审核员的工具和工作区域,先通过表格快速建立认知:
核心组件 | 通俗比喻 | 核心职责 |
|---|---|---|
Rule Base(规则库) | 审核员的 “规则手册” | 存储所有已编译的刚性业务规则 |
Fact(事实) | 待审核的 “原始材料” | 待匹配的结构化业务数据(如合同金额、签字状态) |
Working Memory(工作内存) | 审核员的 “工作台” | 临时存放 Fact,供推理引擎匹配规则 |
Inference Engine(推理引擎) | 审核员的 “大脑” | 匹配 Fact 与规则,决定执行哪些规则 |
Agenda(议程) | 审核员的 “待办清单” | 存放匹配成功的规则,按优先级排序等待执行 |
KieSession(KIE 会话) | 审核员的 “一次完整审核流程” | 所有组件协作的入口,封装完整执行生命周期 |
以合同审核为例,组件间的完整协作流程如下:

流程总结:
以合同审核为例,完整执行流程如下

主要步骤说明:
Drools 的核心是“IF-THEN”规则匹配 + 执行,我们用 Python 实现一个轻量化模拟版本:
提供一个 Drools 规则引擎的 REST API 接口,包含可直接运行的服务端代码、详细的规则定义样例(覆盖不同业务场景),主要目的是提供后续的合同审核中实际调用执行;
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Dict, Any, Optional
import uvicorn
# --------------------------
# 1. 数据模型定义(模拟Drools的Fact和Rule)
# --------------------------
# 规则条件模型(模拟DRL的LHS:Left Hand Side 条件部分)
class RuleCondition(BaseModel):
field: str # 匹配的字段名(如amount、has_legal_sign)
operator: str # 运算符(>、<、==、!=、>=、<=)
value: Any # 匹配值
# 规则动作模型(模拟DRL的RHS:Right Hand Side 动作部分)
class RuleAction(BaseModel):
action_type: str # 动作类型(set_field:设置字段,log:日志输出)
field: Optional[str] = None # 要设置的字段名
value: Any # 要设置的值/日志内容
# 规则模型(模拟Drools的Rule定义)
class Rule(BaseModel):
rule_id: str # 规则唯一ID(如CONTRACT_001)
salience: int = 0 # 优先级(数值越高越先执行,模拟Drools的salience)
conditions: List[RuleCondition] # 规则条件(多个条件为AND关系)
actions: List[RuleAction] # 规则动作(按顺序执行)
# 事实模型(模拟Drools的Fact,以合同审核为例)
class ContractFact(BaseModel):
contract_id: str
amount: float # 合同金额
has_legal_sign: bool # 是否有法人签字
has_stamp: bool # 是否盖公章
audit_result: str = "" # 审核结果(初始为空)
violation_reason: str = "" # 违规原因(初始为空)
# --------------------------
# 2. 规则引擎核心类(模拟Drools的推理引擎+Agenda+Working Memory)
# --------------------------
class DroolsSimulator:
def __init__(self):
# 规则库(模拟Rule Base):存储所有规则
self.rule_base: List[Rule] = []
# 工作内存(模拟Working Memory):存储待匹配的Fact
self.working_memory: List[Any] = []
def add_rule(self, rule: Rule):
"""添加规则到规则库"""
self.rule_base.append(rule)
# 按优先级排序(模拟Agenda的冲突解决策略)
self.rule_base.sort(key=lambda x: x.salience, reverse=True)
def insert_fact(self, fact: Any):
"""插入Fact到工作内存"""
self.working_memory.append(fact)
def _match_condition(self, fact: Any, condition: RuleCondition) -> bool:
"""匹配单个规则条件(核心:实现运算符逻辑)"""
# 获取Fact的字段值
fact_value = getattr(fact, condition.field, None)
if fact_value is None:
return False
# 执行运算符匹配
if condition.operator == ">":
return fact_value > condition.value
elif condition.operator == "<":
return fact_value < condition.value
elif condition.operator == "==":
return fact_value == condition.value
elif condition.operator == "!=":
return fact_value != condition.value
elif condition.operator == ">=":
return fact_value >= condition.value
elif condition.operator == "<=":
return fact_value <= condition.value
else:
raise ValueError(f"不支持的运算符:{condition.operator}")
def _match_rule(self, fact: Any, rule: Rule) -> bool:
"""匹配单个规则的所有条件(AND关系)"""
for condition in rule.conditions:
if not self._match_condition(fact, condition):
return False
return True
def _execute_action(self, fact: Any, action: RuleAction):
"""执行规则动作"""
if action.action_type == "set_field":
# 设置Fact字段值(模拟Drools的修改Fact)
setattr(fact, action.field, action.value)
elif action.action_type == "log":
# 日志输出(模拟Drools的控制台输出)
print(f"[规则执行日志] {action.value}")
else:
raise ValueError(f"不支持的动作类型:{action.action_type}")
def fire_all_rules(self) -> List[Any]:
"""触发所有匹配的规则(模拟Drools的fireAllRules)"""
results = []
for fact in self.working_memory:
# 遍历规则库(已按优先级排序)
for rule in self.rule_base:
# 匹配规则
if self._match_rule(fact, rule):
# 执行规则动作
for action in rule.actions:
self._execute_action(fact, action)
results.append(fact)
# 清空工作内存(模拟会话结束)
self.working_memory.clear()
return results
# --------------------------
# 3. FastAPI接口搭建(模拟Drools的REST API)
# --------------------------
app = FastAPI(title="Drools规则引擎模拟器", version="1.0")
# 初始化规则引擎实例
drools_engine = DroolsSimulator()
# --------------------------
# 接口1:添加规则到规则库
# --------------------------
@app.post("/drools/rules/add", summary="添加规则到规则库")
def add_rule(rule: Rule):
try:
drools_engine.add_rule(rule)
return {"code": 200, "msg": f"规则{rule.rule_id}添加成功", "data": rule}
except Exception as e:
raise HTTPException(status_code=500, detail=f"添加规则失败:{str(e)}")
# --------------------------
# 接口2:合同审核规则校验(核心接口)
# --------------------------
@app.post("/drools/contract/check", summary="合同审核规则校验")
def contract_check(fact: ContractFact):
try:
# 插入Fact到工作内存
drools_engine.insert_fact(fact)
# 触发规则执行
result = drools_engine.fire_all_rules()[0]
return {
"code": 200,
"msg": "规则校验完成",
"data": {
"contract_id": result.contract_id,
"audit_result": result.audit_result,
"violation_reason": result.violation_reason,
"original_data": {
"amount": result.amount,
"has_legal_sign": result.has_legal_sign,
"has_stamp": result.has_stamp
}
}
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"规则校验失败:{str(e)}")
# --------------------------
# 接口3:获取规则库所有规则
# --------------------------
@app.get("/drools/rules/list", summary="获取规则库所有规则")
def list_rules():
return {
"code": 200,
"msg": "获取规则列表成功",
"data": [rule.dict() for rule in drools_engine.rule_base]
}
# --------------------------
# 启动服务
# --------------------------
if __name__ == "__main__":
# 启动UVicorn服务,访问地址:http://127.0.0.1:8000/docs 可查看接口文档
uvicorn.run(app, host="0.0.0.0", port=8000)1.3.1 规则样例 1(核心违规规则:CONTRACT_001)
{
"rule_id": "CONTRACT_001",
"salience": 10,
"conditions": [
{"field": "amount", "operator": ">", "value": 1000000},
{"field": "has_legal_sign", "operator": "==", "value": False}
],
"actions": [
{"action_type": "set_field", "field": "audit_result", "value": "驳回"},
{"action_type": "set_field", "field": "violation_reason", "value": "合同金额超100万但无法人签字,违反CONTRACT_001规则"},
{"action_type": "log", "value": "触发规则CONTRACT_001:合同驳回"}
]
}核心要素解析:
1.3.2 规则样例 2(警告类规则:CONTRACT_002)
{
"rule_id": "CONTRACT_002",
"salience": 5,
"conditions": [
{"field": "has_legal_sign", "operator": "==", "value": True},
{"field": "has_stamp", "operator": "==", "value": False}
],
"actions": [
{"action_type": "set_field", "field": "audit_result", "value": "通过(需补章)"},
{"action_type": "set_field", "field": "violation_reason", "value": "合同有法人签字但无公章,需补充公章"},
{"action_type": "log", "value": "触发规则CONTRACT_002:合同需补章"}
]
}设计思路:
1.3.3 规则样例 3(合规规则:CONTRACT_003)
{
"rule_id": "CONTRACT_003",
"salience": 1,
"conditions": [
{"field": "amount", "operator": "<=", "value": 1000000},
{"field": "has_legal_sign", "operator": "==", "value": True},
{"field": "has_stamp", "operator": "==", "value": True}
],
"actions": [
{"action_type": "set_field", "field": "audit_result", "value": "通过"},
{"action_type": "set_field", "field": "violation_reason", ""},
{"action_type": "log", "value": "触发规则CONTRACT_003:合同审核通过"}
]
}设计思路:
启动完成后,通过http://localhost:8000/drools/contract/check接口进行调用;

我们采用的是混元大模型,首先要配置好刚才启动的Drools调用地址DROOLS_API_URL,同时要申请混元大模型的api_key;
import os
import json
import requests
from openai import OpenAI
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
# --------------------------
# 1. 配置项
# --------------------------
# 模拟Drools REST API地址(实际替换为真实Drools服务地址)
DROOLS_API_URL = "http://localhost:8000/drools/contract/check"
# 腾讯混元大模型配置
HUNYUAN_API_KEY = os.getenv("HUNYUAN_API_KEY", "sk-WlJPK********************vZ5NP8Ze")
client = OpenAI(
api_key=HUNYUAN_API_KEY,
base_url="https://api.hunyuan.cloud.tencent.com/v1"
)
# --------------------------
# 2. Drools规则校验函数(模拟+真实接口兼容)
# --------------------------
def drools_contract_check(contract_data):
"""
调用Drools做硬规则校验(兜底)
:param contract_data: 合同结构化数据
:return: 规则校验结果
"""
try:
# 调用真实Drools REST API
response = requests.post(
DROOLS_API_URL,
json=contract_data,
headers={"Content-Type": "application/json"}
)
response.raise_for_status()
return response.json()
except Exception as e:
# 本地模拟规则校验(方便测试)
print(f"Drools接口未部署,使用本地模拟:{e}")
# 核心规则:金额>100万且无法人签字 → 违规
if contract_data["amount"] > 1000000 and not contract_data["has_legal_sign"]:
return {
"pass": False,
"violation_reason": "合同金额超100万但无法人签字,违反合规规则CONTRACT_001",
"rule_id": "CONTRACT_001"
}
else:
return {"pass": True, "violation_reason": "", "rule_id": ""}
# --------------------------
# 3. 大模型柔性处理函数
# --------------------------
def llm_contract_optimize(contract_text, rule_result):
"""
调用大模型做柔性处理(体验优化)
:param contract_text: 合同原始文本
:param rule_result: 规则校验结果
:return: 大模型生成的建议
"""
# 规则违规:仅生成解释+整改建议
if not rule_result["pass"]:
prompt = f"""
请以通俗易懂的语言解释以下合同违规原因,并给出具体整改建议:
违规原因:{rule_result["violation_reason"]}
要求:整改建议可落地,语言简洁。
"""
# 规则合规:优化文本+提示潜在风险
else:
prompt = f"""
请优化以下合同文本,要求:
1. 表述更专业、无歧义,不改变核心权责;
2. 提示潜在的非合规风险(非违规,但需注意);
3. 建议简洁明了,分点列出。
合同文本:{contract_text}
"""
# 调用腾讯混元大模型
try:
completion = client.chat.completions.create(
model="hunyuan-lite",
messages=[
{"role": "system", "content": "你是专业的合同审核顾问,擅长合规解释和文本优化。"},
{"role": "user", "content": prompt}
],
temperature=0.3 # 降低随机性,保证结果稳定
)
return completion.choices[0].message.content
except Exception as e:
return f"大模型处理失败:{str(e)}"
# --------------------------
# 4. 主流程:Drools+大模型融合
# --------------------------
def contract_review_main(contract_data, contract_text):
"""合同审核主流程:先规则,后大模型"""
# 第一步:Drools硬规则校验
print("===== 1. Drools规则引擎校验 =====")
rule_result = drools_contract_check(contract_data)
print(f"规则结果:{rule_result}\n")
# 第二步:大模型柔性处理
print("===== 2. 大模型柔性处理 =====")
llm_result = llm_contract_optimize(contract_text, rule_result)
print(f"大模型建议:{llm_result}\n")
# 第三步:整合最终结果
final_result = {
"rule_check": rule_result,
"llm_suggestion": llm_result,
"final_conclusion": "审核不通过" if not rule_result["pass"] else "审核通过,建议参考优化意见"
}
print("===== 3. 最终审核结果 =====")
print(final_result)
return final_result
# --------------------------
# 5. 测试用例
# --------------------------
if __name__ == "__main__":
# 测试用例1:违规合同(金额150万,无法人签字)
test_contract_data_1 = {
"contract_id": "CON20260213001",
"amount": 1500000,
"has_legal_sign": False,
"parties": ["甲方A", "乙方B"]
}
test_contract_text_1 = """
甲方A与乙方B签订购销合同,合同金额150万元,甲方应在2026年3月1日前支付全款,乙方应在付款后7日内交货。
本合同一式两份,双方各执一份,签字后生效。
"""
contract_review_main(test_contract_data_1, test_contract_text_1)
# 测试用例2:合规合同(金额50万,有法人签字)
print("\n" + "-"*60 + "\n")
test_contract_data_2 = {
"contract_id": "CON20260213002",
"amount": 500000,
"has_legal_sign": True,
"parties": ["甲方C", "乙方D"]
}
test_contract_text_2 = """
甲方C与乙方D签订服务合同,合同金额50万元,甲方应在服务完成后10日内支付费用,乙方应提供6个月的售后保障。
本合同无明确的违约责任条款,双方口头约定如有争议协商解决。
"""
contract_review_main(test_contract_data_2, test_contract_text_2)输出结果:
===== 1. Drools规则引擎校验 ===== Drools接口未部署,使用本地模拟:422 Client Error: Unprocessable Entity for url: http://localhost:8000/drools/contract/check 规则结果:{'pass': False, 'violation_reason': '合同金额超100万但无法人签字,违反合规规则CONTRACT_001', 'rule_id': 'CONTRACT_001'} ===== 2. 大模型柔性处理 ===== 大模型建议:合同违规原因:此合同金额为100万以上,但缺少法定代表人或授权代理人的签字,这违反了公司内部的合规规 定。 整改建议:尽快安排法定代表人或有权机构进行签字确认,确保合同的有效性和合规性。 ===== 3. 最终审核结果 ===== {'rule_check': {'pass': False, 'violation_reason': '合同金额超100万但无法人签字,违反合规规则CONTRACT_001', 'rule_id': 'CONTRACT_001'}, 'llm_suggestion': '合同违规原因:此合同金额为100万以上,但缺少法定代表人或授权代理人的签字,这违反了公司内部的合规规定。\n\n整改建议:尽快安排法定代表人或有权机构进行签字确认,确保合同的有效性和合规性。', 'final_conclusion': '审核不通过'} ------------------------------------------------------------ ===== 1. Drools规则引擎校验 ===== Drools接口未部署,使用本地模拟:422 Client Error: Unprocessable Entity for url: http://localhost:8000/drools/contract/check 规则结果:{'pass': True, 'violation_reason': '', 'rule_id': ''} ===== 2. 大模型柔性处理 ===== 大模型建议:以下是优化后的合同文本: **合同文本优化版**: 甲方C与乙方D签订了一份服务合同,合同总金额为人民币伍拾万元整(¥500,000)。根据合同约定,甲方应在服务完成后的十(10)个工作日内向乙方支付相应的服务费用。同时,乙方承诺提供六(6)个月的售后服务保障。 值得注意的是,本合同中并未明确列出违约责任的条款。为了应对可能出现的争议,双方同意通过友好协商的方式予以解决。尽管此点已在原文中提及,但在此重申以确保双方对此有充分的理解。 此外,建议在合同中增加一条关于违约责任的具体条款,以进一步明确双方在违反合同时应承担的法律责任,从而降低潜在的合规风险。 **潜在非合规风险提示**: 1. **违约责任不明确**:由于原合同中没有明确的违约责任条款,一旦发生争议,双方可能难以迅速定位责任方并采取相应 措施,这可能导致纠纷升级或影响合同的正常履行。 2. **售后服务期限的表述**:虽然合同中提到了乙方应提供六个月的售后保障,但未明确售后服务的内容、范围及具体质量 标准等关键信息。这可能导致在实际履行过程中出现误解或纠纷。 综上所述,建议在后续修改合同时,针对上述风险点进行补充和完善,以确保合同的合法性和有效性。 ===== 3. 最终审核结果 ===== {'rule_check': {'pass': True, 'violation_reason': '', 'rule_id': ''}, 'llm_suggestion': '以下是优化后的合同文 本:\n\n**合同文本优化版**:\n\n甲方C与乙方D签订了一份服务合同,合同总金额为人民币伍拾万元整(¥500,000)。根据合同约定,甲方应在服务完成后的十(10)个工作日内向乙方支付相应的服务费用。同时,乙方承诺提供六(6)个月的售后 服务保障。\n\n值得注意的是,本合同中并未明确列出违约责任的条款。为了应对可能出现的争议,双方同意通过友好协商的方式予以解决。尽管此点已在原文中提及,但在此重申以确保双方对此有充分的理解。\n\n此外,建议在合同中增加一条关于违约责任的具体条款,以进一步明确双方在违反合同时应承担的法律责任,从而降低潜在的合规风险。\n\n**潜在非合规风险提示**:\n\n1. **违约责任不明确**:由于原合同中没有明确的违约责任条款,一旦发生争议,双方可能难以迅速定位责任 方并采取相应措施,这可能导致纠纷升级或影响合同的正常履行。\n\n2. **售后服务期限的表述**:虽然合同中提到了乙方 应提供六个月的售后保障,但未明确售后服务的内容、范围及具体质量标准等关键信息。这可能导致在实际履行过程中出现误解或纠纷。\n\n综上所述,建议在后续修改合同时,针对上述风险点进行补充和完善,以确保合同的合法性和有效性。', 'final_conclusion': '审核通过,建议参考优化意见'}
结果说明:
在大模型出现前,会觉得规则引擎够用就好,靠着明确的 IF-THEN 规则守住底线,就能满足企业合规需求。但接触大模型后,发现纯规则引擎的短板太明显,读不懂非结构化文本、处理不了模糊场景,输出的结果冷冰冰,根本跟不上现在的业务节奏。而大模型的出现,刚好补上了这个缺口,不用死卡规则,能读懂、能推理、能给出人性化建议,把生硬判定变成柔性服务,这才是现在企业真正需要的。规则引擎管死底线,杜绝合规风险,这是根基;大模型优化体验、补齐长尾场景,这是提升,两者结合的双引擎架构,才是企业数字化转型中最实用的方案。
我们了解过程中不要只单独学规则引擎或者大模型,要结合起来学,先吃透 Drools 的核心组件,理解规则匹配的逻辑;再结合大模型的柔性处理能力,重点琢磨两者协同的落地细节。不用追求复杂,先把“规则兜底、大模型补位”的核心逻辑搞懂,再结合实际业务优化,这样下来,会有个递进熟悉的过程,了解的也会比较透彻。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。