☰
用OpenClaw搭建本地金融智能体:彻底解决月底对不上账
2026/10/14 23:58:32 网站建设 项目流程

周五晚上十点半,我又一次在记账App里翻了五分钟,还是没想起来这个礼拜的钱到底花在了哪里。这种挫败感想必不少人都有过:明明每一笔消费都发生在眼前,月底拉出账单一看,却像在翻别人的生活。那阵子我实在受不了了,索性在本地跑了一套OpenClaw,给它挂上金融Skill,让它每天自动读取账单、拆分消费类目、计算预算水位,再把日报和周报推到我面前。

这套东西本质上是一个跑在智能体框架里的金融技能模块。它不替你做投资决策,也不追求把每一笔扫码都实时记下来,而是专攻一件事:把分散在各种账单里的资金流水,变成你能看懂、能复盘、能执行预算的信息。它比较适合两类人:一是受够了手动记账、又不想把账单数据交给第三方平台的人;二是有一定技术基础,愿意花一个下午把规则和配置调明白的人。下面我会把这几个月里踩过的坑、总结出的配置思路,以及它实际带来的改变一次说清楚。

1. 从“记账全靠自觉”到“机器替你盯账”——这个Skill到底解决什么问题

你可能想,市面上记账软件多得是,为什么非要自己折腾一个?我先从最朴素的现象说起。

1.1 手动记账为什么总是坚持不下去

记账的核心问题不是懒,而是“记账动作”和“消费动作”之间存在时间间隔。人只有在消费当下掏出手机记录,数据才是可靠的。一旦拖到睡前、拖到“等会儿再说”,记忆就开始失真,分类也开始走样。

我自己做过一个不太严谨的统计:一个月里真正坚持每天记账的时间不到5天,其余全在补录。补录的时候凭着模糊记忆把“外卖”记成“食品”,把“打车”记成“交通”,这些分类误差对后续分析是致命的。更麻烦的是,即便每一笔都记下来了,月底还是要自己对着表格看半天才能回答“这个月外卖花了多少、是不是比上月多了”这种最基本的问题。

自动记账App我也试过,它们给了另一种答案:读取短信或通知权限来识别消费,再把分类逻辑做成黑盒。使用者没法自定义“什么是日常餐饮、什么是情绪性消费”,想要一条“外卖超支预警”也得不到,只能在柱状图里自己找。说到底,我需要的是分析和判断能力,不是记录能力。

1.2 为什么选“本地智能体+技能模块”而不是记账App

选择本地智能体框架而不是现成App,有三个理由。

第一是隐私。账单数据属于最敏感的个人数据之一,本地处理意味着导出、解析、分类、报告生成全部在自己机器上完成,数据不出设备。这种掌控感是第三方服务给不了的。

第二是规则自定。我可以按自己的消费习惯定义分类、设定预算,而不是接受“餐饮”“交通”“购物”这种粗粒度分类。比方说“便利店早餐”和“便利店日用品”在商户名上都叫便利店,但我想把它们分开统计,这只有可配置的规则引擎能做到。

第三是Skill机制带来的解耦。OpenClaw这类智能体框架把能力拆成技能模块,金融Skill只需要关注金融数据的解析、分析和输出,不需要重复造框架轮子。框架负责调度、配置、消息推送,技能模块负责业务逻辑。这种分层让后续维护轻松很多,也方便把日报推送到IM机器人等日常工具里。

1.3 适用边界:它适合谁,不适合谁

把话说清楚,这不是一个点开即用的商品级软件,而是一个需要花心思调教、调好之后非常趁手的工具。

适合的人群有这么几种:每个月能固定拿到账单数据的人,比如从银行、支付平台导出CSV,或者用邮件自动转发电子账单;希望长期追踪消费、设置预算并执行的人;愿意花一两个小时调配置文件的人。

不适合的情况也很明确:完全不想碰配置文件、打开就想用的人;只需要“记个流水账”的人;期待默认配置下机器就能完美自动分类、不需要任何规则调优的人。如果你属于后面这些情况,现成记账App确实更省心。

2. 项目整体拆解:数据怎么进来、规则怎么跑、提醒怎么出去

