一江山水的随笔

当前位置:首页 - 技术 - 正文

Enjoy life!

效果先看:AI智能体生成的月度家庭账单报告

每月1号,我的邮箱会自动收到这样一份报告:

  • 总支出:¥8,567.32(比上月增长12%,主要因旅游开销)
  • 消费结构饼图:餐饮35%、购物25%、交通15%、娱乐12%、其他13%
  • 异常支出提醒:某笔¥2,500的“高端电子产品”消费异常(平时此类消费不超过¥500)
  • 趋势分析:餐饮支出连续3个月上升,建议关注
  • 可视化图表:自动生成的柱状图、折线图,一目了然

这一切都是AI智能体自动完成的,我只需要每月导出一次账单CSV文件。下面分享具体实现方法。

第一步:准备账单数据(微信/支付宝导出)

这是最基础的一步,但很多人卡在这里。其实很简单:

微信账单导出

  • 打开微信 → 我 → 服务 → 钱包 → 账单 → 常见问题 → 下载账单
  • 选择时间范围(建议按月),格式选CSV
  • 文件命名:wechat_202405.csv(方便程序识别)

支付宝账单导出

  • 打开支付宝 → 我的 → 账单 → 右上角... → 开具交易流水证明
  • 用于个人对账 → 选择时间 → 生成文件
  • 同样保存为CSV格式,命名:alipay_202405.csv

吐槽一下:支付宝的导出路径藏得真深,我第一次找了半天。

第二步:核心代码实现

我用的Python + pandas + matplotlib,代码不到100行。智能体部分用OpenAI API(也可以用本地模型)。

1. 数据清洗和合并

import pandas as pd
import os

# 读取微信账单(微信的CSV格式有点怪,需要跳过前几行)
def load_wechat_bill(filepath):
    df = pd.read_csv(filepath, skiprows=16, encoding='utf-8')  # 微信前16行是说明
    df = df[['交易时间', '交易类型', '交易对方', '商品', '金额(元)', '支付方式']]
    df['来源'] = '微信'
    return df

# 读取支付宝账单
def load_alipay_bill(filepath):
    df = pd.read_csv(filepath, encoding='gbk')  # 支付宝默认gbk编码
    df = df[['交易创建时间', '交易来源地', '交易对方', '商品名称', '金额(元)', '收/支']]
    df.columns = ['交易时间', '交易类型', '交易对方', '商品', '金额(元)', '支付方式']
    df['来源'] = '支付宝'
    return df

# 合并数据
def merge_bills(wechat_path, alipay_path):
    wechat_df = load_wechat_bill(wechat_path)
    alipay_df = load_alipay_bill(alipay_path)
    combined_df = pd.concat([wechat_df, alipay_df], ignore_index=True)
    combined_df['金额(元)'] = combined_df['金额(元)'].astype(float)
    return combined_df

2. 消费分类(这是关键)

我最初手动写规则分类,后来发现太麻烦。现在用AI智能体自动分类:

import openai

# 初始化OpenAI(需要自己的API key)
openai.api_key = 'your-api-key'

def categorize_expense(description, amount):
    prompt = f"""请将以下消费分类到:餐饮、购物、交通、娱乐、生活缴费、医疗、教育、其他
消费描述:{description}
金额:{amount}元
只返回分类名称,不要解释。"""
    
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.3
    )
    return response.choices[0].message.content.strip()

# 批量分类(注意:API调用有成本,可以缓存结果)
def batch_categorize(df):
    categories = []
    for _, row in df.iterrows():
        desc = f"{row['交易对方']} {row['商品']}"
        cat = categorize_expense(desc, row['金额(元)'])
        categories.append(cat)
    df['分类'] = categories
    return df

实际使用中,我缓存了分类结果,避免重复调用API。第一次运行后,保存分类映射表,下次直接使用。

3. 异常检测和报告生成

def detect_anomalies(df):
    anomalies = []
    
    # 规则1:单笔消费超过阈值
    threshold = 2000  # 根据自己情况调整
    large_expenses = df[df['金额(元)'] > threshold]
    for _, row in large_expenses.iterrows():
        anomalies.append(f"大额消费:{row['交易对方']} {row['商品']} ¥{row['金额(元)']}")
    
    # 规则2:非常规分类的高消费
    unusual_cats = ['医疗', '教育']  # 这些分类平时消费少
    for cat in unusual_cats:
        cat_expenses = df[df['分类'] == cat]
        if len(cat_expenses) > 0:
            total = cat_expenses['金额(元)'].sum()
            if total > 1000:
                anomalies.append(f"{cat}类支出异常:总计¥{total}")
    
    return anomalies

