
同一天两笔 28 元,一笔午餐,一笔停车。若程序按“金额相等、日期相近”把第一条候选消耗掉,剩下的差额就会被错误归因。再让模型解释差额,它甚至可能为一笔转账补出不存在的用途。
自动对账要先区分候选与确认。模型可以整理备注或提示核实方向,不能把模糊证据升级为财务事实。
匹配是一组约束,不是一个相似度
至少保留交易编号、币种、金额、日期、商户与状态。日期窗口只用来找候选;唯一候选也未必正确,退款、分期、手续费、汇率与合并付款都需要额外规则。这里讨论个人记录整理,不提供投资、税务或法律判断。
2026 年 10 月 22 日 ThinkingBox 研究把最终数据库记录作为核对依据。对账也应核查具体哪条记录被关联,不能把模型说“已经对上”当成完成证据。研究说明

一个不贸然确认的匹配器
保存为 reconcile.py。金额用 Decimal,示例不接银行、不改真实账本;它只输出候选状态。
from decimal import Decimal
bank = [
{"id": "b1", "day": "2026-10-20", "amount": Decimal("28.00"),
"currency": "CNY", "merchant": "餐馆"},
{"id": "b2", "day": "2026-10-20", "amount": Decimal("28.00"),
"currency": "CNY", "merchant": "停车场"},
]
def candidates(note):
found = [b["id"] for b in bank
if b["amount"] == note["amount"]
and b["currency"] == note["currency"]
and b["day"] == note["day"]
and (not note["merchant"] or b["merchant"] == note["merchant"])]
state = "none" if not found else "review"
return {"state": state, "candidates": found}
note = {"day": "2026-10-20", "amount": Decimal("28.00"),
"currency": "CNY", "merchant": ""}
assert candidates(note)["candidates"] == ["b1", "b2"]
assert candidates({**note, "merchant": "餐馆"})["candidates"] == ["b1"]
assert candidates({**note, "currency": "USD"})["state"] == "none"
assert len(bank) == 2
print(candidates(note))
即使商户完全一致,这个教学函数仍要求复核。扩展自动确认时,要证明交易编号等稳定字段能建立唯一关系,并保存规则版本、确认者和撤销记录,不能只靠模型的“信心”。
提示词应该限制推断
可以要求:“只引用输入中的商户和用途;缺失用途填 null;列出需要用户核实的交易编号。”结构化输出方便落地,但仍需检查编号存在、金额与币种未改、同一交易没有被重复关联。Ollama 文档
本文实跑了多候选、唯一候选和跨币种拒绝,未执行真实金融平台集成或模型识别。不急着把差额抹平,才能保住账本的可信度。
本文探讨生活账单自动对账的核心挑战:金额相同不等于可确认匹配。强调匹配应基于多维约束(交易编号、币种、金额、日期、商户、状态),而非相似度;指出模型仅能生成候选,不可越权确认;要求提示词严格限制推断,输出结构化、可验证字段,并保留复核机制。Decimal精度、候选复核流程与提示词约束是保障财务可信的关键技术点。

84

被折叠的 条评论
为什么被折叠?



