我用50行代码,把报销时间从45分钟压到3分钟

一张28块钱的出租车票。

你要拍照,上传到报销系统,手动填写日期、金额、费用类型、出行事由……然后找直属主管签字,等财务核对,等月底统一打款。

前后加起来,40分钟没了。

如果你的时薪是100块,这张28块的票,你搭进去了将近70块的时间成本。这笔账,没人替你算。

更荒诞的是,这件事每个月都要重演一次。出差回来,一口气十几张票——机票、高铁、出租车、工作餐、酒店——坐在那里一张张填,填完还要检查有没有漏,漏了还得重新提交。

我身边有个运营同学,每次到月底报销季就开始焦虑,不是因为金额大,而是"那一堆票又要折腾一下午"。

这件事为什么还没被自动化?

技术上,早就可以了。真正的障碍,是"搭这套东西"听起来太像程序员的工作,普通人不敢碰。

这篇文章就是要打破这个门槛。我会手把手带你搭一个AI Agent,把"拍照→识别→填表→通知"的全流程压缩到3分钟,不需要你是工程师,只需要你会复制粘贴。

---

什么是AI Agent?用"数字员工"来理解

先别被"Agent"这个词唬住。

普通的AI聊天工具,比如你问ChatGPT"帮我写封邮件",它给你一段文字,然后……就没了。剩下的事还是你来。

AI Agent不一样。它的工作模式是:感知 → 思考 → 执行,是一个能自己干活的闭环。

用报销场景来打比方:

