智能记账本:OpenClaw+Qwen3.5-9B解析消费短信生成财务报告
智能记账本OpenClawQwen3.5-9B解析消费短信生成财务报告1. 为什么需要短信记账方案每次月底查看信用卡账单时总会被突如其来的消费金额吓一跳。传统记账App要么需要手动输入每笔消费要么要求绑定银行账号——前者太麻烦后者又有隐私顾虑。直到上个月收到一条您尾号1234的信用卡消费58元XX超市的短信时我突然意识到这些被忽略的短信不就是最天然的消费数据库吗经过两周的折腾我成功用OpenClawQwen3.5-9B搭建了一套零成本、全本地化的智能记账系统。现在只需将短信转发到指定号码系统就会自动提取消费金额、商户、时间等关键信息智能分类餐饮/交通/购物等对比月度预算生成可视化报表整个过程完全在本地完成不需要银行API授权也不会上传任何敏感数据。下面分享具体实现过程包含我踩过的坑和最终验证有效的方案。2. 技术方案设计2.1 核心组件分工系统由三个核心模块构成短信抓取模块通过Android自动化工具监听短信需Root权限或使用备用机转发短信信息处理模块OpenClaw负责调度Qwen3.5-9B模型解析短信内容数据展示模块用Python的Matplotlib生成可视化图表graph TD A[消费短信] -- B{短信来源} B --|安卓主手机| C[Tasker抓取] B --|备用机| D[短信转发] C D -- E[OpenClaw消息队列] E -- F[Qwen3.5-9B解析] F -- G[分类金额提取] G -- H[预算对比] H -- I[图表生成]2.2 为什么选择Qwen3.5-9B测试过多个开源模型后Qwen3.5-9B在消费短信解析上展现出独特优势实体识别准确能准确提取58元、XX超市等关键信息分类智能能区分星巴克属于餐饮而非购物上下文理解将退款-30元识别为支出减少而非收入本地部署友好9B参数规模在RTX 3090上推理速度达28tokens/s对比测试显示在200条真实消费短信上的识别准确率模型金额准确率商户准确率分类准确率Qwen3.5-9B98.2%95.7%93.4%ChatGLM3-6B96.1%91.3%88.9%Llama3-8B-Instruct94.5%89.2%85.6%3. 具体实现步骤3.1 环境准备需要先部署以下基础服务OpenClaw服务Mac环境示例curl -fsSL https://openclaw.ai/install.sh | bash openclaw onboard --provider qwen --model qwen3-9bQwen3.5-9B模型服务使用星图平台镜像docker run -d -p 5000:5000 \ -v /path/to/models:/app/models \ registry.cn-hangzhou.aliyuncs.com/csdn/qwen3.5-9b:latest短信接入方案二选一方案A安卓Root使用TaskerAutoTools监听短信数据库方案B物理隔离用备用手机通过IFTTT转发短信到Telegram机器人3.2 OpenClaw配置关键点修改~/.openclaw/openclaw.json配置模型端点{ models: { providers: { qwen-local: { baseUrl: http://localhost:5000/v1, api: openai-completions, models: [{ id: qwen3-9b, name: Local Qwen }] } } } }验证模型连接openclaw gateway restart curl -X POST http://localhost:18789/v1/chat/completions \ -H Content-Type: application/json \ -d { model: qwen3-9b, messages: [{role: user, content: 解析短信: 您尾号1234消费58元(XX超市)}] }3.3 短信解析Prompt设计经过多次调整最终使用的系统Prompt模板你是一个专业财务助手需要从短信中提取 1. 交易金额带±符号区分收支 2. 商户全称去除银行提示文本 3. 消费分类餐饮/交通/购物/娱乐/医疗/其他 4. 交易时间缺省时为当前时间 返回JSON格式示例 { amount: -58.0, merchant: XX超市, category: 购物, date: 2024-03-15 } 当前短信[用户输入]这个Prompt的优化过程踩过两个坑最初忘记要求负号表示支出导致退款被误记为收入早期版本没有限制商户名称长度会把尊敬的客户您...也包含进来3.4 预算对比算法在~/.openclaw/skills/finance.py中实现预算逻辑def check_budget(category, amount): budgets { 餐饮: 1500, 购物: 2000, 交通: 800 } spent load_from_db(category) # 从SQLite读取已消费额 ratio (spent amount) / budgets.get(category, float(inf)) if ratio 0.9: return f⚠️ {category}预算即将用完已用{ratio*100:.1f}% elif ratio 1: return f❌ {category}预算已超支{abs(1-ratio)*100:.1f}% else: return f✅ {category}预算剩余{budgets[category]-spent-amount:.2f}元4. 效果展示与使用技巧4.1 典型工作流当收到新短信时OpenClaw自动触发Qwen3.5-9B进行解析结果存入SQLite数据库每日8点生成消费报告PDF并发送到邮箱# 报表生成代码片段 def generate_report(): df pd.read_sql(SELECT * FROM transactions, con) plt.figure(figsize(10,6)) df.groupby(category)[amount].sum().plot.pie(autopct%1.1f%%) plt.savefig(/tmp/daily_report.png) pdf FPDF() pdf.add_page() pdf.set_font(Arial, size12) pdf.cell(200, 10, txt每日消费报告, ln1, alignC) pdf.image(/tmp/daily_report.png, x30, y20, w150) pdf.output(/tmp/daily_report.pdf)4.2 实际案例解析不同格式短信的表现短信原文解析结果消费通知您信用卡8888于3/15在美团支付¥38.5{amount: -38.5, merchant: 美团, category: 餐饮, date: 2024-03-15}入账通知工资收入12,500元{amount: 12500.0, merchant: 公司, category: 收入, date: 2024-03-10}退款淘宝订单退回129元{amount: 129.0, merchant: 淘宝, category: 购物, date: 2024-03-12}4.3 性能优化技巧模型预热每天首次调用前发送预热请求curl -X POST http://localhost:5000/v1/chat/completions \ -H Content-Type: application/json \ -d {model: qwen3-9b, messages: [{role: user, content: ping}]}批量处理积累10条短信后统一处理减少模型调用次数缓存机制对常见商户如星巴克直接读取缓存分类结果5. 常见问题解决方案5.1 短信格式差异处理不同银行的短信格式千差万别通过添加异常处理逻辑应对try: result parse_sms(sms_content) except Exception as e: # 触发人工修正流程 send_to_telegram(f解析失败: {sms_content}\n错误: {str(e)}) result manual_fix(sms_content) # 将消息转到手机端手动处理5.2 模型响应不稳定通过设置fallback机制保障可用性首次调用超时2秒后自动降级到规则匹配模式连续3次解析失败后触发邮件告警5.3 数据隐私保护所有数据流动路径graph LR A[手机短信] -- B[本地服务器] B -- C[SQLite数据库] C -- D[可视化图表] style A stroke:#f00 style D stroke:#0a0关键安全措施数据库加密使用SQLCipher加密存储网络隔离处理服务器禁止外网访问日志脱敏自动删除原始短信内容这套系统已经稳定运行一个月成功帮我发现三个订阅服务的自动续费每月节省217元。最惊喜的是Qwen3.5-9B在商户归类上的智能表现——它甚至能区分盒马鲜生属于生鲜杂货而盒马会员店属于仓储购物。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。