สร้าง AI Agent วิเคราะห์รายรับ-รายจ่ายส่วนบุคคล: เปลี่ยนสเตทเมนต์ดิบเป็นรายงานการเงินอัจฉริยะด้วย Python + Ollama

ปกป้องข้อมูลทางการเงินของคุณให้เป็นส่วนตัว 100% ด้วยการสร้าง AI Agent ในเครื่องตัวเองด้วย Python และ Ollama เพื่อคัดแยกประเภทและวิเคราะห์พฤติกรรมการใช้จ่ายจากสเตทเมนต์ดิบโดยไม่ต้องส่งออกคลาวด์

Share
สร้าง AI Agent วิเคราะห์รายรับ-รายจ่ายส่วนบุคคล: เปลี่ยนสเตทเมนต์ดิบเป็นรายงานการเงินอัจฉริยะด้วย Python + Ollama

ข้อมูลทางการเงิน โดยเฉพาะอย่างยิ่ง ประวัติธุรกรรมหรือสเตทเมนต์ธนาคาร (Bank Statement) เป็นหนึ่งในข้อมูลที่มีความอ่อนไหวและเป็นส่วนตัวสูงที่สุด การอัปโหลดไฟล์สเตทเมนต์หรือข้อมูลการใช้จ่ายเข้าสู่แอปพลิเคชันคลาวด์หรือโมเดล AI ภายนอก ถือเป็นการเปิดเผยพฤติกรรมการใช้ชีวิต แหล่งรายได้ และรสนิยมส่วนตัวของคุณให้ผู้อื่นรู้ ซึ่งสร้างความกังวลเรื่อง ความเป็นส่วนตัวของข้อมูล (Data Privacy) เป็นอย่างยิ่ง

แต่ในขณะเดียวกัน การที่จะต้องมานั่งคัดแยกประเภทค่าใช้จ่ายและทำสรุปบัญชีรายเดือนด้วยตัวเองใน Excel หรือจดลงสมุดจดบันทึกก็เป็นเรื่องที่น่าเบื่อและเสียพลังงานสมองอย่างมาก (Cognitive Load)

นี่คือที่มาของแนวคิด Cognitive Automation แบบ Local-first ในบทความนี้ เราจะสร้าง AI Agent ด้านการเงินส่วนบุคคล รันในเครื่องตัวเองแบบ Offline 100% ด้วย Python และ Ollama ทำหน้าที่อ่านสเตทเมนต์ดิบ คัดหมวดหมู่ธุรกรรมโดยอัตโนมัติ และเขียนรายงานวิเคราะห์สุขภาพทางการเงินส่งตรงเข้าสู่สมองส่วนที่สอง (Second Brain) ของเราใน Obsidian อย่างปลอดภัย


โครงสร้างการทำงานของ Local Finance Agent

สคริปต์ Python ของเราจะทำงานในรูปแบบของ Pipeline ที่ปลอดภัย ไร้รอยเชื่อมต่ออินเทอร์เน็ต ดังนี้:

  1. อ่านข้อมูล (Read): โหลดไฟล์สเตทเมนต์ดิบที่เป็นไฟล์ CSV หรือข้อความธรรมดา (Text) จากตำแหน่งที่กำหนด
  2. ประมวลผล (Process): ส่งธุรกรรมเหล่านั้นไปให้โมเดลภาษาขนาดใหญ่ (LLM) ในเครื่องผ่าน Ollama โดยใช้ Prompt ที่ออกแบบมาเฉพาะสำหรับการจัดหมวดหมู่และวิเคราะห์พฤติกรรมการใช้จ่าย
  3. จัดเก็บและวิเคราะห์ (Store & Report): สร้างรายงานการเงินรายเดือนในรูปแบบ Markdown (.md) ที่มีตารางจัดระเบียบสวยงาม และข้อเสนอแนะในการปรับปรุงการออมเงิน เซฟลงในโฟลเดอร์ของ Obsidian Vault ทันที

