สร้าง AI Agent วิเคราะห์รายรับ-รายจ่ายส่วนบุคคล: เปลี่ยนสเตทเมนต์ดิบเป็นรายงานการเงินอัจฉริยะด้วย Python + Ollama
ปกป้องข้อมูลทางการเงินของคุณให้เป็นส่วนตัว 100% ด้วยการสร้าง 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 ที่ปลอดภัย ไร้รอยเชื่อมต่ออินเทอร์เน็ต ดังนี้:
- อ่านข้อมูล (Read): โหลดไฟล์สเตทเมนต์ดิบที่เป็นไฟล์ CSV หรือข้อความธรรมดา (Text) จากตำแหน่งที่กำหนด
- ประมวลผล (Process): ส่งธุรกรรมเหล่านั้นไปให้โมเดลภาษาขนาดใหญ่ (LLM) ในเครื่องผ่าน Ollama โดยใช้ Prompt ที่ออกแบบมาเฉพาะสำหรับการจัดหมวดหมู่และวิเคราะห์พฤติกรรมการใช้จ่าย
- จัดเก็บและวิเคราะห์ (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) ที่แข็งแกร่ง ปลอดภัย และยั่งยืนอย่างแท้จริง