整个金融Skill的工作流可以概括成一条链路:原始账单进、清洗解析、分类打标签、算预算水位、生成报告推送。工程实现上我把它拆成了三个独立层:接入层、规则层、输出层。

2.1 数据接入层:不靠手敲,直接解析交易流水

接入层负责把各种渠道的账单数据变成统一的内部结构。最常见的三种数据源是支付平台或银行导出的CSV、PDF账单,以及邮件里自动推送的电子账单。

每种数据源都需要写一个独立的解析器。解析器的职责是把五花八门的原始字段映射成内部标准模型,核心字段就四个:时间、金额、商户、备注。下面是一份典型映射关系:

原始字段示例内部字段标准化说明
交易时间 / 交易日期timestamp统一转成ISO格式,记录时区
金额 / 收支amount负数为支出,正数为收入
商户名称 / 对方户名counterparty用于分类判断的关键字段
商品说明 / 备注memo辅助分类,比如包含“退款”就特殊处理

数据清洗是接入层里最脏最累的活,但必须做扎实。我总结了三个必做动作:剔除表头重复行和底部合计行;把“2024/1/5”“2024-01-05”这类不同格式统一成一种;处理CSV文件的编码问题,中文乱码多半就栽在这一步。

2.2 规则引擎:分类、预算、异常检测是三个独立层级

规则引擎我强烈建议拆成三个互不耦合的层级,千万别揉在一起。

分类层负责给每笔交易打标签。基础方法是关键词命中、商户白名单、金额区间组合打分。比如“商户名包含某外卖平台且金额小于50元”大概率是工作日的午餐。预算层针对每个分类设月度配额,按天计算消耗速度,如果月中已用掉80%就提前预警。异常检测层做三件事:识别单笔金额和历史同分类中位数偏差超过3倍的交易;识别同一商户连续月份扣款的隐蔽订阅;识别深夜时间段的高频消费作为参考信号。

所有规则都放在配置文件里,YAML或JSON都可以。规则调整不需要改代码,这是长期维护最重要的一点。消费习惯会变,平台会临时改名,没有任何规则是一劳永逸的。

2.3 输出层:从“一堆数据”变成“一句人话”

报告内容的设计讲究克制。日报不需要给一堆统计图,只说三件事:今天总共花了多少、哪个分类超支、明天需要注意什么。周报给趋势和异常项,比如“本周外卖支出比上周高18%”这种可以指导下周调整的结论。

生成方式用模板加数据填充就够了,不一定每次调用大模型。模板方案可预测、速度快、成本为零,如果想要“人话”更自然,可以留一个可选的润色接口,但默认模板已经够用。投递渠道上,命令行直接打印是最基本的水平;更实用的是通过webhook推到IM工具,每天晚上固定时间收到一条总结;邮件可以当作兜底渠道。我自己的习惯是周一早上收周报,比周六晚上看到一周总支出心理压力小一点。

3. 手把手配置:从零搭建属于你自己的金融Skill

这部分是“抄作业”章节。我这里假设OpenClaw框架已经装好,金融Skill作为技能模块存在。下面按我实际部署的流程走一遍,每一步都解释为什么这样做。

3.1 安装与目录结构:先搞清楚钱和文件放哪

环境要求是Python3.10以上。从项目仓库拉取代码后,创建虚拟环境并安装依赖,核心依赖并不多:CSV解析、日期解析、YAML读取、HTTP请求(推消息用)。

目录结构按能力分层:

skills/finance/ ├── config/ │ └── config.yaml ├── rules/ │ └── categories.yaml ├── parsers/ │ ├── csv_parser.py │ └── pdf_parser.py ├── reports/ │ └── templates/ ├── input/ │ └── transactions.csv └── output/ └── daily_report.md

目录别乱放。配置文件分散是后期维护最大的痛苦源,所有配置尽量收在config和rules两个目录里,input只放原始账单,output放生成报告。

3.2 配置文件逐个字段拆解

核心配置文件是config.yaml,下面这份是我跑起来的真实结构。每个字段都直接对应前面说的三层设计:

