尧图精选

AI流程管理系统落地实践:从大模型到业务执行的架构设计与工程避坑

🕒 发布时间:2026/10/2 11:15:13 📁 来源:尧图网络
1. 从模型很聪明到流程真能跑AI流程管理系统的核心命题很多团队在2024年前后都经历过这样一个阶段花了几周时间把大模型跑起来Demo演示时效果惊艳领导点头、同事鼓掌然后……就没有然后了。模型躺在服务器里业务部门该填的表还在填该走的审批还在走AI和真实业务之间隔着一道看不见的墙。这道墙的本质是大模型的能力边界与业务流程的执行需求之间存在结构性错位。大模型擅长理解、生成、推理但它不擅长记住这个审批单已经流转到第几级、不擅长保证金额超过5万必须走财务总监节点、更不擅长在流程卡住时主动催办。而流程管理系统恰恰相反——它精于状态机、权限、节点流转但对非结构化输入一段自然语言描述、一张模糊的发票照片、一封语焉不详的邮件几乎无能为力。AI流程管理系统要解决的就是把这两者的能力拼接起来让大模型做它擅长的语义理解和决策建议让流程引擎做它擅长的状态管理和执行约束。听起来简单但真正落地时会发现难点根本不在调通API而在于一系列工程细节——意图识别准确率不够怎么办、模型输出格式不稳定怎么兜底、流程节点如何与模型调用解耦、人工介入的时机怎么设计、成本怎么控制。这篇文章面向的是正在或即将把大模型接入业务流程的技术负责人、全栈工程师和产品经理。我会从架构分层、模型选型、意图路由、执行引擎、人工兜底、成本优化六个维度把从大模型到业务执行这条链路拆开讲清楚。不堆概念只讲能落地的方案和踩过的坑。2. 架构分层为什么不能把大模型直接塞进流程引擎2.1 直接集成的三种典型翻车方式我见过不少团队的第一版方案是这样的在流程引擎的某个节点里直接写一段代码调用大模型API拿到返回结果后解析JSON然后决定下一个节点走哪里。这种直连方式在Demo阶段跑得通但上线后几乎必然出问题而且问题往往以三种形式出现。第一种是超时拖垮流程。大模型API的响应时间波动很大快的时候1-2秒慢的时候十几秒甚至超时。如果流程引擎的节点是同步等待模型返回一个慢请求就会把整个流程实例卡住。更糟的是如果流程引擎用的是数据库行锁来保证状态一致性这个锁会被一直持有其他流程实例也跟着排队。第二种是输出格式漂移。你今天让模型返回{action: approve}它老老实实返回了。明天换个输入它可能返回{action: approve, reason: ...}或者干脆用自然语言说我认为应该批准。流程引擎的解析代码一旦遇到非预期格式要么抛异常要么静默走错分支——后者更危险。第三种是状态不一致。模型调用成功了但流程引擎在写状态时失败了或者流程引擎写成功了但模型调用其实超时了只是客户端没正确处理。这种不一致在分布式环境下会被放大最终导致模型以为批了、流程以为没批的诡异状态。2.2 推荐的四层架构经过多个项目的迭代我目前比较推荐的架构是四层分离层级职责关键技术选型接入层接收业务请求、鉴权、限流API Gateway 令牌桶智能层意图识别、实体抽取、决策建议大模型 规则引擎编排层流程定义、状态管理、节点路由状态机引擎如Temporal、Camunda执行层具体业务动作发通知、写库、调外部系统消息队列 Worker这个分层的核心思想是智能层和执行层通过编排层解耦智能层的输出不是直接执行指令而是带置信度的建议。编排层根据建议和预设规则决定是否执行、是否需要人工确认。举个例子。用户提交一段自然语言帮我申请下周三到周五的差旅去上海预算大概3000。接入层收到请求后智能层做三件事识别意图是差旅申请抽取实体时间、地点、预算然后输出一个结构化建议{ intent: travel_request, confidence: 0.92, entities: { start_date: 2025-01-15, end_date: 2025-01-17, destination: 上海, budget: 3000 }, suggested_action: create_travel_flow }编排层拿到这个建议后先检查置信度是否超过阈值比如0.85再检查预算是否超过某个金额需要额外审批然后才决定是直接创建流程还是转人工确认。执行层只负责在流程节点被触发时执行具体动作完全不关心这个节点是被模型触发的还是被人手动触发的。2.3 为什么状态机比工作流引擎更适合AI场景传统工作流引擎如Activiti的设计假设是流程路径在定义时就基本确定运行时只是按图走。但AI流程管理系统的特点是部分路径是运行时动态决定的——模型可能建议走A分支也可能建议走B分支甚至可能建议创建一个原本不存在的节点。这种情况下轻量级状态机如Temporal的Workflow比传统BPMN引擎更合适。状态机的优势在于状态转换是显式定义的每次转换都可以附带条件判断和副作用而且状态机天然支持等待外部事件——比如等待人工确认、等待模型异步返回——不会阻塞线程。注意如果你的团队已经在用Camunda这类引擎不必强行替换。可以在引擎的Service Task里调用智能层把模型输出作为流程变量然后用网关节点做条件路由。关键是不要让模型调用出现在网关的条件表达式里而是提前算好。3. 模型选型不是越大越好而是越稳越好3.1 流程场景对模型的真实需求很多团队选模型时的第一反应是用最强的但在流程管理场景里这个思路往往是错的。流程场景对模型的需求和聊天场景完全不同输出稳定性 创造力流程需要的是可预测的结构化输出不是天马行空的回答。一个7B的微调模型如果输出格式稳定比一个70B的通用模型更合适。延迟敏感流程节点等待模型返回的时间直接影响用户体验。P99延迟超过5秒的模型在交互式流程里基本不可用。成本可控流程调用是高频的一次差旅申请可能触发3-5次模型调用。如果每次调用成本0.1元一天1000个流程就是300-500元一个月就是上万元。数据合规很多企业的流程数据涉及内部信息不能随便发到外部API。3.2 三种部署模式的取舍目前主流的部署模式有三种各有适用场景模式一公有云API适合快速验证和低频场景。优点是开箱即用、模型能力强缺点是数据出域、成本随调用量线性增长、延迟不可控。如果只是做POC或者流程量很小每天几百次这是最省事的选择。模式二私有化部署开源模型适合数据敏感、调用量大的场景。目前7B-14B级别的开源模型如Qwen2.5-7B、Llama3.1-8B在意图识别和实体抽取任务上经过少量微调后可以达到接近GPT-4的水平。部署工具方面Ollama适合快速验证vLLM适合生产环境的高并发推理。这里有个经验数据在意图分类任务上一个用2000条标注数据微调过的Qwen2.5-7B准确率通常能到92%-95%而GPT-4零样本大概是88%-91%。微调后的7B模型不仅更准而且延迟从2秒降到200毫秒成本从每次0.05元降到几乎为零只算电费。模式三混合模式这是我最推荐的方案。高频、简单的任务意图分类、实体抽取用本地小模型低频、复杂的任务长文档理解、多轮推理用云端大模型。比如用户提交一段自然语言申请先用本地7B模型做意图识别和实体抽取如果置信度低于阈值再调用云端大模型做二次判断。3.3 微调还是提示工程这是被问得最多的问题。我的判断标准很简单如果任务可以用明确的规则描述清楚比如抽取所有日期和金额优先用提示工程 输出格式约束如JSON Schema、Function Calling。如果任务需要领域知识比如判断这个报销单是否符合公司差旅政策且你有至少500条标注数据考虑微调。如果任务需要多步推理且规则难以枚举先用提示工程 Few-shot效果不够再考虑微调。微调的技术路线目前比较成熟的是LoRA/QLoRA用一张24G显存的卡就能微调7B模型。数据格式建议用instruction/input/output三元组输出部分严格遵循你期望的JSON结构。训练时注意把loss计算限制在output部分不要让模型去学input的分布。实操心得微调数据里一定要包含负样本——即那些看起来像目标意图但实际不是的样本。比如帮我查一下上次去上海的差旅报销到哪了这看起来像差旅申请实际是查询。没有负样本的微调模型会把所有相关输入都分类成目标意图导致流程误触发。4. 意图路由与实体抽取让模型输出可执行的结构4.1 从自然语言到流程指令的转换链路用户输入的自然语言和流程引擎需要的结构化指令之间隔着三层转换第一层是意图识别判断用户想干什么。是申请、查询、审批、还是取消这一步的输出是一个分类标签。第二层是实体抽取从文本里提取关键参数。时间、金额、人员、地点、事由。这一步的输出是一个键值对集合。第三层是指令映射把意图和实体映射成流程引擎能理解的指令。比如intenttravel_requestentities{...}映射成createProcess(travel_approval, params)。这三层可以一次性让模型输出也可以分步做。一次性输出的优点是延迟低缺点是错误会累积分步做的优点是每步可校验、可兜底缺点是延迟高。我的建议是如果模型能力足够7B以上微调过一次性输出如果用的是小模型或零样本分步做。4.2 输出格式约束的四种手段让模型稳定输出JSON有四种手段按可靠性从低到高排列手段一提示词里写请输出JSON。可靠性最低模型经常会在JSON前后加解释文字。手段二Few-shot示例。给2-3个输入输出示例可靠性中等。适合简单任务。手段三JSON Schema约束。用支持结构化输出的API如OpenAI的response_format、vLLM的guided_json可靠性高。这是目前最推荐的方式。手段四后处理 重试。无论用哪种方式都要加一层后处理用正则提取JSON块用json.loads解析失败则重试或降级。这是最后的兜底。import json import re def parse_model_output(text): # 尝试直接解析 try: return json.loads(text) except json.JSONDecodeError: pass # 尝试提取JSON块 match re.search(r\{.*\}, text, re.DOTALL) if match: try: return json.loads(match.group()) except json.JSONDecodeError: pass # 降级返回None触发人工处理 return None4.3 置信度阈值与路由策略模型输出的置信度如果是分类任务通常是softmax概率如果是生成任务可以用logprob或让模型自评是决定路由的关键。我的经验阈值是置信度 0.9直接执行无需人工确认。0.7 置信度 ≤ 0.9执行但标记异步人工复核。置信度 ≤ 0.7转人工处理模型输出作为参考。这个阈值不是拍脑袋定的而是根据业务容错率反推的。如果错误执行的代价很高比如错误批准了一笔大额付款阈值要调高到0.95甚至0.98如果错误执行的代价只是多走一步人工确认阈值可以降到0.6。注意置信度校准是个坑。很多模型的softmax概率是过度自信的——它说0.95实际准确率可能只有0.8。上线前一定要用验证集做校准画出可靠性曲线必要时用温度缩放Temperature Scaling重新校准。5. 执行引擎流程节点如何与模型调用解耦5.1 异步调用与状态回写流程引擎调用模型时最忌讳同步阻塞。正确的做法是流程节点触发时向消息队列发一条模型调用请求然后流程实例进入等待状态模型调用完成后向流程引擎发一个回调事件流程实例被唤醒继续执行。这种异步模式的好处是流程引擎不会因为模型慢而卡住模型调用可以重试而不影响流程状态多个流程实例可以并发等待不占用线程。具体实现上如果用Temporal可以用Workflow.await()等待一个信号如果用Camunda可以用External Task模式模型调用方作为外部Worker完成后调用complete接口。5.2 幂等性与重试模型调用可能失败超时、限流、网络抖动必须支持重试。但重试带来一个问题如果第一次调用其实成功了只是响应没收到重试会导致重复执行。解决方案是幂等键每次模型调用请求带一个唯一ID比如flowInstanceId nodeId attempt模型服务端记录已处理的ID重复请求直接返回缓存结果。流程引擎侧也要保证同一个节点的执行结果只被消费一次。# 伪代码带幂等键的模型调用 def call_model_with_idempotency(request_id, payload): # 检查是否已处理 cached redis.get(fmodel_result:{request_id}) if cached: return json.loads(cached) # 调用模型 result model_client.invoke(payload) # 缓存结果设置过期时间 redis.setex(fmodel_result:{request_id}, 3600, json.dumps(result)) return result5.3 人工介入节点的设计AI流程管理系统里人工介入不是异常处理而是流程的正常组成部分。设计时要考虑三个问题什么时候介入置信度低、金额超限、涉及敏感操作如删除、付款、模型明确表示不确定。介入时看到什么不能只给人工一个请处理的空白页。要把模型的原输入、模型输出、置信度、建议动作都展示出来人工只需要做确认/修改/拒绝三选一。介入后怎么回流人工的修改结果要作为反馈数据存下来用于后续的模型迭代。这是持续优化的关键——没有反馈闭环的AI流程系统准确率会一直停在初始水平。6. 成本与延迟优化让系统跑得久、跑得省6.1 缓存策略流程场景里很多模型调用是重复的。比如差旅申请的意图识别用户输入千变万化但意图标签就那几个。可以对意图识别结果做语义缓存把用户输入向量化在向量库里查相似度超过0.95的历史请求直接复用其意图标签。实体抽取的缓存更直接如果两个请求的文本高度相似编辑距离小于阈值实体大概率相同。但要注意时间、金额这类实体可能变化缓存时要排除这些字段。6.2 模型分级调用不是所有请求都需要大模型。可以设计一个分级路由第一级规则匹配。如果用户输入命中预设关键词如请假、报销直接走对应流程不调模型。第二级小模型。7B模型做意图分类置信度高则直接执行。第三级大模型。小模型置信度低时调用云端大模型做二次判断。实测下来这个分级路由能把模型调用量降低60%-70%其中规则匹配覆盖约30%小模型覆盖约40%只有不到30%的请求需要大模型。6.3 批处理与流式输出如果流程允许异步比如夜间批量处理报销单可以把多个请求攒成一批一次性发给模型。批处理能显著提高GPU利用率降低单位成本。对于交互式流程如果模型输出较长比如生成审批意见可以用流式输出让用户先看到部分结果降低感知延迟。但要注意流式输出和结构化输出JSON有冲突——JSON必须完整才能解析。折中方案是先流式输出自然语言部分最后再输出一个完整的JSON块。7. 上线后的持续迭代反馈闭环怎么建7.1 反馈数据的采集系统上线后最重要的资产不是模型而是反馈数据。每次人工介入、每次用户修改模型建议、每次流程走错分支都是宝贵的标注数据。采集时要记录原始输入、模型输出、置信度、人工修正结果、最终执行结果。这些数据积累到一定量比如500-1000条就可以用来微调模型形成使用-反馈-微调-提升的闭环。7.2 A/B测试与灰度发布模型更新不能全量上线。建议用A/B测试新模型先处理10%的流量对比准确率、延迟、人工介入率等指标达标后再逐步扩大。灰度发布时要注意流程状态不能因为模型版本切换而混乱。同一个流程实例要么全程用旧模型要么全程用新模型不能中途切换。实现上可以在流程实例创建时记录模型版本后续节点都按这个版本调用。7.3 监控指标上线后要盯住几个核心指标指标含义健康范围意图识别准确率模型分类正确的比例 90%实体抽取F1实体抽取的综合指标 0.85人工介入率需要人工处理的流程比例 20%P99延迟模型调用的99分位延迟 3秒单流程成本每个流程的平均模型成本根据业务定这些指标要接入监控大盘设置告警。特别是人工介入率如果突然升高往往意味着模型效果下降或输入分布发生了变化。8. 几个真实踩过的坑最后分享几个我在实际项目中踩过的坑都是文档里不会写的。坑一模型对否定不敏感。用户说我不需要报销模型可能还是识别成报销申请。解决办法是在微调数据里加入否定样本或者在提示词里明确要求注意否定词。坑二时间实体抽取的歧义。下周三到底是哪一天模型可能算错。稳妥的做法是模型只负责抽取下周三这个文本具体日期转换用规则引擎做因为规则引擎可以拿到当前日期计算更可靠。坑三多轮对话的状态丢失。用户先说申请差旅模型问去哪里用户说上海这时候如果每次调用都是独立的模型就不知道上海是回答去哪里。解决办法是在流程实例里维护一个对话上下文每次调用模型时把历史对话一起传进去。坑四模型输出的金额单位不一致。有时候输出3000有时候输出3000元有时候输出3千。后处理时要做归一化把所有金额统一成分或元的整数。坑五忽略模型的幻觉。模型可能会编造不存在的流程节点或审批人。解决办法是在执行层做白名单校验模型建议的节点必须在流程定义里存在否则拒绝执行并转人工。这些坑的共同点是模型的能力边界需要用工程手段来兜底。不要指望模型100%正确而是设计一个即使模型出错也不会造成严重后果的系统。这才是AI流程管理系统落地的关键。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →