Skip to content
🔗 分享本题
查看我的学习进度 →

21 模块 Q8 教学图:如何设计一个发票识别+报销Agent?

🧠 图解记忆:发票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%复杂情况人工复核。"

📚 参考:LLaVA:Visual Instruction Tuning(图文理解代表架构)