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 商品匹配 额度控制 降低开票错误凭证生成 发票识别 科目映射 借贷平衡 制证提速进项税认证 发票识别 税务接口 可抵扣判断 减少人工认证五、落地建议先做自动填单 人工确认准确率稳定后再放开自动提交

相关新闻

最新新闻

揭秘不锈钢防火门价格内幕

揭秘不锈钢防火门价格内幕

同样外观的不锈钢防火门,市场报价差距悬殊,很多采购只对比单价,忽视背后层层套路,最终面临消防验收失败、高额返工损失。差价核心不在于表面板材,而是材质偷换、结构缩水、资质造假、配置减配四大陷阱。材质造假是最大…

2026/7/22 11:32:33
普通人更需要的不是 AI 能力,而是 AI 服务

普通人更需要的不是 AI 能力,而是 AI 服务

过去,我总劝身边的人学 AI。 学一下提示词,试试让 AI 写东西、查资料、做表格。那时候我真心觉得,这是一个很明显的机会:工具已经摆在这里了,早点用,就能早点省力。 但多数人的反应不是兴奋,而是…

2026/7/22 11:32:33
XSS跨站脚本攻击:从核心原理到纵深防御体系构建

XSS跨站脚本攻击:从核心原理到纵深防御体系构建

1. 项目概述:为什么XSS依然是Web安全的“头号公敌”? 干了这么多年安全,每次给新入行的兄弟做培训,XSS(跨站脚本攻击)永远是第一个被拎出来讲的。不是因为它最复杂,恰恰相反,它的原理…

2026/7/22 11:32:33
经典算法题:只出现一次的数字

经典算法题:只出现一次的数字

我们先来看题目介绍: 这道题的解法对于一些同学来说应该非常深刻,其中一个想法是放 Hash Table ,每个出现的数字就放在桶里面,每次出现就统计,代码如下: class Solution(object):def singleNumber(self, n…

2026/7/22 11:32:33
用n8n和AI打造自动化资讯收集工作流

用n8n和AI打造自动化资讯收集工作流

1. 项目概述:用n8n打造AI资讯咖啡工作流 每天早上打开手机,科技资讯就像一杯提神咖啡——但手动筛选各大平台内容太费时间。这个项目通过n8n搭建自动化工作流,实现三个核心目标: 定时抓取指定科技媒体/博客/RSS的最新文章 通过A…

2026/7/22 11:32:33
我们对海外市场的很多误解,其实都源于信息差

我们对海外市场的很多误解,其实都源于信息差

在信息高度碎片化的当下,我们每天接收的内容,大多是算法筛选后的“同质化内容”。尤其是在海外市场、海外zi产认知这件事上,绝大多数人的了解,都停留在片面传言、短视频碎片解读和道听途说的经验里。很多人不是看不懂市场&#xf…

2026/7/22 11:27:32

月新闻