ChatGPT工作文档AI 评分 · 73/100AI 辅助编辑·未发现明显提示词注入风险n8n.io

AI 自动解析银行对账单并分类交易流水

通过 n8n webhook 接收 PDF/Excel/CSV 对账单,经 AI 提取结构化交易数据,分类后存入 PostgreSQL 并返回汇总

有一点经验步骤流程提示词
给谁
需要自动化处理银行对账单、提取交易并分类存储的财务或运营人员
你会得到
上传对账单文件后,自动获得含账户信息、交易明细、支出分类汇总的标准化 JSON 响应,数据持久化到数据库
你需要
n8n · postgres

硬约束

前置条件:可访问的 n8n 实例;OpenAI API 密钥(openAiApi 凭证);PostgreSQL 数据库及写入权限;需预先创建 bank_statements 表。输入为 PDF、Excel 或 CSV 格式的银行对账单文件;输出为 JSON 汇总及数据库记录。来源声称设置时间约 8–12 分钟。

他们做了什么

来源作者 vinci-king-01 在 n8n 上发布了一个工作流模板,包含 9 个节点:Webhook 接收上传、Code 提取文件信息、If 路由文件类型、Extract from File 提取 PDF 文本、Spreadsheet File 解析 Excel/CSV、OpenAI 节点提取结构化交易数据、Code 清洗汇总、Postgres 存储、Respond to Webhook 返回 JSON。模板描述声称支持 PDF、Excel、CSV 三种格式,使用 GPT-4 系列模型进行提取与自动分类,分类涵盖 groceries、dining、gas 等 10 类,数据最终存入 PostgreSQL。

效果如何

来源声称设置时间约 8–12 分钟,支持多格式上传、AI 提取、自动分类、数据验证、数据库存储及干净 JSON 响应。具体准确率、处理速度、异常文件表现未在来源中报告。(author_report)

值得知道

1)本站未实际导入运行该工作流,reproduction=not_tested;2)bank_statements 表需预先手动创建,来源未提供完整 DDL;3)PDF 提取依赖 n8n 的 Extract from File 节点,复杂扫描版 PDF 可能识别失败;4)AI 输出为 JSON 字符串,Process & Summarize 节点使用正则提取首个 {…} 块,若模型输出格式异常可能导致解析为空数组;5)分类列表为英文硬编码,非英文对账单可能需要调整提示词;6)数据库写入需确保字段类型与映射匹配,否则插入失败;7)来源 workflow.json 中 credential id 为占位符,实际使用需替换为真实凭证。

n8n 工作流模板

结构已检查 · 未实际运行

下载后在 n8n 选择“Import from File”,或复制 JSON 后粘贴到编辑器。先配置自己的账号,再用测试数据运行;模板默认未启用。

配置与测试清单

需要绑定的凭证

  • openAi 节点:绑定OpenAI API 凭证。
  • postgres 节点:绑定Postgres 连接凭证。

需要替换的配置

  • 源模板来自 n8n 公开库 #6629(约 9 个节点)。导入后先保持未启用,核对触发器、表达式与外部 API 端点。
  • Sticky Note 中的说明仅供参考;按自己的账号、表结构或频道 ID 替换占位配置。

测试输入与预期结果

  • 在测试环境手动执行一次主路径,确认每个需凭证的节点已连接且无鉴权错误。
  • 用一条合成/脱敏样例数据跑通,核对输出字段与下游写入目标,再考虑生产启用。

模板处理说明

  • 已移除原作者凭证绑定、webhookId 与执行数据,工作流设为未启用;节点、连线与原文提示词保持原样。未在 n8n 中实际运行。
  • 未改业务逻辑;运行前请自行核对密钥、配额与隐私合规。

模板获取日期: 2026-10-24