data_sources: - name: my_wallet type: csv path: input/transactions.csv encoding: utf-8 field_map: date: 交易时间 amount: 金额 counterparty: 商户 memo: 备注 budget: monthly: dining: 1200 transport: 500 shopping: 800 subscription: 200 rules: categories_file: rules/categories.yaml confidence_threshold: 0.7 output: daily: true weekly: true channel: webhook webhook_url: "http://your-bot.example/webhook"

逐个说关键点。data_sources里的field_map是整个数据接入的接线图,不同平台的CSV列名完全不同,这一步就是把原始列名映射到内部字段,映射错了后面全错。budget里一行一个分类的月度额度,这里提醒一下:初始额度别拍脑袋,先统计过去3个月每类的平均值再定。rules里的confidence_threshold是分类置信度阈值,低于它的交易会被放进“待确认”清单。output的channel可以先配成local,等日报逻辑稳定了再换成webhook。

3.3 从样例数据到第一份报告的四步

首次运行强烈建议只用一小批数据验证链路通不通。我的流程是这样:

  1. 从支付平台导出最近10行真实账单存成CSV,放到input目录。
  2. 运行解析命令,观察日志里有没有报错。
python -m skills.finance parse --source my_wallet
  1. 解析成功后,运行报告命令:
python -m skills.finance report --daily
  1. 人工核验报告里的分类结果。

首次运行最常见的三种报错,基本可以对照排查:

报错现象常见原因解决办法
中文乱码CSV编码不是UTF-8把encoding改成gbk,或统一转utf-8
字段解析失败表头列名和field_map对不上打开原始CSV核对第一行列名
时间解析异常混合了多种日期格式在parser里补充格式模板

一定先跑10行数据验证再全量导入,这是我最想强调的一条经验。

4. 分类规则这块最难:如何调出一套不误伤的判断逻辑

接到原始账单之后,最耗时间的不是写代码,而是调分类规则。我觉得有必要单独写一章聊聊这里面的门道。

4.1 为什么关键词匹配那么容易翻车

关键词匹配看起来简单,用起来全是坑。举两个我实际遇到的例子。

第一个案例:某电商平台既卖日用品也卖数码产品,我一开始按平台名做关键词分类,结果“数码”类目里混进了牙膏和洗衣液。每个平台都是一个综合商场,只看平台名没办法区分你到底买了什么。

第二个案例:两个外卖平台名字里带有同一个常见字,分类规则只写了其中一个,导致另一个平台的订单全部掉进“其他”分类。平台会改名,会开子品牌,完全依赖关键词白名单一定会有漏网之鱼。

核心问题在于:消费行为是由“场景”决定的,不是由“商户名”决定的。同样是便利店,早上买个面包是餐饮场景,晚上买一箱饮料回家就是购物场景。单靠关键词匹配,天然无法区分场景。

4.2 一套可靠的判断顺序:先确定、再否定、最后模糊

我后来把分类逻辑改成三段式决策,效果明显变好。

第一步先处理确定项。把常去的、业务单一的商户写进白名单,直接指定分类。比如常去的某个连锁健身房,直接归为“运动”。名单匹配可以给最高置信度。

第二步处理否定项。商户名命中了分类A的关键词,但备注里有“退款”“撤销”之类的字样,应该跳过或归到退款类。这一步能挡掉一大批脏数据。

第三步处理模糊项。剩余条目看关键词加金额加频次做打分。比如“便利店消费20元”归为餐饮,“便利店消费200元”归为购物。规则示例:

categories: dining: keywords: [外卖, 餐厅, 咖啡, 食堂, 饭] exclude: [超市, 京东, 商城] min_amount: 1 shopping: keywords: [超市, 京东, 天猫, 商城] alias: [某电商, 某仓储] min_amount: 50

金额这个特征很有用。它能在商户名完全相同的情况下区分消费场景,是关键词之外最重要的辅助信号。

4.3 用置信度兜底,让规则越用越准

再好的规则也有判断不了的时候,所以一定要引入置信度机制。命中白名单给0.95分;关键词命中但没有排除项给0.8分;仅靠金额和频率推断的给0.6分。低于阈值0.7的交易进入“待确认”清单。