สิ่งที่ต้องเตรียมก่อนเริ่มสร้าง

เพื่อให้ระบบสามารถทำงานได้ออฟไลน์ 100% คุณต้องติดตั้งสิ่งต่อไปนี้ในเครื่องคอมพิวเตอร์ของคุณ:

  • Python 3: ภาษาหลักสำหรับควบคุมการทำงานของสคริปต์
  • Ollama: เครื่องมือสำหรับดาวน์โหลดและรันโมเดลภาษาแบบ Local (ดาวน์โหลดได้ที่ ollama.com)
  • Obsidian: เครื่องมือจดโน้ตแนว Second Brain ที่ใช้เก็บรายงานการเงินส่วนตัว

สำหรับงานประมวลผลสเตทเมนต์และแยกหมวดหมู่ภาษาไทยอย่างแม่นยำ แนะนำให้ดึงโมเดลที่มีความสามารถในการคิดวิเคราะห์สูง เช่น gemma2 หรือ qwen2.5 โดยรันคำสั่งใน Terminal:

ollama pull gemma2

เขียนสคริปต์ Python ควบคุม AI Finance Agent

เราจะสร้างสคริปต์ Python ที่ไม่มีความจำเป็นต้องติดตั้งแพ็กเกจภายนอก (Zero-dependency) โดยใช้โมดูลมาตรฐานอย่าง urllib.request ในการเชื่อมต่อกับ API ของ Ollama และโมดูล csv ในการอ่านข้อมูลธุรกรรม

หากคุณยังไม่มีไฟล์สเตทเมนต์จริง สคริปต์นี้จะทำหน้าที่ตรวจจับและสร้างไฟล์สเตทเมนต์จำลอง (raw_statement.csv) ขึ้นมาให้โดยอัตโนมัติ เพื่อให้คุณสามารถทดลองรันและดูผลลัพธ์ได้ทันที

สร้างไฟล์สคริปต์ชื่อ finance_analyzer_agent.py และคัดลอกโค้ดนี้ลงไป:

import csv
import json
import os
import urllib.request
from datetime import datetime

# ================= ตั้งค่าระบบ (Configuration) =================
OBSIDIAN_VAULT_PATH = "/home/linn/notes"  # เส้นทางโฟลเดอร์ Obsidian ของคุณ
STATEMENT_FILE = os.path.join(OBSIDIAN_VAULT_PATH, "raw_statement.csv")
REPORT_FOLDER = os.path.join(OBSIDIAN_VAULT_PATH, "Financial-Reports")
LLM_MODEL = "gemma2"                     # โมเดล Ollama ที่ติดตั้งในเครื่อง
# =============================================================

