ให้ AI ช่วยจดบันทึกรายรับรายจ่าย พร้อมสรุปยอดรายวันแบบอัตโนมัติ
ชีวิตโปรแกรมเมอร์ที่ยุ่งจนลืมจดเงิน
ผมเชื่อว่าหลายคนเคยเป็นเหมือนกัน คือตั้งใจว่าจะจดรายรับรายจ่ายทุกวัน แต่พอผ่านไปสามวันก็ลืม หรือบางทีก็ขี้เกียจเปิดแอปฯ มานั่งกรอกตัวเลขตอนเหนื่อยๆ จากการดีบั๊กโค้ด (Debug - การหาและแก้ไขข้อผิดพลาดในโปรแกรม) ปัญหาที่ผมเจอบ่อยสุดคือการจำไม่ได้ว่าเงินหายไปไหนในแต่ละวัน จนสุดท้ายก็เลิกจดไปดื้อๆ วิธีที่ผมจะแชร์นี้คือการใช้ LLM (Large Language Model - โมเดลภาษาขนาดใหญ่ที่ฉลาดพอจะเข้าใจบริบท) มาช่วยสกัดข้อมูลจากข้อความที่เราพิมพ์ทิ้งไว้ในแชทให้กลายเป็นข้อมูลที่นำไปใช้งานต่อได้ง่ายๆ
เลือกใช้ API ของ OpenAI รุ่นล่าสุด
ผมเลือกใช้ OpenAI API รุ่น gpt-4o-2024-05-13 เพราะค่าใช้จ่ายถูกกว่ารุ่นก่อนหน้าอย่าง GPT-4 Turbo ถึง 50% และประมวลผลได้เร็วมาก เหมาะสำหรับงานที่ต้องทำซ้ำๆ ทุกวัน ผมแนะนำให้เลือกใช้ตัวนี้เพราะเสถียรที่สุดในตอนนี้ สำหรับใครที่ต้องการประหยัดกว่านี้ สามารถใช้ gpt-3.5-turbo ได้แต่ความแม่นยำในการทำ Structured Output (การจัดรูปแบบข้อมูลให้เป็นมาตรฐาน) อาจจะลดลง
import openai
client = openai.OpenAI(api_key="YOUR_API_KEY")
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "วันนี้กินข้าวไป 50 บาท ซื้อกาแฟ 60 บาท"}]
)
ส่วนแรกคือการนำเข้าไลบรารี openai เพื่อคุยกับเซิร์ฟเวอร์ ส่วนที่สองคือการตั้งค่า Client ด้วย API Key และส่วนสุดท้ายคือการส่งคำสั่งเข้าไป ผลลัพธ์ที่ได้จะเป็นข้อความปกติ ถ้าเจอ Error: AuthenticationError แปลว่า API Key ไม่ถูกต้องให้เช็คในหน้า Dashboard ของ OpenAI อีกครั้ง
กำหนดโครงสร้างข้อมูลด้วย JSON Schema
เพื่อให้ AI ส่งข้อมูลกลับมาเป็นรูปแบบที่เรานำไปใช้กับ Database ได้ทันที เราต้องใช้ฟีเจอร์ Response Format ของ OpenAI แทนการให้มันพ่นข้อความออกมาลอยๆ ผมใช้ JSON Schema (มาตรฐานการกำหนดโครงสร้างข้อมูล) เพื่อบังคับให้ผลลัพธ์ออกมาเป็น Array ของรายการจ่ายเงินเสมอ
json_schema = {
"name": "expense_schema",
"schema": {
"type": "object",
"properties": {
"items": {"type": "array", "items": {"type": "object", "properties": {"name": {"type": "string"}, "amount": {"type": "integer"}}}}
}
}
}
โค้ดนี้กำหนดให้ผลลัพธ์มีฟิลด์ items ที่เป็นรายการของ object ซึ่งมีชื่อรายการและจำนวนเงิน ถ้าผลลัพธ์ที่ได้ไม่มีฟิลด์เหล่านี้ แสดงว่า Prompt (คำสั่งที่ส่งให้ AI) ของคุณยังไม่ชัดเจนพอ
สร้างฟังก์ชันสรุปยอดรายวัน
ขั้นตอนสำคัญคือการรวบรวมข้อความที่พิมพ์ไว้ตลอดทั้งวันมาสรุปเป็นยอดรวม ผมเลือกใช้การส่งข้อมูลทั้งหมดที่พิมพ์ไว้ในวันนั้นเข้าไปในครั้งเดียว เพื่อลดจำนวน Request และลดค่าใช้จ่าย
def summarize_daily(expenses):
# รวมรายการทั้งหมดที่ส่งเข้ามา
total = sum(item['amount'] for item in expenses)
return f"วันนี้คุณใช้เงินไปทั้งหมด {total} บาท"
print(summarize_daily([{'name': 'ข้าว', 'amount': 50}, {'name': 'กาแฟ', 'amount': 60}]))
ฟังก์ชันนี้รับ List ของ Dictionary เข้ามาแล้วใช้ฟังก์ชัน sum ของ Python คำนวณยอดรวม ผลลัพธ์ที่ควรได้คือข้อความสรุปยอดเงินรวม 110 บาท
การเก็บข้อมูลลงไฟล์ Local
แทนที่จะใช้ Database ใหญ่โต ผมแนะนำให้เก็บเป็นไฟล์ CSV (Comma Separated Values - รูปแบบไฟล์ที่คั่นด้วยลูกน้ำ) เพราะอ่านง่ายและนำไปเปิดใน Excel ได้ทันที ผมใช้ห้องสมุด csv มาตรฐานของ Python
import csv
with open('expenses.csv', 'a') as f:
writer = csv.writer(f)
writer.writerow(['2023-10-27', 'Coffee', 60])
เราเปิดไฟล์ด้วยโหมด 'a' (append) เพื่อเขียนต่อท้ายไฟล์เดิมเสมอ ไม่ต้องกลัวข้อมูลเก่าหาย วิธีนี้ดีกว่าการทำ Database ในช่วงเริ่มต้นเพราะมันเรียบง่ายที่สุด
สร้าง Automation ด้วย Cron Job
เพื่อให้ระบบสรุปยอดให้เราเองตอน 4 ทุ่ม ผมเลือกใช้ Cron Job (ตัวตั้งเวลาทำงานบน Linux) แทนการเปิดสคริปต์ทิ้งไว้ เพราะกินทรัพยากรเครื่องน้อยกว่ามาก
0 22 * * * /usr/bin/python3 /home/user/script.py
บรรทัดนี้บอกให้รันสคริปต์ทุกวันตอนเวลา 22:00 น. หากคุณใช้บน Windows ให้มองหา Task Scheduler แทน ซึ่งมีหลักการทำงานคล้ายกัน
เมื่อไหร่ที่ไม่ควรใช้วิธีนี้
ผมไม่แนะนำวิธีนี้หากคุณเป็นคนที่ซีเรียสเรื่องความเป็นส่วนตัวของข้อมูลการเงินขั้นสูงสุด เพราะข้อมูลของคุณต้องถูกส่งผ่าน API ไปยังเซิร์ฟเวอร์ของ OpenAI แม้ว่าทาง OpenAI จะระบุว่าข้อมูลที่ผ่าน API จะไม่ถูกนำไป Train Model ต่อ แต่ความเสี่ยงก็ยังคงมีอยู่ หากคุณต้องการความเป็นส่วนตัว 100% ผมแนะนำให้หันไปใช้โมเดลประเภท Local LLM อย่าง Llama 3 รันบนเครื่องตัวเองผ่าน Ollama แทน ซึ่งจะปลอดภัยกว่าและไม่มีค่าใช้จ่ายต่อครั้งที่เรียกใช้งาน