用 Solon ReActAgent 落地发票识别与智能报销

📅 2026/7/19 5:07:43
用 Solon ReActAgent 落地发票识别与智能报销
某中型企业财务部每月处理大量报销单团队疲于奔命痛点 具体表现 后果发票录入耗时 每张发票手工录入 财务时间被重复劳动占满合规审核靠人眼 真伪、抬头、连号靠抽检 漏检风险重复报销难查 同一张票被报两次偶发出现 资金损失报销周期长 提交到到账周期长 员工体验差一、业务方案1.1 目标拍照后自动识别并填单常见合规规则自动校验重复报销可拦截异常单附上下文转人工1.2 流程改造改造前员工贴发票 → 填写报销单 → 主管审批 → 财务初审 → 财务复审 → 出纳打款改造后员工拍照上传 → Agent 识别填单合规检查 → 主管审批 → 通过后打款↓异常 → 人工介入附检查摘要二、技术落地ReActAgent 实现说明这是典型业务闭环正确入口是 ReActAgent 领域工具 HITL。不要使用虚构的 implements Tool、Harness.call()、AiInterceptor、memory.search()。2.1 模块结构com.example.finance/├── tools/│ ├── OcrTools.java # 发票 OCR│ ├── ComplianceTools.java # 合规与重复报销检查│ └── PaymentTools.java # 打款执行├── hitl/│ └── FinanceHitlController.java # 超标/异常审批└── ReimbursementAgentApp.java2.2 工具定义真实 APIimport org.noear.solon.ai.annotation.ToolMapping;import org.noear.solon.ai.chat.tool.AbsToolProvider;import org.noear.solon.annotation.Param;/** 发票 OCR 工具 */public class OcrTools extends AbsToolProvider {ToolMapping(description “识别发票图片返回发票代码、号码、日期、金额、购买方、销售方等字段”)public String ocr_invoice(Param(description “发票图片 base64 或文件 ID”) String imageRef) {// 生产环境调用 OCR 服务return “”{“code”:“044001900111”,“number”:“12345678”,“date”:“2026-06-18”,“amount”:1200.00,“tax”:72.00,“total”:1272.00,“buyer”:“某某科技有限公司”,“seller”:“某某酒店”,“category”:“住宿”}“”;}}/** 合规检查工具 */public class ComplianceTools extends AbsToolProvider {ToolMapping(description “检查发票真伪、抬头、是否重复报销返回合规结论”)public String check_invoice(Param(description “发票号码”) String invoiceNo,Param(description “购买方名称”) String buyer,Param(description “价税合计”) double total) {// 生产环境税务查验接口 已报销库查询 公司抬头校验if (“12345678”.equals(invoiceNo) total 0) {return “”{“invoiceNo”:“12345678”,“titleOk”:true,“duplicate”:false,“taxVerified”:true,“result”:“PASS”,“message”:“合规检查通过”}“”“;}return “””{“result”:“REJECT”,“message”:“发票校验失败请转人工”}“”;}ToolMapping(description 按费用类别检查是否超过公司报销标准) public String check_policy( Param(description 费用类别如住宿/交通/餐饮) String category, Param(description 金额) double amount) { if (餐饮.equals(category) amount 400) { return {\result\:\OVER_LIMIT\,\limit\:400,\amount\: amount ,\message\:\餐饮超标准需主管确认\}; } return {\result\:\OK\,\message\:\符合标准\}; }}/** 打款工具敏感操作 */public class PaymentTools extends AbsToolProvider {ToolMapping(description “提交报销打款。仅在合规通过且审批完成后调用”)public String submit_payment(Param(description “报销单号”) String reportId,Param(description “收款人”) String employee,Param(description “打款金额”) double amount) {return “{“status”:“submitted”,“reportId”:” reportId “”,“employee”:“” employee “”,“amount”: amount “}”;}}2.3 组装报销 Agentimport org.noear.solon.ai.agent.AgentSession;import org.noear.solon.ai.agent.react.ReActAgent;import org.noear.solon.ai.agent.react.intercept.HITLInterceptor;import org.noear.solon.ai.agent.session.InMemoryAgentSession;import org.noear.solon.ai.chat.ChatModel;ChatModel chatModel LlmUtil.getChatModel();HITLInterceptor hitl new HITLInterceptor().onTool(“submit_payment”, (trace, args) - {// 打款一律人工确认也可按金额阈值判断return “报销打款需财务确认”;});ReActAgent agent ReActAgent.of(chatModel).role(“”你是企业智能报销助手。处理步骤1. 先 OCR 识别发票2. 再做合规检查真伪/抬头/重复报销3. 再检查费用标准4. 全部通过后生成报销摘要需要打款时调用 submit_payment5. 任一检查失败明确列出原因并建议转人工“”).defaultToolAdd(new OcrTools()).defaultToolAdd(new ComplianceTools()).defaultToolAdd(new PaymentTools()).defaultInterceptorAdd(hitl).modelOptions(o - o.temperature(0.0)).maxTurns(12).autoRethink(true).build();AgentSession session InMemoryAgentSession.of(“expense_report_001”);String prompt “”员工张三提交差旅报销部门销售部。已上传 1 张住宿发票图片文件 IDimg_001。请完成识别、合规检查并在可打款时提交支付。“”;String result agent.prompt(prompt).session(session).call().getContent();2.4 重复报销怎么做不要虚构 Memory memory; memory.search(…)。正确做法在 check_invoice 工具内部查“已报销发票库”DB/Redis报销成功后由支付/归档服务把发票号写入已报销库下次再报同一票号时工具直接返回 duplicatetrue// check_invoice 内部伪代码if (reimbursedInvoiceRepository.exists(invoiceNo)) {return “{“result”:“REJECT”,“message”:“该发票已被报销过”}”;}2.5 超标场景当 check_policy 返回 OVER_LIMIT 时Agent 不应直接打款应生成摘要给主管若你希望“超标也允许打款但必须审批”可在 HITL 策略里根据参数返回审批原因HITLInterceptor hitl new HITLInterceptor().onTool(“submit_payment”, (trace, args) - {double amount Double.parseDouble(args.get(“amount”).toString());if (amount 2000) {return “单笔报销超过 2000需财务负责人审批”;}return “常规报销打款确认”;});三、业务效果定性录入从手工填单变成 OCR 自动填字段合规检查可覆盖全量票据而不是抽检重复报销可在工具层硬拦截财务从“逐张核对”转向“异常复核”真实处理示例员工上传差旅住宿发票Agent 链路ocr_invoice(img_001) → 金额 1,272类别住宿check_invoice → PASScheck_policy(住宿, 1272) → OKsubmit_payment → HITL 挂起财务批准后续传完成打款提交若餐饮票 500 元、标准 400 元OCR 成功合规通过check_policy 返回超标准Agent 输出“需主管确认超标 100 元”不直接打款四、同类场景扩展业务场景 核心工具 关键规则 业务价值采购发票校验 发票识别 订单匹配 三单匹配 对账效率提升备用金核销 发票识别 预算查询 超标预警 核销周期缩短客户开票 开票 API 商品匹配 额度控制 降低开票错误凭证生成 发票识别 科目映射 借贷平衡 制证提速进项税认证 发票识别 税务接口 可抵扣判断 减少人工认证五、落地建议