def generate_mock_statement():
    """สร้างไฟล์ข้อมูลธุรกรรมจำลองสำหรับการทดสอบครั้งแรก"""
    os.makedirs(OBSIDIAN_VAULT_PATH, exist_ok=True)
    with open(STATEMENT_FILE, "w", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow(["Date", "Description", "Amount", "Type"])
        writer.writerow(["2026-07-01", "เงินเดือนจาก บริษัท A", "55000", "IN"])
        writer.writerow(["2026-07-01", "7-Eleven หน้าปากซอย", "180", "OUT"])
        writer.writerow(["2026-07-02", "รถไฟฟ้า BTS เดินทางไปทำงาน", "65", "OUT"])
        writer.writerow(["2026-07-02", "ร้านชาบูปิ้งย่างฉลองวันเงินเดือนออก", "599", "OUT"])
        writer.writerow(["2026-07-03", "Netflix รายเดือน", "419", "OUT"])
        writer.writerow(["2026-07-04", "ค่าน้ำ-ค่าไฟคอนโด", "2150", "OUT"])
        writer.writerow(["2026-07-05", "ซื้อพัดลมระบายความร้อน Shopee", "990", "OUT"])
        writer.writerow(["2026-07-06", "ร้านกาแฟ Specialty Coffee", "130", "OUT"])
        writer.writerow(["2026-07-07", "ซื้อกองทุนลดหย่อนภาษี SSF/RMF", "5000", "OUT"])
        writer.writerow(["2026-07-08", "ค่าเติมน้ำมันรถยนต์", "1200", "OUT"])
        writer.writerow(["2026-07-09", "สั่งอาหาร Delivery", "320", "OUT"])
        writer.writerow(["2026-07-10", "ซื้อของสดทำอาหารที่ Lotus's", "1450", "OUT"])
        writer.writerow(["2026-07-12", "ค่าสมาชิกฟิตเนสรายเดือน", "1600", "OUT"])
        writer.writerow(["2026-07-14", "เงินคืนค่าธรรมเนียมบัตรเครดิต", "250", "IN"])
    print(f"สร้างไฟล์ธุรกรรมจำลองเสร็จสิ้นที่: {STATEMENT_FILE}")

def read_statement():
    """อ่านไฟล์ CSV และแปลงเป็นข้อความสรุปธุรกรรม"""
    if not os.path.exists(STATEMENT_FILE):
        generate_mock_statement()
        print("โปรดนำสเตทเมนต์ธนาคารจริงมาใส่แทนที่ และรันสคริปต์นี้ใหม่อีกครั้ง")
        return None

    transactions = []
    with open(STATEMENT_FILE, "r", encoding="utf-8") as f:
        reader = csv.reader(f)
        header = next(reader)  # ข้ามบรรทัดหัวตาราง
        for row in reader:
            if len(row) >= 4:
                date, desc, amount, trans_type = row[0], row[1], row[2], row[3]
                transactions.append(f"- {date} | {desc} | {amount} บาท | ประเภท {trans_type}")

    return "\n".join(transactions)

def analyze_with_ollama(transactions_text):
    """ส่งข้อมูลธุรกรรมให้ Ollama วิเคราะห์และตอบกลับในรูปแบบ Markdown"""
    url = "http://localhost:11434/api/generate"

    prompt = f"""
คุณคือผู้เชี่ยวชาญด้านวางแผนการเงินส่วนบุคคลอัจฉริยะ (Personal Finance AI Advisor)
หน้าที่ของคุณคือการวิเคราะห์รายการธุรกรรมด้านล่างนี้ และเขียนรายงานวิเคราะห์การเงินเป็นภาษาไทยให้เป็นประโยชน์อย่างสูงสุด:

รายการธุรกรรม:
{transactions_text}

จงตอบกลับด้วยโครงสร้าง Markdown ดังต่อไปนี้เท่านั้น:
1. **ภาพรวมทางการเงินรายเดือน (Financial Overview)**:
   - รายรับรวมทั้งหมด (Total Income)
   - รายจ่ายรวมทั้งหมด (Total Expenses)
   - ยอดคงเหลือสุทธิ (Net Savings)
   - อัตราการออมเงิน (Savings Rate = ยอดคงเหลือสุทธิ / รายรับรวม) เขียนเป็นเปอร์เซ็นต์
2. **สรุปยอดตามหมวดหมู่ (Expenses by Category)**:
   - วิเคราะห์และแบ่งรายจ่ายออกเป็นหมวดหมู่ (เช่น ค่าครองชีพพื้นฐาน, อาหาร/เครื่องดื่ม, เดินทาง, บิล/ค่าสาธารณูปโภค, ช็อปปิ้ง/นันทนาการ, การลงทุน/ออมเงิน) พร้อมสรุปยอดรวมของแต่ละหมวดหมู่และสัดส่วนเปอร์เซ็นต์ เรียงตามยอดใช้จ่ายสูงสุด
3. **ตารางธุรกรรมแยกประเภท (Categorized Transaction Table)**:
   - ตาราง Markdown แสดงธุรกรรมทั้งหมด พร้อมเพิ่มคอลัมน์ 'หมวดหมู่ (Category)' ที่คุณระบุและตัดสินใจให้โดยอิงตามรายละเอียดของธุรกรรม
4. **การวิเคราะห์พฤติกรรมการใช้จ่ายและคำแนะนำเชิงลึก (AI Financial Insights & Tips)**:
   - ประเมินสุขภาพทางการเงินจากสัดส่วนการออมและการลงทุน
   - ระบุพฤติกรรมการใช้จ่ายที่มีแนวโน้มเป็นประเด็น เช่น มีการจ่ายค่าสมาชิก (Subscriptions) หรือรายจ่ายประเภทอาหารและสินค้าฟุ่มเฟือยมากเกินไปหรือไม่
   - ให้คำแนะนำ 3 ข้อที่เป็นรูปธรรมและทำตามได้จริง เพื่อลดรายจ่ายฟุ่มเฟือยและเพิ่มเงินออมในเดือนถัดไป
"""

    data = {
        "model": LLM_MODEL,
        "prompt": prompt,
        "stream": False
    }

    req = urllib.request.Request(
        url,
        data=json.dumps(data).encode("utf-8"),
        headers={"Content-Type": "application/json"}
    )

    print(f"กำลังส่งธุรกรรมให้ AI ({LLM_MODEL}) ทำการวิเคราะห์ข้อมูลทางการเงิน...")

    try:
        with urllib.request.urlopen(req) as response:
            res_body = json.loads(response.read().decode("utf-8"))
            return res_body.get("response", "")
    except Exception as e:
        print(f"เกิดข้อผิดพลาดในการเชื่อมต่อ Ollama: {str(e)}")
        return None

def save_report_to_obsidian(analysis_content):
    """บันทึกผลลัพธ์ลงเป็นไฟล์ Markdown ใน Obsidian Vault"""
    os.makedirs(REPORT_FOLDER, exist_ok=True)
    current_date = datetime.now().strftime("%Y-%m")
    report_file_path = os.path.join(REPORT_FOLDER, f"financial-analysis-{current_date}.md")

    frontmatter = f"""---
title: "รายงานวิเคราะห์รายรับ-รายจ่าย ประจำเดือน {current_date}"
date: "{datetime.now().strftime('%Y-%m-%d')}"
tags: ["Finance", "Personal-Report", "Ollama-AI"]
---

# รายงานวิเคราะห์การเงินรายเดือน ({current_date})

> **คำเตือนความปลอดภัย:** รายงานนี้จัดทำขึ้นโดยระบบ AI ภายในเครื่องของคุณเองแบบ Local 100% ข้อมูลธุรกรรมทั้งหมดไม่เคยถูกส่งออกภายนอกระบบเครื่องเพื่อรักษาความเป็นส่วนตัวอย่างปลอดภัยสูงสุด

---
"""

    with open(report_file_path, "w", encoding="utf-8") as f:
        f.write(frontmatter + "\n" + analysis_content)

    print(f"บันทึกรายงานการเงินสำเร็จแล้วที่: {report_file_path}")

def run_agent():
    print("=== เริ่มต้นระบบ AI Personal Finance Agent ===")
    transactions_text = read_statement()
    if not transactions_text:
        return

    analysis_result = analyze_with_ollama(transactions_text)
    if analysis_result:
        save_report_to_obsidian(analysis_result)
        print("=== สิ้นสุดกระบวนการประมวลผลอย่างสมบูรณ์ ===")

if __name__ == "__main__":
    run_agent()

วิธีนำสเตทเมนต์จริงมาวิเคราะห์

ในชีวิตประจำวัน คุณสามารถดึงรายงานธุรกรรมดิบจากแอปธนาคารต่างๆ ในรูปแบบของไฟล์ CSV หรือคัดลอกรายการการเดินบัญชีมาลงในไฟล์โปรแกรมสเปรดชีตอย่าง Excel จากนั้นเซฟเป็นไฟล์ชื่อ raw_statement.csv มาทับไฟล์ตัวอย่างในตำแหน่ง /home/linn/notes/raw_statement.csv โดยปรับแต่งคอลัมน์ให้ตรงตามรูปแบบดังนี้:

  • Date: วันที่ทำธุรกรรม (เช่น YYYY-MM-DD)
  • Description: คำอธิบายหรือร้านค้าที่ชำระ (เช่น 7-Eleven, BTS, เงินเดือน)
  • Amount: จำนวนยอดเงิน (ตัวเลขเปล่าๆ เช่น 120, 45000)
  • Type: ประเภทรายการ ได้แก่ IN (เงินเข้า/รายรับ) หรือ OUT (เงินออก/รายจ่าย)

หลังจากแทนที่ไฟล์สเตทเมนต์ของคุณแล้ว ให้สั่งรันไฟล์ Python จาก Terminal ของคุณ:

python3 finance_analyzer_agent.py

เมื่อสคริปต์ประมวลผลเสร็จสิ้น สเตทเมนต์ดิบและยุ่งเหยิงจะถูกจัดแจงเป็นหมวดหมู่อย่างเป็นระบบ และเขียนข้อคิดเห็นเชิงการเงินส่งตรงเข้าโฟลเดอร์ Financial-Reports ใน Obsidian โดยอัตโนมัติ


สิ่งที่จะปรากฏบนสมองส่วนที่สอง (Obsidian Vault)

เมื่อคุณเปิด Obsidian และคลิกเข้าไปดูไฟล์รายงานใหม่ ตัวอย่างผลลัพธ์ที่ AI คัดหมวดหมู่และวิเคราะห์ให้อาจแสดงให้เห็นเป็นหน้าตารายงานทางการเงินแบบมืออาชีพดังนี้:

# รายงานวิเคราะห์การเงินรายเดือน (2026-07)

## 1. ภาพรวมทางการเงินรายเดือน (Financial Overview)
* **รายรับรวมทั้งหมด:** 55,250 บาท
* **รายจ่ายรวมทั้งหมด:** 19,892 บาท
* **ยอดคงเหลือสุทธิ:** 35,358 บาท
* **อัตราการออมเงิน:** 64.0% (สุขภาพทางการเงินยอดเยี่ยมมาก!)

## 2. สรุปยอดตามหมวดหมู่ (Expenses by Category)
1. **การลงทุน/ออมเงิน:** 5,000 บาท (25.1%)
2. **บิล/ค่าสาธารณูปโภค:** 3,750 บาท (18.9%) - ค่าน้ำ ค่านอนโด ค่าฟิตเนส
3. **อาหาร/เครื่องดื่ม:** 3,078 บาท (15.5%)
4. **ช็อปปิ้ง/นันทนาการ:** 1,409 บาท (7.1%) - ช็อปปิ้งออนไลน์ Netflix
5. **เดินทาง:** 1,265 บาท (6.4%) - ค่าน้ำมันรถ ไฟฟ้า BTS
...
[!TIP] การเชื่อมโยงระบบการเงินเข้ากับ Second Brain: คุณสามารถใช้ปลั๊กอินยอดนิยมอย่าง Obsidian Dataview ในการดึงยอดเงินคงเหลือรายเดือน หรืออัตราการออมสะสมตลอดทั้งปีมาวาดเป็นกราฟวิเคราะห์พฤติกรรมการเงินเปรียบเทียบในแต่ละไตรมาสได้ทันที ทำให้ Obsidian ไม่ได้เป็นแค่ที่จดโน้ตธรรมดา แต่กลายสภาพเป็น Dashboard วิเคราะห์ชีวิตและสุขภาพการเงินส่วนตัว

สรุปแนวคิด Cognitive Automation ด้านความปลอดภัยทางการเงิน

การนำ Local AI เข้ามาคัดกรองข้อมูลธุรกรรมและประวัติการเงินส่วนบุคคลช่วยตอบโจทย์สองด้านที่ขัดแย้งกันมาตลอด คือ "ความสะดวกสบายในการทำงานอัตโนมัติ" และ "การปกป้องข้อมูลส่วนตัวสูงสุด"

ในยุคที่ข้อมูลมีค่าดั่งทองคำ การที่เราสามารถขับเคลื่อนระบบคำนวณและประเมินพฤติกรรมการออมเงินโดยยังคงควบคุมข้อมูล 100% อยู่ในบ้านและคอมพิวเตอร์ของเราเอง ถือเป็นการวางรากฐานให้กับระบบปฏิบัติการสมองส่วนตัว (Private Brain OS) ที่แข็งแกร่ง ปลอดภัย และยั่งยืนอย่างแท้จริง

Read more

สร้าง AI Agent สกัด Knowledge Graph จากโน้ตส่วนตัว: เปลี่ยนข้อความกระจัดกระจายให้เป็นเครือข่ายความรู้ออฟไลน์ 100% ด้วย Python

สร้าง AI Agent สกัด Knowledge Graph จากโน้ตส่วนตัว: เปลี่ยนข้อความกระจัดกระจายให้เป็นเครือข่ายความรู้ออฟไลน์ 100% ด้วย Python + Ollama

เปลี่ยนเอกสารและโน้ตข้อความร้อยแก้วให้เป็น Knowledge Graph แบบโครงสร้าง (Subject-Predicate-Object) โดยอัตโนมัติ ด้วยสคริปต์ Python ร่วมกับ Local LLM ในเครื่อง ช่วยสกัดความสัมพันธ์ระหว่างความคิด เทคโนโลยี และบุคคลอย่างเป็นระบบออฟไลน์ 100%

By Linn
บอกลา Audible: คู่มือติดตั้ง Audiobookshelf เซิร์ฟเวอร์หนังสือเสียงและ eBook ส่วนตัวบน Home Server ด้วย Docker

บอกลา Audible: คู่มือติดตั้ง Audiobookshelf เซิร์ฟเวอร์หนังสือเสียงและ eBook ส่วนตัวบน Home Server ด้วย Docker

เปลี่ยนคลังหนังสือเสียงและดิจิทัลไฟล์ของคุณให้กลายเป็นเซิร์ฟเวอร์สตรีมมิ่งส่วนตัว ด้วย Audiobookshelf บน Home Server ผ่าน Docker พร้อมวิธีซิงค์ความคืบหน้าการฟังข้ามอุปกรณ์แบบเรียลไทม์

By Linn
สร้าง AI Agent สกัดและสังเคราะห์ Book Highlights: เปลี่ยนโน้ตอ่านหนังสือเป็น Book Summary อัจฉริยะใน Obsidian ด้วย Python + O

สร้าง AI Agent สกัดและสังเคราะห์ Book Highlights: เปลี่ยนโน้ตอ่านหนังสือเป็น Book Summary อัจฉริยะใน Obsidian ด้วย Python + Ollama

เปลี่ยนไฮไลต์และโน้ตย่อยจากการอ่านหนังสือให้กลายเป็น Book Summary ที่ทรงคุณค่าด้วย AI Agent ออฟไลน์ส่วนตัวที่จะสกัด Core Key Takeaways, Actionable Insights และเชื่อมโยงเข้ากับระบบ Second Brain แบบ Local 100%

By Linn
สร้าง Private AI Router ในเครื่องตัวเอง: คู่มือตั้งค่า LiteLLM สลับโมเดลอัจฉริยะตามประเภทงานแบบออฟไลน์ 100%

สร้าง Private AI Router ในเครื่องตัวเอง: คู่มือตั้งค่า LiteLLM สลับโมเดลอัจฉริยะตามประเภทงานแบบออฟไลน์ 100%

เรียนรู้วิธีตั้งค่า LiteLLM เป็น AI Gateway และ Router ในเครื่องตัวเอง เพื่อสลับรันโมเดล Ollama อัตโนมัติ ทั้งโมเดลเน้นความเร็ว โมเดลคิดวิเคราะห์เชิงลึก และโมเดลวิเคราะห์ภาพ ปลอดภัย 100% ไม่ต้องพึ่งคลาวด์

By Linn