步骤

  1. 前置准备与凭证配置

    在 n8n 中配置 OpenAI API 凭证(openAiApi)和 PostgreSQL 数据库凭证(postgres)。在 PostgreSQL 中创建 bank_statements 表,需包含 raw_data、bank_name、processed_at、total_income、account_number、total_expenses、statement_period、total_transactions 等字段(与 Save to Database 节点映射字段一致)。自定义分类列表可在后续 AI 节点提示词中调整。

  2. 上传对账单并智能路由

    通过 POST 请求向 /upload-statement webhook 端点上传银行对账单文件(PDF、Excel 或 CSV)。Webhook 节点接收后,File Handler 代码节点提取文件名、MIME 类型等元数据,并保留 binary 数据。Check File Type 节点根据 contentType 是否包含 application/pdf 进行路由:PDF 文件进入 Extract PDF Text 节点提取文本;Excel/CSV 文件进入 Parse Excel/CSV 节点解析为结构化数据。

    运行提示词 · 来源原文。File Handler 节点(n8n-nodes-base.code)的 jsCode 参数

    // Simple file processor
    const inputData = $input.all()[0];
    const files = [];
    
    // Handle file uploads
    if (inputData.binary) {
      Object.keys(inputData.binary).forEach(key => {
        const file = inputData.binary[key];
        files.push({
          filename: file.fileName,
          contentType: file.mimeType,
          uploadedAt: new Date().toISOString()
        });
      });
    }
    
    return files.map(file => ({
      json: {
        filename: file.filename,
        contentType: file.contentType,
        uploadedAt: file.uploadedAt,
        status: 'ready_for_processing'
      },
      binary: inputData.binary
    }));
  3. AI 提取交易与分类

    Extract PDF Text 或 Parse Excel/CSV 的输出进入 AI Data Extractor 节点(OpenAI)。system 提示词要求模型提取账户信息、交易明细、余额,并返回指定格式的 JSON;user 提示词传入提取的文本或结构化数据。模型默认使用 gpt-4o-mini,来源亦提及 GPT-4 系列可用。分类包括:groceries、dining、gas、shopping、utilities、healthcare、entertainment、income、fees、other。

    运行提示词 · 来源原文。AI Data Extractor 节点(OpenAI)system message 字段

    Extract bank statement data and return clean JSON:
    
    {
      "account_number": "****1234",
      "bank_name": "Bank Name",
      "statement_period": "2024-01-01 to 2024-01-31",
      "opening_balance": 1500.00,
      "closing_balance": 1250.00,
      "transactions": [
        {
          "date": "2024-01-15",
          "description": "GROCERY STORE",
          "amount": -45.67,
          "category": "groceries"
        }
      ]
    }
    
    Use negative amounts for expenses, positive for income. Categorize transactions as: groceries, dining, gas, shopping, utilities, healthcare, entertainment, income, fees, or other.

    运行提示词 · 来源原文。AI Data Extractor 节点(OpenAI)user message 字段

    {{ $json.data || $json.extracted_text }}
  4. 数据清洗与汇总计算

    Process & Summarize 代码节点接收 AI 输出,解析 JSON 内容,清洗交易数据(生成唯一 ID、格式化日期、大写描述、数值化金额、填充缺失分类),并计算总支出、总收入、净变化及按分类的支出汇总。若解析失败,返回空 transactions 数组以避免中断。

    运行提示词 · 来源原文。Process & Summarize 节点(n8n-nodes-base.code)的 jsCode 参数

    // Clean and validate extracted data
    const inputData = $input.all()[0];
    let extractedData = {};
    
    // Parse AI response
    try {
      const content = inputData.json.message?.content || inputData.json;
      if (typeof content === 'string') {
        const jsonMatch = content.match(/{[\s\S]*}/);
        if (jsonMatch) {
          extractedData = JSON.parse(jsonMatch[0]);
        }
      } else {
        extractedData = content;
      }
    } catch (error) {
      console.log('Parse error:', error.message);
      extractedData = { transactions: [] };
    }
    
    // Clean transaction data
    const cleanTransactions = (extractedData.transactions || []).map((tx, index) => ({
      id: `tx_${Date.now()}_${index}`,
      date: tx.date,
      description: (tx.description || '').trim().toUpperCase(),
      amount: parseFloat(tx.amount) || 0,
      category: tx.category || 'other',
      processed_at: new Date().toISOString()
    }));
    
    // Calculate summary
    const totalExpenses = cleanTransactions
      .filter(tx => tx.amount < 0)
      .reduce((sum, tx) => sum + Math.abs(tx.amount), 0);
    
    const totalIncome = cleanTransactions
      .filter(tx => tx.amount > 0)
      .reduce((sum, tx) => sum + tx.amount, 0);
    
    const categoryTotals = {};
    cleanTransactions.forEach(tx => {
      if (tx.amount < 0) { // Only expenses
        categoryTotals[tx.category] = (categoryTotals[tx.category] || 0) + Math.abs(tx.amount);
      }
    });
    
    return [{
      json: {
        account_info: {
          account_number: extractedData.account_number || 'Unknown',
          bank_name: extractedData.bank_name || 'Unknown',
          statement_period: extractedData.statement_period || 'Unknown',
          opening_balance: parseFloat(extractedData.opening_balance) || 0,
          closing_balance: parseFloat(extractedData.closing_balance) || 0
        },
        transactions: cleanTransactions,
        summary: {
          total_transactions: cleanTransactions.length,
          total_expenses: totalExpenses,
          total_income: totalIncome,
          net_change: totalIncome - totalExpenses,
          category_breakdown: categoryTotals
        },
        processed_at: new Date().toISOString(),
        status: 'completed'
      }
    }]);
  5. 存入 PostgreSQL 数据库

    Save to Database 节点将处理后的数据插入 bank_statements 表。字段映射包括:raw_data(完整 JSON)、bank_name、processed_at、total_income、account_number、total_expenses、statement_period、total_transactions。需确保数据库表结构与映射字段匹配,否则插入失败。

  6. 返回 JSON 响应

    Send Response 节点向 webhook 调用方返回 JSON,包含 success 状态、处理交易数、总支出、总收入及分类汇总。responseBody 使用 n8n 表达式引用上游节点的汇总字段。

可复制提示词

搭建指导 · 本站建议版本。交给搭建助手,先确认输入和权限

这一段是提示词,页面不会在这里插入广告。

你正在搭建一个 n8n 工作流,用于自动接收银行对账单文件(PDF/Excel/CSV),通过 AI 提取并分类交易,最终存入 PostgreSQL 并返回汇总。请先确认:1)n8n 实例已运行;2)已配置 OpenAI 和 PostgreSQL 凭证;3)已创建 bank_statements 表;4)已根据本用例步骤导入或重建 9 个节点及其连线。如需调整分类,请修改 AI Data Extractor 节点的 system 提示词中的分类列表。

核心可调参数:AI 节点 model 字段(gpt-4o-mini / gpt-4o / gpt-4)、分类列表、PostgreSQL 表字段映射、webhook 路径。

来源

AI-powered bank statement analysis & transaction categorization · vinci-king-01 · n8n.io · 2025-07-29

留言与反馈

试过这个方法吗?分享效果、遇到的问题或改进建议。留言审核后公开,请勿填写敏感信息。

正在加载…

    相关用例