我用 AI 给自己做了一个发票报销助手

各行各业都在积极拥抱 AI,公司内部也欢迎大家提用 AI 提效的想法。我给内部提过一个需求:报销流程其实很适合做自动化,至少可以先把收票、整理票据、填单这些重复动作接过去。

这个需求不是凭空来的。对我这种出差比较多的人来说,一次四天左右的出差,打 8 到 12 次车很正常。到了报销的时候,要到网约车app开发票、到email收票,然后到本地要把这些发票和行程单一一对应,还得再关联到对应的出差申请。麻烦在于事情太碎。票据来源混杂,文件名不统一,抬头要核,网约车还要配行程单,最后进报销系统还要一条条填。

报销拖久了没有填或者提上去之后被系统规则退回来,人会直接不想报。我去年年底和今年年初就有几百块车费,过了时间点或者填错了单子被打回来,最后干脆没报。

需求提上去之后,还没有往下推进。上周末的晚上,突然想到为啥不自己做一个出来。于是我在家里花了大概两个小时,使用CODEX把第一个能用的发票报销助手跑通了,然后一周时间内它已经帮我填了三次出差报销的草稿。

主线很简单:

Gmail IMAP 收票 -> mail_sync.py 下载 -> invoice_organizer_longterm.py 整理 -> 报销系统主线程填写 -> 自动存为草稿

下面的图表示了报销助手的工作流程。

图片

如果把这张图压缩一下,我和 Codex 主要一起做了三个模块。

第一个模块是收票(1)。它负责把 Gmail 里的发票附件和下载链接收下来,把重复处理和异常日志一起管住。

第二个模块是整理发票(2)。它负责把票据识别、重命名、配对、校验,再整理成

整理待上传、原件归档 和 invoice_index.csv这几个后面还能继续使用的结果。

第三个模块是报销系统填写(3\4\5)。它负责先根据报销单标题和关联申请单日期确定报销时间段,再按票据类型决定要上传什么票,把主线程里的重复动作接过去,最后自动存为草稿。只要出现票据异常、日期对不上或者页面填写异常,就回到人工处理。

在这三步中,我最核心的prompt就是下面四段

一、收票prompt

`我有一些邮箱里的发票邮件,我希望你能帮我定期把他们下载到本地的inbox文件中,
以便于我使用 inbox整理发票技能时对他们进行整理。我的邮箱主要是163和gmail邮箱。
你有哪些最快速高效的方法`

二、整理发票prompt

`- 你要做我的发票助手,第一步的工作是:
阅读我给你的 inbox 文件夹中的每一个 PDF 文件

  • 对文件名进行重新命名,格式要求如下:

  (a) 订单发生的日期
  (b) 消费类别(如:食物餐饮、出租车、火车等)
  (c) 金额 d)发票或者是行程单
  因为后续作为发票助手,你还需要在一个网页系统里把这些发票和行程单附加上去。
  在附加行程单跟发票时,它会按照匹配要求,对应相关的日期和消费形式等内容。
  帮我重新整理,你可以安装需要的插件以及 skills。我们先规划第一步。`

三、浏览器上传发票和填报销prompt

``我需要你操作chroma浏览器,帮我填入报销发票的草稿。
1、报销系统为XFX,https://xfX.XXXXchina.com/#/workbench。需要我登录信息,你才能填;
2、你要问我,需要填哪个报销单。我会告诉你报销单的单据编号
3、找到所要填的报销单路径为: 主页->左侧“我的报销”->中间根据单据编号直接点进去进行编辑。
你可以安装诸如Chrome-CLI 和其他所需skills来进行操作 `

`第一点,通过标题和关联申请单里面的日期来确定日期。
比如说我现在给你的这个编号,标题是 0318-21,那你应该合理猜测这个日期指的是 2026年3月18日到 2026年3月21号。
并且你看申请单上的日期也写了 3月18、3月19、20、21 这些时间段。 如果你发现申请单跟标题的日期对不上,你也要主动询问。
所以第一点是先要确认报销单的时间段是怎样的。然后你就知道在你的文件夹里面,哪些 PDF 是要填写的了,这就确定了大概有哪些 PDF 是要填的。

