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

在家庭采用 Beancount 复式记账(Plain Text Accounting) 时,最耗费人工精力的环节,莫过于对海量日常消费小票进行会计科目归类与文本标准化。
老妈从菜市场、生鲜超市拿回来的手撕购物小票,商品命名极其口语化且混乱:
"散装前腿夹心肉 1.2kg""精选本地落苏(特价)""特仑苏纯牛奶 250ml*12 礼盒装""超能植翠洗衣液 3kg 补充装"
如果每次都要人工打开文本编辑器,一行行敲入 Expenses:Food:Groceries:Meat 或 Expenses: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



