我用50行代码,把报销时间从45分钟压到3分钟
我用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_url填https://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提交到公司报销系统。
results 里的每条数据 POST 到对应接口,就能实现自动填表。飞书的官方文档里有Python示例,照着改10行代码就够了。
不想写代码的方案:用 n8n(开源自动化工具)可以实现同样的效果,完全图形化拖拽配置,把"HTTP请求节点"和"飞书节点"连起来,不需要写任何代码。国内也有很多人用 扣子(字节跳动出品的Agent平台)搭类似的工作流,上手更快。
---
进阶玩法:让你的报销Agent更聪明
基础版跑通之后,这套方案的天花板其实很高。分享三个升级方向:
① 自动超标预警在提取完金额之后,加一段逻辑:对照公司报销标准(比如出差餐饮每天不超过150元),自动判断是否超标,超标的在飞书表格里标红,并附上提示。这个逻辑用10行Python就能写完。
② 对接审批流飞书和钉钉都支持"审批应用API",可以直接通过代码创建一条审批单,自动带上识别出来的发票信息,发给指定审批人。审批人只需要在手机上点"同意",整个流程无需任何人工录入。
③ 多人协作版如果你是团队财务负责人,可以搭一个共享的收件邮箱,团队成员直接把发票图片发到这个邮箱,后端脚本定时扫描邮件、自动识别、汇总到同一张多维表格。这就是一个轻量级的团队报销系统,不需要采购任何SaaS。
某初创公司的财务同学用这套方案处理全公司发票,财务工作量减少了70%,省下来的时间全用在了对账和税务筹划上——那才是真正需要人脑的工作。
---
避坑指南:这些问题我都踩过
Q:发票识别准确率够吗?主流多模态模型在标准增值税发票上的准确率可以达到98%以上。但有几类情况容易出错:手写发票、图片模糊、发票有折痕遮挡关键字段。建议把 confidence 字段为 low 的发票单独拉出来人工复核,不要盲目信任机器。
大多数公司用的是用友、金蝶、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 #人工智能 #效率工具