第二点,我们现在要做的事就是填写费用。你需要找到“添加费用”的按钮,大概在页面的中下部,有一个“添加费用”按钮。

第三点,进入添加费用之后,首先要上传发票文件,点击“上传发票文件”按钮。

第四点, 以出租车、网约车的发票为例,你点击“上传发票文件”按钮后,选择对应时间段的其中一张发票并点击上传。 上传之后,系统会让你填写新增费用信息:

  1. 费用类型:通过下拉框选择“差旅费-交通费”2. 消费日期:填写发票行程单上的日期3. 消费城市:系统会自动跳出来4. 附件:要把对应的行程单上传进去5. 费用备注:填写“打车费用”

第五点,以上面的方法逐个填写这个时间段内的出租车、网约车的发票和行程单。全填写完之后,再进行下一个类型的填写。`

后面一些小的补充、更进一步的说明,会让agent运行的更好,但主框架就是上面4个prompt。

(上面看起来文字也比较多,但是我是用口述的方式,由typeless帮我复述并且逻辑清楚的整理出来; 免费额度就够用了,手机和电脑端都可以,建议体验,链接为该软件https://www.typeless.com/refer?code=R752FG8)

我先解决的,是收票这一步

我先处理的是票据入口。发票来源太散,有邮件附件,有邮件里的下载链接,也有滴滴这类平台发来的成套票据,火车票还会遇到 PDF 和 OFD 混在一起的情况。

所以我先把入口收了一下,尽量让电子发票发到 Gmail,然后用mail_sync.py走 IMAP 去抓。配置放在 mail_sync.toml,计划任务用 register_mail_sync_task.ps1注册。我现在设的是每周三 10:00 自动跑一次,另外登录电脑时补跑一次。

这些文件名看起来挺复杂的,但实际代码都是 Codex 迭代出来的,我自己没有写代码。

这样做完以后,至少“票从哪来”这件事先固定下来了。

收下来以后,我不急着让agent上传,而是先整理

票据下载到本地以后,我没有让agents直接往发票里塞。

我先跑invoice_organizer_longterm.py 把文件整理成后面能继续用的样子。这个脚本做的事很具体:

  • 识别票据类型
  • 重命名文件
  • 给网约车发票配对应行程单
  • 校验发票抬头
  • 把原件归档
  • 写出索引表

我现在长期用两个目录:

  • 整理待上传放整理完、可以直接拿去报销的 PDF
  • 原件归档放原始文件

这一层整理做完以后,票据就从“邮箱里的一堆附件”变成了“已经分好类、能追踪、能复查的一批文件”。

图片

还有一份invoice_index.csv把日期、金额、类型、状态这些信息都记下来。后面agent再处理的时候,就不用反复打开 PDF 耗费token去看内容了。

图片

这里面有一类问题我专门做了显式标记,就是抬头不对。比如我现在目录里就有一张:

图片

这种票不会混进正常结果里被报销系统抓现行,而是直接把问题挂在文件名上。后面一眼就能看出来。

整理完以后,就是让agent操作浏览器进系统填报销了

这里的人和程序分工也比较清楚。

我先在系统里发起某一次出差的报销单,标题用“日期 + 出差”的形式,登录环节也由我自己完成。agent拿到要填写的报销单号之后,进入报销系统会先看报销单标题,再看关联申请单里的日期,先把这次报销的时间范围定出来。时间范围定下来以后,再去 整理待上传文件夹里找对应日期段内的票。

不同票据走的规则也不一样。网约车要同时带上同金额匹配到的行程单,火车票就直接取对应的铁路发票。只要票据异常,比如抬头不对、配对失败、识别不清,或者标题和申请单日期对不上,就先交给人工处理,不往下填。

在一周跨度内,我已经让agent帮我填了3次出差申请

这三张单子里,agent完成了:

  • 20条网约车费用
  • 1条火车 / 高铁费用

最后都自动存成了草稿。

这一步agents用的是 Chrome CDP 这条路。导航相关脚本是xft_nav.mjs,网约车填写主脚本是 xft_fill_ridehail.mjs。做法也不复杂,就是把那些重复动作接过去,比如打开目标单据、点“添加费用”、上传发票、补附件、保存。

图片

配图:agents根据我给他的单号,找到要填的报销单

图片

配图:agents上传完发票后,还要选择消费日期、上传行程单、填写项目、出差备注

我没有让agent做全自动完成的流程。因为现在这套流程里,主线程填写跑完以后,收尾动作是自动存为草稿,最后的复核和确认还是我自己来做。

比如日期不对、系统默认值不靠谱、页面组件没按预期响应,这些都得自己看一眼。对自己负责。

现在它给我带来的变化很直接

我以前填报销,真的是经常烦躁。但又不能不报,用我一位同事的话说,填报销的时间是单位时间回报最高的时间。但是真的是麻烦:

收票,找票,改名,配对,核对,上传,填字段,检查,返工。
现在顺序变成了:我负责发起报销单和最后确认,收集票据、整理发票、填表和上传附件这些重复动作交给程序。

让agent先收票,再整理,再拿整理好的结果去填系统,最后我只盯异常和确认。

变化也不是“完全不用管了”。更直接的感受是,我终于不用从一堆混乱开始。

最后

这套系统现在看起来就是三个模块,执行的速度也不快,但已经够我用了,给我的提效也很直接。后面我大概率不会在上面继续投入很多时间,最多是运行的时候碰到问题,再口头指导一下它。

但我已经不需要每次都从头整理一遍报销这件事。

它不大,也谈不上多先进。只是把我工作里反复出现的一小段麻烦,慢慢改成了一个能复用的流程。

做这件事我的一点体会

我这次用到的工具并不复杂,核心就是:一个能听我指令去写脚本的 AI agents,我用的是 Codex;连接邮箱、读pdf、控制浏览器的工具都是agents根据需要自己下载和调用。

我总结下来,可以用最简单的三步来描述这个过程。

第一步,先挑一个很具体的小问题,比如:

  • 我想把邮箱里的发票附件自动下载到一个文件夹
  • 我想把下载下来的 PDF 按日期和金额重命名
  • 我想把某个网页里的重复填写动作自动化

问题越具体,越容易做出来。

第二步,把输入、输出和异常讲清楚。和 Codex 对话的时候,不要一上来就说“帮我做个自动化工具”,那样太空了。更有效的说法,是直接把场景讲清楚,比如:

“我有一批发票 PDF,在这个目录里。我想按日期、类型、金额重命名,输出到另一个目录。网约车发票要和同金额行程单配对,抬头不对的文件要单独标出来。”

或者:

“我想自动打开报销系统里的某张报销单,进入编辑页,上传整理好的发票,并在最后存为草稿。”

你把输入是什么、输出想变成什么、哪些情况算异常,直接说出来,Codex 才更容易把它变成程序。

第三步,先做最小可用版本,并且尽量把问题拆成几个小的可分别实现的模块,就像我把填报销系统这件事拆成了:收邮箱发票、整理发票文件和行程单、进入系统按规则填写。如果自己一开始拆不清,也没关系,也可以先让agent帮你拆流程,再一点点补:

  • 先让它帮你拆流程
  • 再让它先写最小可用版本
  • 跑起来以后,把报错贴给它
  • 再继续补规则、补测试、补异常处理

我这次基本就是这么做的。很多东西并不是我一开始就想全了,而是先跑起来,再一点点修。

此处是戛然而止,未上价值的结束。


原网址: 访问
创建于: 2026-04-16 11:21:44
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论