def generate_report(df, anomalies):
    total_expense = df['金额(元)'].sum()
    by_category = df.groupby('分类')['金额(元)'].sum().sort_values(ascending=False)
    
    report = f"月度家庭账单报告\n"
    report += f"总支出:¥{total_expense:.2f}\n"
    report += f"消费结构:\n"
    for cat, amount in by_category.items():
        percentage = amount / total_expense * 100
        report += f"  {cat}: ¥{amount:.2f} ({percentage:.1f}%)\n"
    
    if anomalies:
        report += f"\n异常支出提醒:\n"
        for anomaly in anomalies:
            report += f"  • {anomaly}\n"
    
    return report

4. 可视化图表

import matplotlib.pyplot as plt

def create_charts(df, output_path):
    # 消费结构饼图
    by_category = df.groupby('分类')['金额(元)'].sum()
    plt.figure(figsize=(10, 5))
    
    plt.subplot(1, 2, 1)
    by_category.plot.pie(autopct='%1.1f%%')
    plt.title('消费结构')
    
    # 每日支出折线图
    plt.subplot(1, 2, 2)
    df['日期'] = pd.to_datetime(df['交易时间']).dt.date
    daily_expense = df.groupby('日期')['金额(元)'].sum()
    daily_expense.plot(kind='line', marker='o')
    plt.title('每日支出趋势')
    plt.xticks(rotation=45)
    
    plt.tight_layout()
    plt.savefig(output_path, dpi=150)
    plt.close()

第三步:配置智能体自动化流程

代码写好了,但我不想每月手动运行。我用Windows任务计划(Mac/Linux可以用cron)设置自动化:

  • 每月1号上午9点自动运行脚本
  • 脚本自动读取指定文件夹的最新账单CSV
  • 生成报告和图表,通过邮件发送给我
  • 关键代码:
# 主函数
def main():
    # 1. 加载数据
    wechat_file = find_latest_file('./bills/', 'wechat_')
    alipay_file = find_latest_file('./bills/', 'alipay_')
    df = merge_bills(wechat_file, alipay_file)
    
    # 2. 分类和清洗
    df = batch_categorize(df)
    
    # 3. 检测异常
    anomalies = detect_anomalies(df)
    
    # 4. 生成报告
    report = generate_report(df, anomalies)
    
    # 5. 创建图表
    create_charts(df, './output/monthly_report.png')
    
    # 6. 发送邮件(这里用smtplib,代码略)
    send_email(report, './output/monthly_report.png')
    
    print("月度报告已生成并发送!")

if __name__ == "__main__":
    main()

注意事项和优化建议

  • 隐私安全:账单数据敏感,建议在本地运行,不要上传到第三方服务。我用本地Python环境,只有分类时调用API(描述信息已脱敏)。
  • 成本控制:OpenAI API按token收费,批量分类可能产生费用。我的优化:
    1. 第一次运行后建立“描述-分类”映射表,保存为JSON
    2. 下次遇到相同描述直接查表,不再调用API
    3. 每月新增消费一般不多,实际API成本很低(我每月不到¥5)
  • 分类准确率:AI分类不是100%准确,我定期检查修正。常见问题:
    • “星巴克”被分到“餐饮”正确
    • “滴滴出行”被分到“交通”正确
    • 但有些模糊描述如“商户消费”可能分错,需要手动调整规则
  • 扩展性
    • 可以添加银行卡账单
    • 可以对比预算,给出超支提醒
    • 可以按家庭成员分析(如果账单有备注)

总结

这个AI智能体家庭账单管家我已经用了3个月,效果显著:

  • 时间节省:每月手动整理账单从2小时降到5分钟(只需导出CSV)
  • 洞察提升:异常消费提醒帮我发现了一次误操作(重复扣款)
  • 财务意识增强:可视化图表让我更清楚钱花在哪里

代码已开源在GitHub(搜索“家庭账单AI分析”),你可以直接使用或修改。关键不是代码多完美,而是开始行动——先导出账单,跑通基础流程,再逐步优化。

如果你遇到问题,欢迎在博客留言讨论。下期我可能分享如何让智能体自动做预算规划。

本文来源:一江山水的随笔

本文地址:https://www.298.name/post/155.html

主要内容:让AI智能体当你的家庭财务管家:自动分析账单+生成可视化报告

版权声明:如无特别注明,转载请注明本文地址!

想找什么搜索会更快哦!
站点信息
  • 文章总数:142
  • 页面总数:1
  • 分类总数:4
  • 标签总数:141
  • 评论总数:61
  • 浏览总数:1552107
控制面板
您好,欢迎到访网站!
  查看权限
Top