你把一张发票图片丢给它(感知
它识别出上面的金额、日期、商家名称(思考
然后自动填进你的报销系统,发消息通知审批人(执行

整个过程,你只做了一件事:拍照上传

这套流程用技术语言描述是这样的:

发票图片

多模态OCR(视觉模型读取图片内容)

LLM结构化提取(提取金额/日期/类型等字段)

自动写入表格或报销系统

钉钉/飞书通知审批人

每一步都有成熟的工具可以调用,你不需要从零造轮子。接下来我们就一步步把它搭起来。

---

手把手搭建你的报销Agent

整个方案分三步:识别发票、提取信息、自动填表。每步我都给出可以直接跑的代码。

第一步:调用多模态模型识别发票

现在的视觉大模型(比如GPT-4o)已经能直接"看"图片,识别发票上的文字比传统OCR更智能——它不只是读文字,还能理解上下文,比如自动区分"含税金额"和"不含税金额"。

import openai

import base64

def recognize_invoice(image_path: str) -> str:

"""

调用视觉模型识别发票,返回结构化JSON字符串

"""

# 将图片转为base64编码

with open(image_path, "rb") as f:

image_data = base64.b64encode(f.read()).decode("utf-8")

client = openai.OpenAI(

api_key="your-api-key",

base_url="https://api.884819.xyz/v1" # 国内直连,无需任何网络工具

)

response = client.chat.completions.create(

model="gpt-4o",

messages=[

{

"role": "user",

"content": [

{

"type": "image_url",

"image_url": {

"url": f"data:image/jpeg;base64,{image_data}"

}

},

{

"type": "text",

"text": EXTRACT_PROMPT # 见下方Prompt

}

]

}

]

)

return response.choices[0].message.content

💡 国内用户注意:代码里的 base_urlhttps://api.884819.xyz/v1,完全兼容OpenAI SDK格式,不需要任何额外配置,直接替换就能跑。

第二步:用Prompt精准提取字段

识别发票最关键的不是模型,而是你怎么告诉模型你想要什么。下面这个Prompt经过反复调试,在增值税普票、专票、出租车票、餐饮票上均有稳定表现:

EXTRACT_PROMPT = """

你是一个专业的财务票据识别助手。

请从图片中提取以下字段,严格以JSON格式返回,不要有任何多余文字:

{

"invoice_type": "发票类型(增值税普票/专票/出租车票/餐饮票/其他)",

"invoice_number": "发票号码",

"invoice_date": "开票日期(格式:YYYY-MM-DD)",

"seller_name": "销售方名称",

"amount": "不含税金额(纯数字)",

"tax_amount": "税额(纯数字,无则填0)",

"total_amount": "价税合计(纯数字)",

"items": "商品或服务描述(简短概括)",

"confidence": "识别置信度(high/medium/low)"

}

注意事项:

  • 金额字段只返回数字,不含¥或元等符号
  • 字段无法识别时返回null,不要猜测
  • 日期统一转换为YYYY-MM-DD格式
  • 出租车票的总金额填入total_amount,tax_amount填0
"""

这个Prompt有几个设计细节值得注意:

  • 要求"严格JSON,不要多余文字":避免模型在JSON前后加解释性语句,导致后续解析报错
  • 金额字段说明"纯数字":防止返回"¥128.00"这种格式
  • confidence字段:让模型自评置信度,低置信度的发票可以单独标记出来人工复核
小白检查点:把上面两段代码复制进去,找一张手机里的发票图片,把路径填进 recognize_invoice() 跑一下。如果终端输出了一段JSON,恭喜你,最难的部分已经过了。

第三步:批量处理 + 自动汇总

单张识别验证没问题之后,就可以上批量模式了。把一个月的发票全扔进一个文件夹,一次跑完:

import os

import json

from pathlib import Path

def batch_process_invoices(folder_path: str) -> list:

"""

批量处理文件夹中所有发票图片

支持格式:jpg, jpeg, png, pdf

"""

results = []

invoice_folder = Path(folder_path)

supported_formats = ['.jpg', '.jpeg', '.png', '.pdf']

image_files = [

f for f in invoice_folder.iterdir()

if f.suffix.lower() in supported_formats

]

print(f"📂 发现 {len(image_files)} 张发票,开始处理...")

for idx, image_file in enumerate(image_files, 1):

print(f"⏳ 正在处理第 {idx}/{len(image_files)} 张:{image_file.name}")

try:

raw_result = recognize_invoice(str(image_file))

invoice_data = json.loads(raw_result)

invoice_data['file_name'] = image_file.name

invoice_data['status'] = '待审批'

results.append(invoice_data)

print(f"✅ 识别成功:{invoice_data.get('total_amount')} 元")

except Exception as e:

print(f"❌ 处理失败:{e}")

results.append({

'file_name': image_file.name,

'status': '识别失败',

'error': str(e)

})

# 汇总统计

total = sum(

float(inv.get('total_amount', 0))

for inv in results

if inv.get('status') != '识别失败'

)

print(f"\n🎉 处理完成!共 {len(results)} 张,合计金额:{total:.2f} 元")

return results

运行

if __name__ == "__main__":

invoices = batch_process_invoices("./my_invoices")

跑完之后,results 就是一个结构化的列表,可以直接写入Excel、飞书多维表格,或者通过API提交到公司报销系统。

飞书多维表格对接:飞书开放平台提供了完整的表格写入API,把 results 里的每条数据 POST 到对应接口,就能实现自动填表。飞书的官方文档里有Python示例,照着改10行代码就够了。 不想写代码的方案:用 n8n(开源自动化工具)可以实现同样的效果,完全图形化拖拽配置,把"HTTP请求节点"和"飞书节点"连起来,不需要写任何代码。国内也有很多人用 扣子(字节跳动出品的Agent平台)搭类似的工作流,上手更快。

---

进阶玩法:让你的报销Agent更聪明

基础版跑通之后,这套方案的天花板其实很高。分享三个升级方向:

① 自动超标预警

在提取完金额之后,加一段逻辑:对照公司报销标准(比如出差餐饮每天不超过150元),自动判断是否超标,超标的在飞书表格里标红,并附上提示。这个逻辑用10行Python就能写完。

② 对接审批流

飞书和钉钉都支持"审批应用API",可以直接通过代码创建一条审批单,自动带上识别出来的发票信息,发给指定审批人。审批人只需要在手机上点"同意",整个流程无需任何人工录入。

③ 多人协作版

如果你是团队财务负责人,可以搭一个共享的收件邮箱,团队成员直接把发票图片发到这个邮箱,后端脚本定时扫描邮件、自动识别、汇总到同一张多维表格。这就是一个轻量级的团队报销系统,不需要采购任何SaaS。

某初创公司的财务同学用这套方案处理全公司发票,财务工作量减少了70%,省下来的时间全用在了对账和税务筹划上——那才是真正需要人脑的工作。

---

避坑指南:这些问题我都踩过

Q:发票识别准确率够吗?

主流多模态模型在标准增值税发票上的准确率可以达到98%以上。但有几类情况容易出错:手写发票、图片模糊、发票有折痕遮挡关键字段。建议把 confidence 字段为 low 的发票单独拉出来人工复核,不要盲目信任机器。

Q:公司报销系统不开放API怎么办?

大多数公司用的是用友、金蝶、SAP这类系统,部分版本确实没有开放API。这种情况下,有两个思路:一是把识别结果导出成Excel,手动批量导入(比一张张填还是快很多);二是用RPA工具(如影刀、UiPath)模拟鼠标键盘操作自动填表,不需要API权限。

Q:发票数据上传到云端,有隐私风险吗?

这是个值得认真对待的问题。如果发票涉及敏感业务,建议两个方案:一是用支持私有化部署的模型(如本地跑Qwen-VL);二是在上传前对发票图片做脱敏处理,只保留需要识别的字段区域。对于个人日常报销,调用商业API的风险是可接受的,主流服务商都有数据不用于训练的承诺。

Q:API调用报错或超时怎么办?

大概率是网络问题。推荐使用 [api.884819.xyz](https://api.884819.xyz),国内节点直连,延迟低,支持GPT-4o、Claude等主流模型,按量计费,测试阶段费用极低,跑完本文所有示例代码大概花不到1块钱。

---

现在,就差你动手了

回顾一下今天这套方案的核心:

  • 识别:多模态模型直接看懂发票图片,准确率98%+
  • 提取:精心设计的Prompt稳定输出结构化JSON
  • 批量:一个文件夹扔进去,一次处理完一个月的票
  • 填表:对接飞书/钉钉API,自动写入,自动通知

从45分钟到3分钟,不是魔法,是你今天就能搭起来的工具。

现在,找出你手机里最近一张发票,复制上面的代码,5分钟后告诉我识别结果。

🚀 马上开始:注册 [api.884819.xyz](https://api.884819.xyz) → 获取API Key → 复制本文代码 → 开始你的第一次自动报销

---

💬 留言告诉我:你现在报销一次要花多少时间?按照本文搭完之后又是多少?数据最好的读者,我会在下篇文章里点名@你。
🔧 隐藏关卡:如果你想把这套方案升级成支持多人协作、自动汇率换算、跨境报销的企业级版本,在评论区回复"进阶",我会单独出一篇深度教程。

---

📌 下篇预告

报销搞定了。但你有没有想过——

每周一早上,你的周报是不是也可以自动写?

下一篇我们会做一个"会议纪要→周报→一键发给老板"的全自动Agent,同样是手把手教程,同样不需要你是程序员。你只需要开完会,剩下的交给Agent。

关注8848AI,不要错过。

---

本文由8848AI原创,转载请注明出处。关注8848AI,带你从零开始学AI。

#AI教程 #AI Agent #自动化办公 #报销自动化 #Prompt技巧 #8848AI #人工智能 #效率工具