AI审批
AI智能体根据参数配置等信息,智能路由决策,智能辅助审批。
核心思想:从“规则驱动”到“语义理解驱动”
- 传统工作流引擎:依赖于预定义的、结构化的规则。例如:“如果报销金额 < 1000元,则自动通过;否则,转交部门经理审批。” 它高效、准确,但僵化,无法处理规则之外的例外情况或需要复杂判断的场景。
- 智能审批(结合大模型):引入大模型的自然语言理解、上下文分析、知识推理和内容生成能力。它可以理解审批内容(如合同条款、报销事由、项目报告)的语义,而不仅仅是结构化的数据字段。
任务AI处理器接口
- 实现AI处理器接口
FlowAiHandler在生产使用根据nodeModel.callAi属性调用智能体进行处理。
java
public interface FlowAiHandler {
default boolean handle(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel) {
// 执行 AI 处理
AiResponse aiResponse = this.execute(flowLongContext, execution, nodeModel);
// 处理 AI 响应
return this.processAiResponse(flowLongContext, execution, nodeModel, aiResponse);
}
/**
* 处理 AI 相应对象逻辑
*
* @param flowLongContext {@link FlowLongContext}
* @param execution {@link Execution}
* @param nodeModel {@link NodeModel}
* @param aiResponse {@link AiResponse}
* @return true 处理成功 false 处理失败
*/
boolean processAiResponse(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel, AiResponse aiResponse);
/**
* 合并 AI 提取的变量到执行参数
*/
default void mergeAiVariables(Execution execution, AiResponse aiResponse, AiConfig aiConfig) {
Map<String, Object> aiVariables = aiResponse.getVariables();
if (null == aiVariables || aiVariables.isEmpty()) {
return;
}
Map<String, Object> args = execution.getArgs();
if (null == args) {
return;
}
// 应用输出映射
Map<String, String> outputMapping = null != aiConfig ? aiConfig.getOutputMapping() : null;
for (Map.Entry<String, Object> entry : aiVariables.entrySet()) {
String key = entry.getKey();
// 如果有映射配置,使用映射后的 key
if (null != outputMapping && outputMapping.containsKey(key)) {
key = outputMapping.get(key);
}
args.put(key, entry.getValue());
}
}
/**
* 执行 AI 处理并返回结构化响应
*
* @param flowLongContext {@link FlowLongContext}
* @param execution {@link Execution}
* @param nodeModel {@link NodeModel}
* @return {@link AiResponse} AI 结构化响应
*/
AiResponse execute(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel);
/**
* AI 智能路由决策:直接返回应该走的分支 NodeKey
*
* @param flowLongContext {@link FlowLongContext}
* @param execution {@link Execution}
* @param nodeModel {@link NodeModel}
* @param args 路由参数内容
* @return 目标分支的 NodeKey,返回 null 表示 AI 无法决策,需走普通条件判断
*/
default String decideRoute(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel, Map<String, Object> args) {
return null;
}
/**
* AI 智能包容分支决策:返回应该同时执行的多个分支 NodeKey 列表
* <p>
* 包容分支与条件分支不同,可以同时执行多个分支
* </p>
*
* @param flowLongContext {@link FlowLongContext}
* @param execution {@link Execution}
* @param nodeModel {@link NodeModel}
* @param args 路由参数内容
* @return 目标分支的 NodeKey 列表,返回 null 或空列表表示 AI 无法决策,需走普通条件判断
*/
default List<String> decideInclusiveRoutes(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel, Map<String, Object> args) {
return null;
}
/**
* 异步回调处理:当 AI 异步处理完成后调用
*
* @param flowLongContext {@link FlowLongContext}
* @param asyncToken 异步处理凭证
* @param aiResponse AI 响应结果
* @return true 恢复流程成功 false 失败
*/
default boolean onAsyncComplete(FlowLongContext flowLongContext, String asyncToken, AiResponse aiResponse) {
return true;
}
}任务AI处理器接口实现
该测AI处理器实现
FlowAiHandler抽象接口,并实现分析响应决策路由。 所在源码位置test.mysql.config.TestAiHandler测试用例。
- 用户体系需自行创建,这里创建一个 AI 智能体处理用户。
java
@Slf4j
public class TestAiHandler implements FlowAiHandler {
// 创建一个 AI 智能体处理用户
public static final FlowCreator aiUser = new FlowCreator("1", "AI 智能体");
@Override
public AiResponse execute(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel) {
AiConfig aiConfig = nodeModel.getAiConfig();
// 1. 构建 Prompt 提示词
if (null != aiConfig) {
System.out.println("AI Prompt Template: " + aiConfig.getPromptTemplate());
}
System.out.println("handle 根据 callAi 识别处理具体逻辑:" + nodeModel.getCallAi());
// 2. 调用 AI 服务(此处为示例实现,实际需对接真实 AI API)
try {
// TODO: 对接实际的 AI 服务,如 OpenAI、Claude、文心一言等
// AiServiceResponse response = aiService.chat(prompt, aiConfig.getModelParams());
// 返回一个模拟的成功响应,包含决策、建议、置信度和指标
return AiResponse.builder()
.status(AiStatus.SUCCESS)
.decision("flk17631709068381")
.advice("AI 审批建议:经分析,该申请符合相关规定,建议通过。")
.confidence(0.95)
.metrics(AiResponse.AiMetrics.builder()
.modelName("default-model")
.promptTokens(100L)
.completionTokens(50L)
.totalTimeMs(500L)
.build())
.build();
} catch (Exception e) {
log.error("AI processing failed: {}", e.getMessage(), e);
return AiResponse.failure("AI 服务调用失败: " + e.getMessage());
}
}
/**
* 处理 AI 响应结果
*/
@Override
public boolean processAiResponse(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel, AiResponse aiResponse) {
if (null == aiResponse) {
return this.handleAiFallback(execution, nodeModel, "AI 处理器返回空响应");
}
AiStatus status = aiResponse.getStatus();
// 1. 处理异步情况
if (aiResponse.isAsync()) {
// 异步模式:流程挂起,等待回调
return true;
}
// 获取 AI 配置
AiConfig aiConfig = nodeModel.getAiConfig();
// 2. 合并 AI 提取的变量到执行参数
this.mergeAiVariables(execution, aiResponse, aiConfig);
// 3. 检查置信度
double confidenceThreshold = 0.8;
if (null != aiConfig) {
confidenceThreshold = aiConfig.getConfidenceThresholdOrDefault();
}
if (aiResponse.getConfidenceOrDefault() < confidenceThreshold) {
return this.handleAiFallback(execution, nodeModel, "AI 置信度低: " + aiResponse.getConfidenceOrDefault() + ", 建议: " + aiResponse.getAdvice());
}
// 4. 根据状态处理
switch (status) {
case SUCCESS:
return this.handleAiSuccess(execution, nodeModel, aiResponse);
case LOW_CONFIDENCE:
case FALLBACK:
case FAILURE:
case TIMEOUT:
return this.handleAiFallback(execution, nodeModel, aiResponse.getErrorMessage());
default:
return true;
}
}
/**
* AI 处理成功
*/
protected boolean handleAiSuccess(Execution execution, NodeModel nodeModel, AiResponse aiResponse) {
// 根据决策结果进行自动审批
List<FlwTask> flwTasks = execution.getFlwTasks();
for (FlwTask ft : flwTasks) {
// 记录 AI 审批意见相关数据到任务变量(用于历史记录)
Map<String, Object> args = execution.getArgs();
if (null != args) {
// 审批意见
if (null != aiResponse.getAdvice()) {
args.put("_ai_advice", aiResponse.getAdvice());
args.put("_ai_decision", aiResponse.getDecision());
args.put("_ai_confidence", aiResponse.getConfidenceOrDefault());
}
// 记录指标数据
if (null != aiResponse.getMetrics()) {
AiResponse.AiMetrics metrics = aiResponse.getMetrics();
args.put("_ai_model", metrics.getModelName());
args.put("_ai_tokens", metrics.getTotalTokens());
args.put("_ai_time_ms", metrics.getTotalTimeMs());
}
}
// AI 建议通过,自动完成任务
if (aiResponse.isPass()) {
execution.getEngine().autoCompleteTask(ft.getId(), args, aiUser);
}
// AI 建议拒绝,自动拒绝任务
if (aiResponse.isReject()) {
execution.getEngine().autoRejectTask(ft, args, aiUser);
}
}
// 其他决策结果,不自动处理,等待人工介入
return true;
}
/**
* AI 降级处理
*/
protected boolean handleAiFallback(Execution execution, NodeModel nodeModel, String reason) {
AiConfig aiConfig = nodeModel.getAiConfig();
if (null == aiConfig) {
return true;
}
String fallbackStrategy = aiConfig.getFallbackStrategyOrDefault();
if (AiFallbackStrategy.MANUAL.eq(fallbackStrategy)) {
return true;
}
// 记录降级原因
Map<String, Object> args = execution.getArgs();
if (null != args) {
args.put("_ai_fallback", true);
args.put("_ai_fallback_reason", reason);
}
List<FlwTask> flwTasks = execution.getFlwTasks();
for (FlwTask ft : flwTasks) {
if (AiFallbackStrategy.DEFAULT_PASS.eq(fallbackStrategy)) {
// 默认通过
execution.getEngine().autoCompleteTask(ft.getId(), args, aiUser);
} else if (AiFallbackStrategy.DEFAULT_REJECT.eq(fallbackStrategy)) {
// 默认拒绝
execution.getEngine().autoRejectTask(ft, args, aiUser);
}
}
return true;
}
@Override
public String decideRoute(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel, Map<String, Object> args) {
// 默认实现:返回 null,表示不由 AI 决定路由
System.out.println("AI Decision: " + args.get("content"));
// 这里模拟决策返回 审批 A 所在分支
return "flk17631709068381";
}
@Override
public List<String> decideInclusiveRoutes(FlowLongContext flowLongContext, Execution execution, NodeModel nodeModel, Map<String, Object> args) {
// 默认实现:返回 null,表示不由 AI 决定包容分支
return null;
}
@Override
public boolean onAsyncComplete(FlowLongContext flowLongContext, String asyncToken, AiResponse aiResponse) {
// 异步回调处理
log.info("AI async complete, token={}, status={}", asyncToken, aiResponse.getStatus());
// TODO: 根据 asyncToken 找到对应的任务,并恢复流程执行
// 1. 根据 asyncToken 查询挂起的任务
// 2. 根据 aiResponse 结果决定是自动完成还是转人工
// 3. 恢复流程执行
return true;
}
}典型应用场景
举例典型的“工作流引擎+大模型”智能审批应用场景,每个场景都包含传统方式的痛点、智能解决方案和核心价值。
场景一:市场活动报销审批(市场部门)
- 传统痛点: 市场活动报销名目繁多(如渠道返佣、KOL合作费、活动场地费),财务人员难以判断每一笔费用的真实性和合理性,通常需要反复与申请人沟通,或要求其上级经理逐一核实,流程长、效率低。
- 智能解决方案:
- 员工提交报销申请,上传发票、合同及活动总结报告。
- 工作流引擎将申请内容(事由、金额)、活动总结报告(文本)、合同/发票(通过OCR识别)一并送入大模型。
- 大模型任务:
- 交叉验证:判断活动总结报告中描述的活动成果(如曝光量、线索数)是否与报销事由逻辑一致。
- 合理性分析:判断费用金额是否与活动规模相匹配(例如,一个小型沙龙会议报销巨额餐饮费则不合理)。
- 风险识别:识别合同中是否存在非常规付款条款。
- 工作流根据大模型的输出(如“置信度高,建议自动通过”、“活动成果与费用关联性弱,建议转市场总监审批”)进行路由。
- 核心价值: 将财务审批从“票据合规性检查”升级为“业务真实性核查”,大幅减少人工核实环节,防范虚假报销。
场景二:研发项目采购申请(技术部门)
- 传统痛点: 技术研发所需的软件、硬件、组件专业性强,采购审批人(如部门经理、采购部)可能不了解其技术必要性和选型合理性,导致审批流于形式或决策缓慢。
- 智能解决方案:
- 工程师提交采购申请,需详细填写采购物品的技术规格、在项目中的具体用途、以及不采购的负面影响。
- 工作流引擎将申请信息与项目立项文档、技术选型报告等上下文一并送入大模型。
- 大模型任务:
- 必要性评估:分析采购物品与项目技术路线的关联性,判断其是否为关键路径上的必需品。
- 选型合理性:对比市场通用方案,评估申请中选择的型号/品牌是否性价比最优。
- 预算符合度:检查该采购是否在项目预算范围内,并推荐正确的预算科目。
- 大模型输出建议,如“该服务器为AI训练关键设备,选型合理,建议快速通过”或“此软件有多个开源替代方案,建议申请人补充说明为何必须采购商业版”,并路由给相应决策人。
- 核心价值: 让技术采购审批变得“内行”,确保资源投入到真正产生价值的地方,优化研发成本。
场景三:人事异动审批(人力资源部门)
- 传统痛点: 员工晋升、调岗、薪酬调整的审批,通常依赖各级主管的主观判断和有限的绩效数据,缺乏对员工历史贡献、技能与目标岗位匹配度的全面、客观分析。
- 智能解决方案:
- 经理提交人事异动申请,说明异动理由。
- 工作流引擎自动关联该员工的历史绩效评估全文、项目贡献记录、技能档案、岗位说明书,并送入大模型。
- 大模型任务:
- 人岗匹配分析:将员工的技能和经验与目标岗位的要求进行深度匹配,给出匹配度分数和优势/差距分析。
- 公平性审查:分析本次异动与团队内其他类似员工的历史处理是否公平一致。
- 风险预警:识别潜在风险,如“该员工刚完成关键项目即调岗,可能对项目收尾产生风险”或“此次加薪幅度远超团队平均水平,需重点关注”。
- 工作流将大模型生成的综合评估报告连同申请一并提交给HRBP和高层领导,辅助其决策。
- 核心价值: 实现数据驱动的、更公平科学的人才决策,提升员工满意度和人才配置效率。
场景四:合规与法务合同审批(法务部门)
- 传统痛点: 法务人员需要审阅大量合同,工作重复、繁重,容易因疲劳而忽略关键风险点。对于非标条款,需要花费大量时间查找法规和内部规定。
- 智能解决方案:
- 业务人员提交合同审批流程,上传合同文件。
- 工作流引擎调用大模型,并为其提供公司的标准合同模板、相关法律法规库、历史诉讼案例作为参考知识。
- 大模型任务:
- 条款比对与差异识别:自动比对送审合同与标准模板,高亮所有修改、新增和删除的条款。
- 风险分级:对识别出的非标条款进行风险评级(高、中、低),并解释风险点(如“责任限制条款可能使公司在极端情况下承受全部损失”)。
- 合规检查:检查合同内容是否符合最新法律法规(如数据隐私法)。
- 生成审阅意见初稿:自动生成包含风险摘要、修改建议和理由的法务审阅意见。
- 法务人员收到的是已经过预审、风险高亮并附有建议草稿的合同,只需进行复核和最终定稿,极大提升效率。
- 核心价值: 将法务人员从重复劳动中解放出来,专注于高价值的风险谈判和策略制定,同时确保合同审查的全面性和一致性。
场景五:IT资源申请审批(IT部门)
- 传统痛点: 员工申请云服务器、数据库、大数据处理等IT资源时,经常出现资源配置过高(造成浪费)或过低(影响业务)的情况。IT管理员难以逐一判断每个申请的实际需求。
- 智能解决方案:
- 员工在ITSM平台提交资源申请单,需描述业务场景、预估访问量、性能要求。
- 工作流引擎将申请信息与该员工/部门的历史资源使用数据一同送入大模型。
- 大模型任务:
- 资源规格推荐:根据业务场景和历史数据,推荐最优的CPU、内存、磁盘和网络配置,避免资源浪费。
- 成本估算与优化:给出不同配置的月度成本,并提出成本优化建议(如使用预留实例)。
- 合理性校验:判断申请规格是否远超其业务场景的合理范围(例如一个内部测试系统申请了生产级的高配置)。
- 大模型输出“推荐配置”和“成本分析”,审批人可以基于此与申请人沟通,或直接按推荐配置审批执行。
- 核心价值: 实现IT资源的精细化和成本化管理,有效控制云资源开支,提升资源使用效率。
场景六:创新项目立项审批(管理层)
- 传统痛点: 创新项目的立项评审依赖PPT和汇报人的口才,缺乏对项目可行性、市场潜力和风险的系统性数据评估,决策风险高。
- 智能解决方案:
- 项目发起人提交立项申请,包括项目计划书、市场分析、竞品分析、财务预测等文档。
- 工作流引擎将所有文档内容,以及通过插件获取的公开市场数据、行业报告摘要,送入大模型。
- 大模型任务:
- 可行性分析:评估项目目标与技术方案、团队能力的匹配度。
- 市场前景评估:分析项目计划书中描述的市场机会与外部数据的吻合度,识别潜在竞争威胁。
- 风险综合识别:从技术、市场、财务、运营等多个维度,系统性地识别和罗列项目潜在风险。
- 生成评审摘要:为评审委员会生成一份结构化的项目摘要,包括核心价值、关键假设、主要风险和推荐决策。
- 管理层在评审会上,可以基于大模型生成的客观、全面的分析报告进行深入讨论和决策。
- 核心价值: 提升战略决策的质量和科学性,降低创新失败率,确保公司将资源投向最有潜力的方向。

