🧠 图解记忆:发票Agent的常见挑战;点击图片可查看原图。
💡 答案要点
系统架构:
用户上传发票图片
↓
┌─────────────────────────────────────────┐
│ 发票识别Agent │
├─────────────────────────────────────────┤
│ 1. OCR识别 → 提取文字(发票号、金额、日期) │
│ 2. 多模态理解 → 验证发票真实性 │
│ 3. 结构化解析 → 提取关键字段 │
│ 4. 规则校验 → 判断是否合规 │
│ 5. 知识库检索 → 匹配报销政策 │
│ 6. 输出结构化数据 → 写入报销系统 │
└─────────────────────────────────────────┘完整实现:
展开 Python 代码示例(55 行)
python
class InvoiceProcessingAgent:
def __init__(self):
self.vision_llm = GPT4o()
self.ocr = PaddleOCR(lang="ch") # 中文OCR
self.vector_db = MilvusCollection("报销政策")
self.erp_api = ERPSystemAPI()
def process_invoice(self, invoice_image: Image) -> dict:
# Step 1: OCR预处理
ocr_result = self.ocr.ocr(invoice_image)
raw_text = self.extract_text(ocr_result)
# Step 2: GPT-4V结构化提取
structured = self.vision_llm.analyze_image(
invoice_image,
prompt=f"""
从发票中提取以下结构化信息(JSON格式):
{{
"invoice_number": "发票号",
"date": "开票日期",
"amount": "总金额",
"tax_amount": "税额",
"seller": "销售方名称",
"buyer": "购买方名称",
"items": ["商品明细列表"]
}}
如果字段为空或无法识别,填null。
原始OCR文字:{raw_text}
"""
)
data = json.loads(structured)
# Step 3: 真实性校验
tax_result = self.verify_tax发票(tax_number=data.get("seller"))
data["tax_valid"] = tax_result.is_valid
# Step 4: 报销政策检索
policy = self.vector_db.search(
query=f"报销政策 {data['items']}",
top_k=1
)[0]
# Step 5: 合规性判断
data["reimbursement"] = {
"eligible": data["amount"] <= policy.max_limit,
"category": policy.category,
"approved_amount": min(data["amount"], policy.max_limit),
"reason": "超出限额" if data["amount"] > policy.max_limit else "通过"
}
# Step 6: 写入ERP
if data["reimbursement"]["eligible"]:
self.erp_api.submit_expense(data)
return data发票Agent的常见挑战:
| 挑战 | 原因 | 解决方案 |
|---|---|---|
| 模糊图片 | 手机拍摄质量差 | 多帧超分辨率/让用户重拍 |
| 弯曲票据 | 扫描仪不平 | 透视变换校正 |
| 手写发票 | 传统发票仍有手写 | 手写识别模型/人工复核 |
| 格式不规范 | 各地发票格式差异 | 用GPT-4V自适应理解 |
| 重复报销 | 同一发票多次提交 | 发票号哈希去重 |
面试话术:
示例表达(仅在能用本人经历或可复现实验佐证时使用): "我做过发票识别Agent,核心难点是'不同格式的发票如何统一理解'。我的方案是:先用OCR提取文字,再用GPT-4V理解结构,最后用规则+知识库校验。实际准确率达到95%,剩余5%复杂情况人工复核。"
