泠不丁头像
关注
超市手撕小票品类归一 Prompt:把“散装后腿肉“自动映射为 Beancount 资产科目封面图

超市手撕小票品类归一 Prompt:把“散装后腿肉“自动映射为 Beancount 资产科目

超市手撕小票品类归一 Prompt:把"散装后腿肉"自动映射为 Beancount 资产科目

封面信息图

在家庭采用 Beancount 复式记账(Plain Text Accounting) 时,最耗费人工精力的环节,莫过于对海量日常消费小票进行会计科目归类与文本标准化

老妈从菜市场、生鲜超市拿回来的手撕购物小票,商品命名极其口语化且混乱:

  • "散装前腿夹心肉 1.2kg"
  • "精选本地落苏(特价)"
  • "特仑苏纯牛奶 250ml*12 礼盒装"
  • "超能植翠洗衣液 3kg 补充装"

如果每次都要人工打开文本编辑器,一行行敲入 Expenses:Food:Groceries:MeatExpenses:Home:Supplies,记账就会成为一种难以坚持的沉重负担。

为了实现小票拍照 $\to$ OCR 提取 $\to$ 智能大模型自动科目归一化 $\to$ Beancount 分录一秒直出,我设计了一套专门针对商品口语别名消歧与复式记账科目映射的 Few-Shot Prompt 体系

flowchart TD
    RawReceipt[超市小票杂乱条目:\n'散装后腿肉 48元' / '本地落苏 6.5元' / '特仑苏礼盒 65元'] --> ReceiptPrompt[商品实体识别与科目归一 Prompt]
    ReceiptPrompt --> Item1[散装后腿肉 -> Expenses:Food:Meat (食材/生鲜肉类)]
    ReceiptPrompt --> Item2[本地落苏 -> Expenses:Food:Vegetables (食材/新鲜蔬菜)]
    ReceiptPrompt --> Item3[特仑苏礼盒 -> Expenses:Food:Dairy (乳品饮料)]
    Item1 & Item2 & Item3 --> BeancountGen[自动生成标准借贷平衡的 Beancount 分录]

Beancount 家庭科目体系的标准分层规范

为了保持账本的清爽与可维护性,我们定义了四级生活会计科目树:

Expenses (支出)
├── Food (餐饮食品)
│   ├── Groceries (生鲜食材)
│   │   ├── Meat (肉禽蛋品)
│   │   ├── Vegetables (新鲜蔬菜)
│   │   └── Fruits (当季水果)
│   ├── Dining (外出聚餐)
│   └── Snacks (零食饮料)
├── Home (居家日常)
│   ├── Supplies (清洁日化)
│   └── Utilities (水电燃气网费)
├── Health (医疗保健)
│   └── Pharmacy (药箱与常备药)
└── Transport (交通出行)

生产级小票分类 Few-Shot Prompt

### 角色定义
你是一个严谨的家庭复式记账会计专家。你需要将超市小票中的杂乱商品名称,精准归纳为标准的 Beancount 支出会计科目。

### 科目映射规则库
- 猪肉/牛肉/鸡鸭/鱼虾 -> `Expenses:Food:Groceries:Meat`
- 蔬菜/菌菇/豆制品 (如落苏/白菜/豆腐) -> `Expenses:Food:Groceries:Vegetables`
- 水果/鲜切果盘 -> `Expenses:Food:Groceries:Fruits`
- 牛奶/酸奶/果汁/茶叶 -> `Expenses:Food:Groceries:Dairy` 或 `Expenses:Food:Snacks`
- 洗衣液/纸巾/洗洁精/垃圾袋 -> `Expenses:Home:Supplies`
- 创可贴/感冒药/降压药 -> `Expenses:Health:Pharmacy`

### Few-Shot 示例

#### 输入小票条目:
1. 散装五花肉 1.2kg 45.60元
2. 本地落苏 2包 8.40元
3. 心相印卷纸 1提 24.90元

#### 输出 JSON 结构:
{
  "transaction_date": "2026-09-14",
  "payee": "物美生鲜超市",
  "items": [
    {
      "raw_name": "散装五花肉 1.2kg",
      "clean_name": "鲜五花肉",
      "amount": 45.60,
      "account": "Expenses:Food:Groceries:Meat"
    },
    {
      "raw_name": "本地落苏 2包",
      "clean_name": "新鲜茄子",
      "amount": 8.40,
      "account": "Expenses:Food:Groceries:Vegetables"
    },
    {
      "raw_name": "心相印卷纸 1提",
      "clean_name": "卫生卷纸",
      "amount": 24.90,
      "account": "Expenses:Home:Supplies"
    }
  ],
  "total_amount": 78.90
}

Python 端 Beancount 账本自动写入器

from datetime import datetime

def format_to_beancount(data: dict, asset_account: str = "Assets:Alipay:Balance") -> str:
    date_str = data.get("transaction_date", datetime.now().strftime("%Y-%m-%d"))
    payee = data.get("payee", "超市生鲜")
    total = data.get("total_amount", 0.0)

    lines = [f'{date_str} * "{payee}" "日常采购"']
    for item in data["items"]:
        lines.append(f'  {item["account"]}  {item["amount"]:.2f} CNY ; {item["clean_name"]}')
    
    # 贷方资产科目扣减 (保证借贷平衡)
    lines.append(f'  {asset_account}  -{total:.2f} CNY\n')
    return "\n".join(lines)

杂乱数据沉淀为秩序之美

一张揉成一团、沾满水渍的超市小票,在算法的梳理下,瞬间转化为一段格式严谨、借贷平衡的纯文本复式记账分录。

用技术的确定性驯服生活碎片的杂乱无章,让每一分钱的去向清晰明了,这便是一个工程师对家庭秩序最优雅的把控。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/specter__/article/details/165278750

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--