从“填表机器”到“智能决策者”:一场审批流程的静悄悄革命
你是不是也厌倦了那种流程?报销单填了三页,最后卡在“领导出差了”那一栏整整两周;或者是个合同审批,要经过法务、财务、业务、风控八个环节,每个环节都在等上一个人的签字,像个接力赛,但绳子还老是掉地上。
传统的自动化审批,说白了就是“如果-那么”(If-Then)的硬编码逻辑。比如,“如果金额大于5000,则转给总监审批”。这套规则很简单,但也很死板。一旦业务场景稍微复杂一点,比如“金额大于5000且是新客户,或者金额大于10000且是老客户”,规则就变成了一个巨大的、难以维护的蜘蛛网。一旦有一个节点变了,整个流程可能就要重新测试、重新上线。
但今天,我想跟你聊聊一种全新的思路:模型驱动流程控制(Model-Driven Process Control)。这不是说要用模型去替代人,而是用大模型(LLM)作为流程的“大脑”,去理解上下文、判断风险、甚至协调不同角色的人。它让审批流程从“被动执行规则”变成了“主动理解意图”。
一、 为什么传统规则引擎搞不定复杂审批?
在深入“怎么做”之前,我们先要搞清楚“为什么传统方法不行了”。这不是为了贬低老技术,而是为了让你看清新技术的价值。
1.1 规则爆炸:当条件超过10个,人就疯了
想象一下,一个跨国公司的采购审批流程。判断一个订单是否需要CEO审批,可能涉及以下维度:
- 金额大小
- 供应商是否为新供应商
- 商品类别(是否含敏感物资)
- 采购地点(是否涉及制裁地区)
- 申请部门的历史合规记录
- 当前财政季度预算剩余情况
- …
如果用传统的规则引擎(如Drools、Camunda的规则集),你需要写几百行甚至上千行if-else或决策表。一旦业务政策调整,比如“新供应商的审批门槛从1万降到5千”,你需要找到代码里对应的那一行,改完,测试,上线。更可怕的是,这些规则之间往往存在冲突,A规则说“要审”,B规则说“不用审”,最后系统到底听谁的?这需要专人维护,成本极高。
1.2 非结构化数据的盲区
传统流程系统只能处理结构化数据:数字、日期、下拉菜单选项。但真实的商业世界里,大量信息是非结构化的。
- 合同条款:法务要看合同里的赔偿条款是否公平。
- 报销事由:财务要看发票背后的业务真实性,比如“业务招待费”到底是请客户吃饭还是私人聚会。
- 邮件沟通记录:业务背景可能分散在几十封邮件里。
传统系统对这些内容视而不见,只能依赖人工阅读后手动输入结论。这不仅慢,而且容易出错。大模型的核心优势,恰恰在于它能“读懂”这些文本,理解语义,提取关键信息。
1.3 缺乏上下文理解与灵活判断
规则引擎是确定性的:输入A,永远输出B。但审批往往需要概率性和情境化的判断。
举个例子:一个员工申请报销5000元的“客户招待费”。
- 传统规则:金额>5000,自动转总监审批。简单粗暴。
- 模型驱动:大模型会结合上下文——这个员工上周刚去过上海见一个重要客户,发票抬头是一家高档餐厅,且金额与常规招待标准相符。模型可能判断风险低,建议快速通过,甚至只转给直属主管确认即可。反之,如果同一员工一个月报了三次高档餐厅,且时间间隔很近,模型可能会标记为“可疑”,建议人工深度审核。
这种“看人下菜碟”、“见机行事”的能力,是规则引擎无法做到的。
1.4 真实案例:某中型电商公司的痛点
让我给你讲一个真实的场景。我朋友所在的一家中型电商平台,每年的“618”大促前,都会迎来一波密集的采购申请。
他们的旧流程是:
- 采购员在OA系统提交申请,填写SKU、数量、预估金额。
- 系统根据金额自动分流:小于1万走主管审批,1-10万走总监审批,大于10万走VP审批。
- 审批人打开申请,看到一堆数字,点“同意”或“拒绝”。
问题出在哪?
- 信息孤岛:采购员只填了SKU,但没说明这个SKU是否已经是“爆款”,库存是否积压,供应商是否有过延期记录。审批人只能凭经验或临时去查ERP,效率极低。
- 规则僵化:有一次,一个部门申请采购一批“节日礼品”,金额只有8000元,按规则主管审批即可。但这批礼品是送给政府监管机构的,按公司合规政策,必须法务+合规双审。因为规则里没写“监管机构礼品”这个条件,流程走了主管审批就结束,结果后来被审计部通报批评。
- 人情世故:有些审批人因为忙着项目,看到申请就随手点同意,根本没细看。
这就是典型“规则驱动”的局限:它只能处理“有形的、量化的”规则,处理不了“无形的、语义的”规则。
二、 什么是模型驱动流程控制?
别被这个名字吓到。简单来说,模型驱动流程控制 = 传统工作流引擎 + 大模型作为“智能决策节点”。
2.1 核心概念拆解
我们可以把这个架构想象成一个“智能路由器”:
- 工作流引擎(骨架):这是传统部分,负责流程的编排、状态管理、任务分发。比如:谁在什么时候该做什么事。常用的有Camunda、Flowable、自研的工作流引擎。
- 大模型(大脑):这是新增的部分。在工作流的某个节点,插入一个“AI决策点”。这个点不直接做决定,而是分析输入信息,给出建议、提取关键要素、或判断风险等级,然后把这个“建议”传递给下一个环节。
- 人类审批人(最终裁决者):当AI的判断置信度不够高,或者规则要求必须人工介入时,任务会流转给人。但此时,人看到的不再是干巴巴的数据,而是AI已经整理好的“摘要”和“风险提示”。
2.2 与RPA和传统自动化的区别
- RPA(机器人流程自动化):RPA是“模仿人的点击”,它只能执行预设的操作,比如打开网页、复制粘贴数据。它不懂内容。
- 传统自动化:基于规则,执行逻辑明确的任务。
- 模型驱动:基于语义理解,能够处理模糊、非结构化的信息,并能进行推理和判断。
打个比方:
- RPA是一个手脚,能快速执行重复动作。
- 传统自动化是一个裁判,严格按规则吹哨。
- 模型驱动流程控制是一个经验丰富的助理,它能看懂规则背后的意图,辅助裁判做出更合理的判断。
三、 架构设计:如何搭建一个模型驱动的审批系统?
这是最核心的部分。我不会只给你画架构图,我会带你一步步拆解每个模块的实现逻辑。
3.1 整体架构图解
一个典型的模型驱动审批系统,包含以下层次:
[用户层] 员工/管理者 -----> [前端应用] (OA/钉钉/飞书/企微)
|
v
[网关层] API Gateway (权限校验/流量控制)
|
v
[应用层] 审批业务服务 (订单查询/库存查询/合同管理)
| | |
v v v
[模型服务层] LLM Agent (大模型调用/意图识别/信息提取/风险研判)
| | |
v v v
[流程引擎层] Workflow Engine (Camunda/Flowable/自研)
| | |
v v v
[数据层] 业务DB + 向量数据库(存放历史案例/政策文档) + LLM API
3.2 关键模块详解
3.2.1 流程引擎:如何嵌入AI节点?
传统的工作流引擎支持“用户任务”(User Task)和“服务任务”(Service Task)。模型驱动的核心,就是把服务任务升级为AI服务任务。
在Camunda或Flowable中,你可以定义一个自定义的ServiceTask,其实现类里调用大模型API。
示例:如何在流程中插入一个AI节点
假设你的流程是:提交申请 -> AI初审 -> 主管审批 -> 财务复核 -> 完成
# Camunda BPMN XML 片段示意
<process id="reimbursement-process">
<startEvent id="start" />
<sequenceFlow id="flow1" sourceRef="start" targetRef="ai-review" />
<!-- 新增的AI决策节点 -->
<serviceTask id="ai-review" name="AI智能初审"
camunda:class="com.example.ai.AiReviewService" />
<sequenceFlow id="flow2" sourceRef="ai-review" targetRef="manager-approval" />
<userTask id="manager-approval" name="主管审批" />
<!-- ... 后续流程 -->
</process>
这里的AiReviewService就是你要编写的Java/Python代码,它负责:
- 获取当前任务的数据(申请金额、类型、附件等)。
- 调用大模型进行分析和决策。
- 将结果写回到流程变量,或者直接完成该节点,流转给下一个任务,并附带AI的建议。
3.2.2 LLM Agent:大模型如何“思考”?
这是最精彩的部分。大模型不是直接告诉你“通过”或“拒绝”,而是作为一个Agent(智能体),通过“思维链”(Chain of Thought)来工作。
Prompt工程(提示词设计)是关键
你需要设计一个精心构造的Prompt,让大模型扮演一个“风控专家”的角色。
# Python伪代码:AI审核服务的核心逻辑
def ai_review_service(task_data):
context = build_context(task_data)
prompt = f"""
你是一个资深的风控专家。请分析以下报销申请,判断其风险等级,并给出审批建议。
【申请信息】
- 申请人:{task_data.applicant}
- 部门:{task_data.department}
- 金额:{task_data.amount} 元
- 费用类型:{task_data.category}
- 发票摘要:{task_data.invoice_summary}
- 历史记录:{task_data.history_summary}
【公司政策摘要】
- 业务招待费:人均不得超过500元。
- 差旅费:需有出差审批单。
- 新供应商采购:需额外合规审核。
【分析要求】
1. 请逐步推理:首先检查金额是否超标,其次检查凭证是否齐全,最后结合历史行为判断异常。
2. 输出JSON格式的结果:
{{
"risk_level": "low|medium|high",
"suggestion": "approve|reject|escalate_to_finance|escalate_to_legal",
"reasoning": "简要说明原因",
"highlight_items": ["需要关注的异常点1", "异常点2"]
}}
只输出JSON,不要有多余文字。
"""
response = llm_client.chat.completions.create(
model="gpt-4", # 或国内的大模型如通义千问、文心一言
messages=[{"role": "user", "content": prompt}],
temperature=0.1 # 低温度,保证输出稳定
)
result = json.loads(response.choices[0].message.content)
return result
关键点解析:
- 思维链(CoT):要求模型“逐步推理”,这能显著提高准确率,避免幻觉。
- 结构化输出:强制输出JSON,方便后续流程引擎解析和路由。
- 上下文注入:将公司政策、历史记录等关键信息作为Prompt的一部分传给模型,让模型“有据可依”。
3.2.3 向量数据库:让模型“记住”公司政策
大模型本身并不知道你公司的具体政策。你需要把公司的《员工手册》、《财务制度》、《合规指南》等文档,切碎、向量化,存入向量数据库(如Milvus、Pinecone、向量版的ES)。
当AI审核一个申请时,它首先会根据申请内容,从向量数据库中检索出相关的政策条款,然后把这些条款作为上下文喂给大模型。
检索示例:
from langchain.vectorstores import Milvus
from langchain.embeddings import OpenAIEmbeddings
# 假设你已经把政策文档入库
def get_relevant_policies(query):
vector_db = Milvus(
embedding_function=OpenAIEmbeddings(),
collection_name="company_policies"
)
# 搜索与当前报销类型最相关的政策条款
relevant_docs = vector_db.similarity_search(query, k=3)
return "\n".join([doc.page_content for doc in relevant_docs])
这样,模型就能“引用”具体的制度条款来支持它的判断,而不是凭空捏造。
3.3 人机协作:当AI不够自信时
AI不会100%准确。因此,流程设计必须考虑人机协作的边界。
置信度阈值机制:
- 高置信度(>90%):AI可以直接做出决定,流程自动流转到“完成”或“归档”,人工只需查看日志。
- 中置信度(60%-90%):AI给出“建议”,但任务仍流转给人工审批人。在审批页面,AI的建议会以醒目的方式展示,供人参考。
- 低置信度(<60%):AI标记为“异常”,强制流转给更高级别的审批人或专门的审核团队。
示例:前端如何展示AI建议
在主管的审批界面,除了传统的“同意/拒绝”按钮,增加一个AI辅助面板:
<!-- 简化版前端代码 -->
<div class="ai-assistant-panel">
<h3>🤖 AI 智能建议</h3>
<p><strong>风险等级:</strong> <span class="badge-low">低风险</span></p>
<p><strong>建议操作:</strong> 建议批准</p>
<p><strong>分析依据:</strong></p>
<ul>
<li>金额 480元,未超过部门月度预算。</li>
<li>该员工近6个月无违规报销记录。</li>
<li>发票内容清晰,符合业务招待费标准。</li>
</ul>
<p><strong>关联政策:</strong> 《财务制度》第3.2条</p>
</div>
<div class="approval-actions">
<button>同意</button>
<button>拒绝</button>
<button>退回修改</button>
</div>
这样,主管只需看一眼AI的分析,心里有底了,再点“同意”,既高效又放心。
四、 真实落地场景:以“复杂合同审批”为例
光说理论不够,我们来一个完整的、端到端的落地案例。假设你们公司需要审批一份新的供应商合同。
4.1 业务流程定义
传统合同审批流程可能长达10个节点,耗时2周。 模型驱动后的流程:
- 提交申请:采购员上传合同PDF,填写关键信息(对方公司名、金额、合同期限等)。
- AI预处理(自动):
- OCR识别合同文本。
- NLP提取关键条款(违约责任、付款周期、保密协议等)。
- 自动比对历史合同模板,标记出“非标条款”。
- AI风险评估(自动):
- 调用大模型,结合供应商背景(通过天眼查/企查查API查询)和合同条款,评估法律风险和财务风险。
- 输出风险报告。
- 智能路由(自动):
- 如果风险低且条款标准:直接流转到法务快速通道(1人审批)。
- 如果存在非标条款:流转到法务+财务联合审批。
- 如果风险极高(如对方公司是高风险国家):流转到CEO审批。
- 人工审批:法务/财务收到任务时,页面上已经展示了AI生成的“合同摘要”和“风险高亮”,他们只需关注AI标记出的问题点。
- 归档与学习:审批结果和人工修改意见,被记录到向量数据库,用于优化未来的AI模型。
4.2 代码实现细节
4.2.1 合同信息提取(OCR + NLP)
import pytesseract
from transformers import pipeline
# 步骤1:OCR识别PDF
def extract_text_from_contract(pdf_path):
# 使用pdfplumber或PyMuPDF读取PDF,然后OCR
# 这里简化为直接获取文本
text = read_pdf_text(pdf_path)
return text
# 步骤2:使用NER模型提取关键实体
def extract_contract_entities(text):
# 使用预训练的NER模型,或者微调的大模型
ner_pipeline = pipeline("ner", model="your-contract-ner-model")
entities = ner_pipeline(text)
# 过滤出我们关心的实体:公司名、金额、日期
companies = [e for e in entities if e['entity'] in ['ORG', 'COMPANY']]
amounts = [e for e in entities if '金额' in e['word']]
dates = [e for e in entities if '日期' in e['word']]
return {
"companies": companies,
"amounts": amounts,
"dates": dates
}
4.2.2 AI风险评估Prompt
”`python def