每周花10分钟人工过一遍待确认项,这是让规则越来越准的关键。这些漏网之鱼往往是最值得补充规则的样本:你会发现某个平台改了名称、某个商户卖的东西跨了两个分类、某类退款逻辑没处理干净。把每一条新认知沉淀进rules文件,一个月之后分类准确率会有质的变化。

我实测的数据是:第一周分类准确率大约70%,一个月后超过90%。不要追求一次性做出一套万能规则,分类不存在万能规则,它靠的是持续迭代。

5. 运行了3个月,我看到的效果和踩过的坑

工具好不好,跑一段时间才知道。下面是我连续运行三个月的真实记录。

5.1 最明显的变化:消费行为真的转向了

曾经某个月外卖支出占了总消费的31%,装上金融Skill的第二个月,这个比例降到了22%左右。不是因为突然戒掉了外卖,而是每天都会看到“今日餐饮预算已使用80%”的提醒,点外卖之前多了一个思考的瞬间。

关键变化是反馈周期从一个月缩短到一天。数字不再是月末的惊吓,而是每天的实况。人面对“本月还剩20%预算”和面对“本月超支200元”时的心理感受完全不同,前者引导行动,后者只带来焦虑。

预算预警确实有效。交通类预算剩余不多的时候,我自然就倾向选择地铁而不是打车。另一个我发现的价值是隐蔽订阅的暴露:几个记不清在扣费的互联网服务,加起来每月几百块,取消之后立刻清爽。这些订阅之前从来没被我注意到过,因为分散在不同账单里。

5.2 四个必须写进文档的坑

运行三个月,踩过的坑不少,挑四个最典型的说清楚。

坑现象排查与修复
重复流水同一笔交易出现两次,总额虚高按“时间+商户+金额”三元组做去重,先去重再分类
时区错位晚上11点的消费被算到第二天解析时固定指定时区,统一存本地时间并记录偏移
退款被当作收入退款单独出现,扰乱分类统计退款先归入refund类,再从原分类里抵扣
“其他”类目膨胀大量交易落入其他,分析失去意义其他类占比超15%就补充新分类或检查规则漏洞

重复流水这个坑最隐蔽。有些平台支付成功后会同步两遍流水,有时候一笔支付拆成两条记录。我不能只看商户名去重,必须用时间、商户、金额三个字段联合判断。时区问题则是因为平台导出的时间戳是UTC,本地没转换,导致深夜交易归日错误,处理方式就是解析时强制转成Asia/Shanghai这种固定时区。

退款问题不处理好,每个月收入数字都是虚高的。我的做法是退款先单列,月底对冲原支付记录,这样“净支出”才是真实消费。

5.3 我后来做的扩展:订阅检测、日历对比与净资产曲线

基础分类跑顺之后,我又加了三个让“金融顾问”属性更强的扩展。

订阅检测扫描近12个月同一商户的月度扣款记录,自动输出订阅清单,标出总金额和续费价格。这个功能帮我发现了三四个遗忘的订阅,年化金额不小。

日历对比做的是“计划内”和“计划外”支出区分。把房租、通讯费、定期储蓄这些固定支出标到日历上,Skill就能自动判断一笔支出是否在预期内,计划外支出才是真正需要控制的弹性部分。

净资产曲线是最后加的:每周末把储蓄账户余额、活期理财估值导入,和支出数据合在一起画月度净资产变化。支出分类只是一个切面,“钱在变多还是变少”才是最终指标。这些扩展都需要更多数据源,所以接入层从一开始就必须留好解析器扩展点。

跑到现在,我对这套东西最深的感受是:金融Skill并不能直接帮你省钱,它真正做的其实是消除你和钱之间的“信息差”。当你每天都能看到预算水位、每周都能看到消费结构变化时,很多调整是自然而然发生的。如果你也在为月底的“钱去哪了”发愁,又不愿意把账单数据交给第三方,强烈建议自己搭一套。先从一个简单的CSV解析器开始,跑通再慢慢加规则,这是我走完之后最推荐的路径。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询