Featured Project
EnterpriseFlow
LangGraph + MCP 的企业流程 Agent:可中断、可恢复、可核对的差旅费用申请
- 我的角色
- 独立开发者(流程设计 / 全栈实现 / 评测体系)
- 周期
- 2026.10 并入作品集
- 规模
- src 3,691 行 · 测试 2,080 行 · 9 个测试文件

把企业报销这类流程交给 Agent 编排,但不把权限交给模型:模型只提取用户明确给出的字段,身份、金额、制度适用与提交许可全部由服务端确定性代码裁定;审批点持久化暂停,进程重启后按同一编号恢复。
§问题:流程自动化最怕模型越权,也怕中断后丢状态
费用申请要查本人订单、套用有版本的制度、核算金额、等人确认再提交。让模型端到端自由发挥,会出现越权读取、金额算错、重复提交、确认过期仍被执行等不可接受的错误。
切入点:把流程做成真实的状态图,让「暂停等人」「重启恢复」「旧确认失效」「重复提交只算一次」成为机制,而不是提示词里的恳求。
§方案:LangGraph 状态图 + 身份绑定的 MCP 工具 + 确定性裁定
LangGraph StateGraph 编排字段补充、订单与制度查询、草稿核算、人工确认与事务提交;字段补充与审批使用 interrupt / Command 暂停与恢复,AsyncSqliteSaver 文件检查点让进程重启后按同一 run_id 回到原暂停点。
模型可输出的字段仅限订单 ID、成本中心、日期、目的地、备注;MCP 工具服务器绑定服务端身份,参数里不含员工或租户字段。草稿绑定版本号与 SHA256 内容摘要,编辑草稿或来源变化后旧确认立即失效;写事务 + 唯一约束 + 幂等键,重复提交返回同一编号。
§只读 Agent 层:能自己决定调什么,但写不了任何东西
有界 ReAct 规划循环按需调用查询与核算工具,步数、上下文字符与循环签名三重限制同时生效;Supervisor 再派发三个最小权限角色分别做订单核对、条款检索与确定性核算,并交叉检查结论、按 blocking / warning 分级。
对写入类工具的提议在执行前就被白名单拦下:实测 30 次运行全部 blocked_tool,实际工具调用为 0。
§量化评测:检索、抽取、Agent 层各有记录
制度检索先用结构化过滤按租户、部门与生效日期收窄候选,再排序:BGE-M3 稠密召回把 Recall@3 从 0.730 提到 0.836、Recall@5 从 0.898 提到 0.987,三种配置的越权泄漏均为 0。
字段抽取用 27 条人工标注用例(含身份伪造与提示注入)输出字段级 P/R/F1、幻觉字段数与弃答率;评测脚本与线上同源,可作为 CI 质量门禁。
- 204 项测试:业务 20 / 编排 22 / 网页 21 / 问答 5 / 只读规划 24 / 多角色 22 / 检索 30 / 可观测性 17 / API 21 / 模型容错 22
- Ubuntu · Windows × Python 3.11 · 3.12 四组 CI 通过(对应此前 182 项版本),并验证 wheel 脱离源码目录运行
- fixture 模式无需任何模型服务即可完整运行,每次运行输出 model_used 标识
§诚实的边界
视频与页面中的订单、人员与金额均为 fixture 演示数据;当前为单机可复现运行,没有公网部署。业务后端迁移到服务型数据库、真实模型回归阈值化是下一步方向。
§操作演示
§界面速览



§难点与取舍
为什么模型不碰金额和身份
金额、制度适用与提交许可是可审计的业务裁定,交给确定性代码才能复现;模型只负责把自然语言变成受限字段。
为什么检索先过滤再排序
权限边界不能靠排序分数保证:结构化过滤是唯一可排序范围,所以越权泄漏恒为 0。