1. 项目缘起:为什么一家千人集团决定把财务流程交给AI
1.1 从“财务共享中心”到“财务智能体”的转折点
这家集团的情况在制造业里很有代表性:员工规模1000人出头,旗下有10家独立法人主体,涉及生产、贸易、物流三个板块。财务共享中心养了28个人,每个月光是处理报销单、对账、开票、报税这几件事,就要消耗掉大量人力。最头疼的是月末结账那几天,10家主体的账套要分别处理,财务同事加班到凌晨是常态。
2024年下半年,集团CFO在一次行业交流会上接触到“财务智能体”这个概念。当时市面上已经有不少AI Agent产品,但真正落地到财务场景的案例并不多。CFO回来后拍板:先拿六个高频流程做试点,跑通了再推广。
这六个流程分别是:费用报销审核、供应商发票校验、银行流水对账、月度结账预检、税务申报数据准备、财务报告初稿生成。选这六个不是拍脑袋决定的,而是基于三个筛选标准:第一,规则明确、重复性高;第二,数据已经结构化或半结构化;第三,出错成本可控,即使AI判断失误,人工复核也能兜住。
1.2 为什么不用传统RPA而要上Agent
很多人会问:这些流程用RPA(机器人流程自动化)不也能做吗?我们一开始也评估过RPA方案,但很快发现几个硬伤。
RPA的本质是“模拟人的操作”,它擅长的是“点击按钮、复制粘贴”这类确定性动作。但财务流程里充满了“判断”——比如一张报销单,发票抬头和报销主体不一致,是驳回还是让申请人补充说明?供应商发票的税率和合同约定有出入,是直接标记异常还是先查历史记录?这些判断在RPA里只能写死规则,一旦遇到规则外的情形就卡住了。
而LLM驱动的Agent不一样。它具备语义理解能力和推理能力,可以处理“模糊地带”。举个例子:员工提交了一张餐饮发票,备注写的是“客户招待”,但金额超过了公司规定的单人招待标准。传统RPA只会机械地比对金额,然后驳回。但Agent会结合历史数据判断:这个员工过去半年的招待费都在标准内,这次超标可能是因为接待了重要客户,于是它会标记为“建议人工复核”而不是直接驳回。
这就是我们选择Agent而非RPA的核心原因:财务流程的复杂性不在于步骤多,而在于判断多。
1.3 技术选型的底层逻辑
在技术栈上,我们最终确定的方案是:LLM作为推理核心 + 流程引擎作为调度中枢 + 规则引擎作为安全兜底。
LLM选的是国内某头部厂商的企业级API,主要考虑三点:一是数据不出境,财务数据敏感度太高;二是支持Function Calling,方便和内部系统对接;三是上下文窗口够大,能一次性塞进整张报销单的所有字段和历史记录。
流程引擎用的是开源方案Temporal,看中的是它的持久化执行能力。财务流程往往跨天甚至跨周,比如一笔对账可能要等银行回单,Temporal能保证流程状态不丢失,服务重启后还能从断点继续。
规则引擎是自己写的,不复杂,就是一套JSON配置。它的作用是给Agent的输出加一道“安检”——Agent判断可以通过的,规则引擎再校验一遍硬性指标;Agent判断需要人工介入的,规则引擎负责路由到对应的财务人员。
这里有个经验:不要指望LLM解决所有问题。把确定性高的规则交给规则引擎,把需要语义理解的判断交给LLM,各司其职,系统才稳。
2. 六个流程的Agent化拆解:从需求到落地
2.1 费用报销审核:从“人眼扫”到“语义比对”
费用报销是财务共享中心最耗人力的环节。原来一个财务一天要审80-100单,每单平均看3-5分钟。上了Agent之后,系统自动处理了约70%的标准单,财务只需要处理剩下的30%异常单。
具体实现上,Agent的工作流是这样的:
- OCR识别:发票、行程单、支付凭证先过OCR,提取关键字段(金额、日期、抬头、税号)。
- 语义比对:Agent把OCR结果和员工填写的报销单做交叉验证。这里不是简单的字符串匹配,而是语义级的。比如员工填的“招待客户张总”,发票备注是“餐饮”,Agent会判断这两者是否指向同一件事。
- 规则校验:调用规则引擎,检查是否超标准、是否重复报销、发票是否连号。
- 历史行为分析:Agent会查这个员工过去6个月的报销记录,如果发现异常模式(比如突然频繁提交大额招待费),会提高审核等级。
- 输出结论:通过、驳回、或转人工,并附上判断理由。
实测下来,Agent在“发票真伪校验”和“重复报销识别”这两个点上比人更靠谱。人眼容易疲劳,看多了会漏;Agent不会,它每一单都按同样的标准执行。
2.2 供应商发票校验:三单匹配的智能化改造
供应商发票校验的核心是“三单匹配”——采购订单、入库单、发票三者要对得上。传统做法是财务手动在ERP里查三张单子,核对数量、单价、金额。10家主体、每月平均2000张供应商发票,工作量可想而知。
Agent的做法是:
- 先从ERP拉取采购订单和入库单数据
- 用LLM做模糊匹配,处理“同一商品不同描述”的情况。比如采购订单写的是“A4复印纸70g”,发票写的是“复印纸A4 70克”,传统系统会认为不匹配,但Agent能识别这是同一件商品。
- 对于数量差异,Agent会计算差异率。差异在±2%以内的,自动通过;超过2%的,生成差异说明并转人工。
- 对于单价差异,Agent会查历史采购记录,如果这次单价比历史均价高10%以上,会标记为“价格异常”。
这里有个细节值得说:Agent的容错设计。我们给Agent设了“置信度阈值”,当它对自己的判断置信度低于85%时,会自动转人工,而不是强行给结论。这个阈值是调出来的——太高了人工忙死,太低了错误率上升。我们试了80%、85%、90%三档,最后85%是平衡点。
2.3 银行流水对账:从“逐笔勾对”到“智能匹配”
银行流水对账是另一个痛点。10家主体、8个银行账户,每月流水加起来上万条。传统做法是导出Excel,用VLOOKUP逐笔勾对,对不上的再人工查。
Agent的对账逻辑分三层:
- 第一层:精确匹配。金额、日期、对方户名完全一致的,直接勾对。这层能覆盖约60%的流水。
- 第二层:模糊匹配。金额一致但日期差1-2天的,或者对方户名有简写差异的,Agent用语义相似度做匹配。这层能再覆盖25%。
- 第三层:推理匹配。对于一对多、多对一的情况(比如一笔收款对应多张发票),Agent会结合应收账款数据做推理。这层覆盖约10%。
- **剩余5%**转人工,通常是真正的异常或未达账项。
Agent在这个场景里的价值不是“快”,而是“不怕麻烦”。人工对账时,遇到模糊匹配的往往就跳过了,留到后面再说;Agent会每一笔都认真处理,该推理的推理,该标记的标记。
2.4 月度结账预检:把问题消灭在结账前
月度结账是财务的“大考”。10家主体要在3天内完成结账,任何一家卡住都会影响合并报表。传统做法是结账当天才发现问题,然后手忙脚乱地补。
Agent的做法是提前7天开始预检。它每天跑一遍数据,检查以下项目:
- 未过账的凭证有多少
- 往来科目余额是否异常
- 银行存款日记账和银行对账单是否一致
- 应收应付账龄是否超期
- 存货成本是否异常波动
发现问题后,Agent会自动生成“预检报告”,列出风险项和建议处理人。财务同事在结账前就能把大部分问题解决掉。
这个功能上线后,月度结账时间从平均3.5天缩短到2天,而且结账当天的“救火”次数减少了70%。
2.5 税务申报数据准备:从“手工整理”到“自动生成”
税务申报的数据准备是个细致活。增值税、企业所得税、个税,每个税种要的数据不一样,口径也不一样。原来是一个税务会计花2天时间从各个系统里导数据、整理、核对。
Agent的做法是:
- 从ERP、发票系统、薪酬系统分别拉取数据
- 按照税种口径自动计算
- 生成申报表草稿
- 和上期数据做对比,差异超过5%的自动标记
- 附上计算过程和数据来源,方便税务会计复核
这里的关键是可解释性。税务申报不能是黑盒,Agent必须能说清楚“这个数字是怎么来的”。我们在设计时要求Agent对每个关键数字都输出计算路径,比如“销项税额=销售额×税率,销售额取自ERP销售模块,税率取自税务配置表”。
2.6 财务报告初稿生成:从“复制粘贴”到“智能撰写”
财务报告初稿的生成是六个流程里最“像人”的一个。Agent会读取结账后的数据,按照模板生成报告初稿,包括:
- 资产负债表、利润表、现金流量表的变动分析
- 主要财务指标的同比环比
- 异常科目的说明
- 管理层讨论与分析的初稿
Agent写出来的初稿当然不能直接对外,但能省掉财务经理80%的“码字”时间。财务经理只需要在初稿上修改和补充,而不是从零开始写。
这里有个心得:让Agent写报告,提示词里一定要加“用财务专业术语,不要用口语化表达”。我们一开始没加,Agent写出来的东西像新闻稿,后来调整了提示词才像财务报告。
3. 技术架构与核心实现细节
3.1 整体架构:三层解耦设计
我们的架构分三层:
- 交互层:企业微信 + Web端。财务同事在企业微信里接收Agent的推送,在Web端处理需要人工介入的任务。
- Agent层:LLM + 流程引擎 + 规则引擎。这是核心,负责所有智能判断和流程调度。
- 数据层:ERP、发票系统、银行接口、税务系统。Agent通过API和这些系统交互。
三层之间通过消息队列解耦。Agent层不直接连数据库,所有数据请求都走API。这样做的好处是安全——Agent拿不到原始数据库权限,只能拿到它需要的那部分数据。
3.2 LLM的提示词工程:财务场景的特殊处理
财务场景对LLM的提示词要求很高。我们总结了几个关键点:
- 角色设定要具体。不要只说“你是一个财务助手”,要说“你是一个有10年经验的财务共享中心审核会计,熟悉中国企业会计准则和税法”。
- 输出格式要严格。我们要求Agent输出JSON,包含
conclusion(结论)、confidence(置信度)、reason(理由)、suggested_action(建议动作)四个字段。这样程序好解析。 - 少样本示例要给足。我们在提示词里放了20个典型场景的输入输出示例,覆盖通过、驳回、转人工三种情况。
- 边界条件要明确。比如“如果发票金额和报销单金额差异超过1元,必须转人工”,这种硬规则要写死在提示词里。
3.3 流程引擎的持久化设计
财务流程的特点是“长事务”——一笔对账可能跨天,一笔报销可能等审批等一周。Temporal的持久化能力在这里很关键。
我们给每个流程定义了状态机:
PENDING:等待处理PROCESSING:Agent处理中WAITING_HUMAN:等待人工介入COMPLETED:已完成FAILED:失败,需要重试
状态转换全部持久化到数据库。服务重启后,流程引擎会从数据库恢复状态,继续执行。这保证了“即使系统挂了,流程也不会丢”。
3.4 规则引擎的兜底逻辑
规则引擎是我们自己写的,核心是一套JSON配置。每条规则包含:
condition:触发条件,比如amount > 5000action:执行动作,比如route_to_humanpriority:优先级,数字越小越优先
规则引擎在Agent输出之后执行。如果Agent说“通过”,但规则引擎发现“金额超过5000且没有上级审批”,就会覆盖Agent的判断,强制转人工。
这套机制保证了安全底线——LLM可以犯错,但规则引擎不会。
4. 实施过程中的坑与解决方案
4.1 数据质量:Agent再强也怕脏数据
上线第一个月,Agent的准确率只有72%,远低于预期的90%。排查后发现,主要问题出在数据质量上:
- ERP里的供应商名称有简写、全称、英文名三种写法
- 发票OCR识别率只有85%,尤其是手写发票和模糊发票
- 银行流水的对方户名经常是简称或代码
解决方案是加了一层数据清洗:
- 建供应商主数据表,统一名称
- OCR结果做二次校验,识别置信度低的转人工录入
- 银行流水建映射表,把简称映射到标准名称
数据清洗后,Agent准确率提升到89%。
4.2 幻觉问题:Agent会“编造”理由
LLM的幻觉在财务场景里很危险。有一次Agent驳回了一张报销单,理由是“发票连号,疑似虚假报销”。但实际上那张发票的号码是正常的,Agent看错了。
我们的应对措施:
- 关键判断必须引用数据来源。Agent说“发票连号”,必须给出具体号码和比对结果。
- 置信度低于阈值自动转人工。我们设了85%的阈值,低于这个数就不让Agent做最终判断。
- 定期审计Agent的驳回记录。每周抽10%的驳回单人工复核,发现误判就调整提示词。
4.3 人机协作:财务同事的抵触与适应
最大的挑战不是技术,是人。财务同事一开始很抵触,觉得“AI要来抢饭碗”。有个老会计直接说:“我干了20年财务,现在让一个机器审我的单子?”
我们的做法是:
- 定位为“助手”而非“替代”。对外宣传时强调Agent是帮财务减负的,不是替代人的。
- 让财务同事参与规则制定。规则引擎里的很多规则就是财务同事提的,他们有参与感。
- 设置“人工优先”模式。上线前三个月,所有Agent的判断都只是“建议”,最终决定权在财务手里。三个月后才逐步放开自动通过。
三个月后,财务同事的态度明显转变。那个老会计后来说:“Agent帮我省了看发票的时间,我可以专心处理复杂的账务问题了。”
4.4 性能优化:LLM调用的成本与延迟
LLM调用是有成本的,而且延迟不低。我们算过一笔账:如果每张报销单都调一次LLM,一个月光API费用就要好几千。
优化措施:
- 缓存:相同供应商、相同金额的发票,如果历史已经判断过,直接复用结论。
- 批处理:非实时的流程(如月度预检)攒一批一起调LLM,减少调用次数。
- 小模型兜底:对于简单的规则判断(如金额是否超标),用本地小模型或纯规则处理,不调LLM。
优化后,LLM调用量减少了60%,成本降到了可接受范围。
5. 效果评估与关键指标
5.1 效率提升数据
上线6个月后的数据对比:
| 指标 | 上线前 | 上线后 | 变化 |
|---|---|---|---|
| 报销单平均处理时长 | 4.2小时 | 0.8小时 | -81% |
| 供应商发票校验人力 | 3人 | 1人 | -67% |
| 银行对账耗时 | 2天 | 0.5天 | -75% |
| 月度结账时长 | 3.5天 | 2天 | -43% |
| 税务申报准备时长 | 2天 | 0.5天 | -75% |
| 财务报告初稿撰写 | 1.5天 | 0.3天 | -80% |
5.2 准确率与人工介入率
- Agent自动通过率:68%
- Agent转人工率:32%
- 人工复核后确认Agent判断正确的比例:94%
- 人工复核后推翻Agent判断的比例:6%
6%的推翻率在财务场景里是可以接受的,因为人工复核本身就是安全网。
5.3 财务同事的反馈
我们做了匿名调研,财务同事的反馈集中在几点:
- “不用再对着Excel看到眼花了”
- “Agent会把异常项标出来,我直接看异常就行”
- “希望Agent能处理更多类型的单据”
- “有时候Agent的理由写得不太清楚,还得自己去查”
最后一条是我们下一步要优化的方向——让Agent的输出更可解释。
6. 后续扩展与个人体会
6.1 下一步计划
六个流程跑通后,我们计划往两个方向扩展:
- 横向扩展:把Agent应用到更多主体和更多流程,比如固定资产管理、预算控制。
- 纵向深化:让Agent具备“学习”能力,从人工复核的结果中自动调整判断逻辑。
6.2 给同行的建议
如果你也在考虑上财务智能体,我的建议是:
- 从小处着手。不要一上来就搞大而全,先选一个流程跑通,建立信心。
- 数据先行。Agent的效果70%取决于数据质量,先把主数据、历史数据整理好。
- 人机协作是必经阶段。不要指望Agent一上线就全自动,给人一个适应期。
- 规则引擎不能省。LLM会犯错,规则引擎是最后一道防线。
6.3 一个意外收获
上线Agent后,我们发现一个意外的好处:财务数据的透明度提高了。以前很多判断在财务同事脑子里,现在Agent的判断逻辑写在了提示词和规则里,相当于把隐性知识显性化了。新来的财务同事上手更快,因为Agent会告诉他“为什么这单要转人工”。
这个收获不在预期之内,但可能是比效率提升更有价值的东西。