DEV Community

Cover image for ๐Ÿฆ Membuat Aplikasi Manajemen Keuangan dengan Python, SQLite, dan LangChain.
Ogi Wemy
Ogi Wemy

Posted on

๐Ÿฆ Membuat Aplikasi Manajemen Keuangan dengan Python, SQLite, dan LangChain.

Pernah ingin membuat aplikasi manajemen keuangan yang bisa berinteraksi menggunakan bahasa natural? Dalam tutorial ini, kita akan membuat sistem manajemen keuangan berbasis CLI menggunakan Python, SQLite, dan LangChain. Sistem ini memungkinkan pengguna untuk mencatat pengeluaran, mencari riwayat pengeluaran, dan berinteraksi dengan database menggunakan bahasa sehari-hari! ๐Ÿš€

๐ŸŽฏ Prerequisites

  • Python 3.7+ ๐Ÿ
  • Pemahaman dasar SQL dan Python ๐Ÿ’ป
  • OpenAI API key ๐Ÿ”‘

๐Ÿ“ฆ Required Packages

pip install sqlite3 pytz langchain openai
Enter fullscreen mode Exit fullscreen mode

๐Ÿ—๏ธ Struktur Proyek

Mari kita bagi aplikasi ini menjadi beberapa komponen utama:

  1. ๐Ÿ—„๏ธ Konfigurasi dan Setup Database
  2. ๐Ÿ› ๏ธ SQL Execution Tool
  3. ๐Ÿค– LangChain Agent Integration
  4. ๐Ÿ“… Date Handling Utilities
  5. ๐Ÿ”„ Main Application Loop

1. ๐Ÿ—„๏ธ Konfigurasi Database

Pertama, mari kita siapkan database SQLite dengan tabel yang diperlukan:

import sqlite3
import pytz
from langchain.tools import tool

# Konfigurasi โš™๏ธ
wita = pytz.timezone("Asia/Makassar")
CURRENT_USER = "Ogi"  # Pengguna default

def setup_database():
    conn = sqlite3.connect("database.db")
    cursor = conn.cursor()

    # Tabel Pengguna ๐Ÿ‘ฅ
    cursor.execute("""
        CREATE TABLE IF NOT EXISTS users (
            name TEXT PRIMARY KEY,
            email TEXT
        )""")

    # Tabel Pengeluaran dengan foreign key pengguna ๐Ÿ’ฐ
    cursor.execute("""
        CREATE TABLE IF NOT EXISTS expenses (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            user TEXT,
            description TEXT,
            amount REAL,
            date TEXT,
            FOREIGN KEY(user) REFERENCES users(name)
        )""")

    # Inisialisasi pengguna default ๐Ÿ‘ค
    cursor.execute("INSERT OR IGNORE INTO users (name, email) VALUES (?, ?)", 
                 (CURRENT_USER, "contoh@email.com"))
    conn.commit()
    conn.close()
Enter fullscreen mode Exit fullscreen mode

2. ๐Ÿ›ก๏ธ SQL Execution Tool yang Aman

Salah satu bagian terpenting dari aplikasi kita adalah tool eksekusi SQL. Mari buat wrapper yang aman untuk operasi SQLite:

@tool
def execute_sql(query: str):
    """Eksekusi SQL dengan validasi dan keamanan ketat ๐Ÿ”’"""
    try:
        conn = sqlite3.connect("database.db")
        cursor = conn.cursor()

        # Pemeriksaan keamanan ๐Ÿšซ
        forbidden_patterns = [
            "DROP TABLE", "CREATE TABLE", 
            "INSERT INTO users", "UPDATE users",
            ";--", "/*", "*/"
        ]

        if any(patt in query.upper() for patt in forbidden_patterns):
            return "๐Ÿšซ Operasi dilarang!"

        # Filter otomatis berdasarkan pengguna ๐Ÿ‘ค
        if "WHERE" in query.upper() and "expenses" in query.upper():
            query += f" AND user='{CURRENT_USER}'"
        elif "WHERE" not in query.upper() and "expenses" in query.upper():
            query += f" WHERE user='{CURRENT_USER}'"

        cursor.execute(query)
        conn.commit()

        # Format hasil ๐Ÿ“Š
        if query.strip().upper().startswith("SELECT"):
            cols = [desc[0] for desc in cursor.description]
            rows = cursor.fetchall()
            return format_results(cols, rows) if rows else "๐Ÿ“ญ Data tidak ditemukan"

        elif query.strip().upper().startswith(("UPDATE", "DELETE")):
            return f"โœ… {cursor.rowcount} data terpengaruh"

        return "โœ… Operasi berhasil"

    except sqlite3.Error as e:
        return f"๐Ÿšจ Error: {str(e)}"
    finally:
        conn.close()
Enter fullscreen mode Exit fullscreen mode

3. ๐Ÿค– Integrasi LangChain

Sekarang, mari siapkan LangChain agent dengan pesan sistem yang disesuaikan:

from langchain.chat_models import ChatOpenAI
from langchain.agents import initialize_agent, AgentType

SYSTEM_TEMPLATE = """Anda adalah asisten SQL expert dengan kemampuan:
1. ๐Ÿ“… Format Tanggal: YYYY-MM-DD HH:MM:SS (Zona waktu WITA)
2. ๐Ÿ‘ค Pengguna saat ini: {user}
3. โœจ Contoh Query Valid:
   - UPDATE: UPDATE expenses SET description='Makan', amount=25000 WHERE id=3
   - DELETE: DELETE FROM expenses WHERE id=2 AND user='{user}'
   - DATE: SELECT * FROM expenses WHERE date BETWEEN '2024-05-30 00:00:00' AND '2024-05-30 23:59:59'
4. โฐ Untuk operasi tanggal, SELALU gunakan BETWEEN dengan rentang waktu
5. ๐ŸŽฏ Langsung jalankan query SQL sesuai pertanyaan pengguna"""

llm = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0.7,
    openai_api_key="your-api-key"
)

agent = initialize_agent(
    tools=[execute_sql],
    llm=llm,
    agent=AgentType.OPENAI_FUNCTIONS,
    agent_kwargs={
        'system_message': SYSTEM_TEMPLATE.format(user=CURRENT_USER)
    }
)
Enter fullscreen mode Exit fullscreen mode

4. ๐Ÿ“… Utilitas Penanganan Tanggal

Untuk memudahkan penanganan query berbasis tanggal:

def get_date_range(days_ago: int):
    """Buat rentang tanggal untuk filter โฐ"""
    today = datetime.datetime.now(wita)
    target_date = today - datetime.timedelta(days=days_ago)
    start = target_date.replace(hour=0, minute=0, second=0)
    end = target_date.replace(hour=23, minute=59, second=59)
    return (
        start.strftime("%Y-%m-%d %H:%M:%S"),
        end.strftime("%Y-%m-%d %H:%M:%S")
    )
Enter fullscreen mode Exit fullscreen mode

5. ๐Ÿ”„ Loop Aplikasi Utama

Akhirnya, mari gabungkan semuanya dalam loop aplikasi utama:

print("๐Ÿ’ป ** Sistem Manajemen Keuangan Ogi **")
while True:
    try:
        user_input = input("\n๐Ÿ“ Anda: ").strip()
        if user_input.lower() in ["exit", "keluar"]:
            break

        # Penanganan query spesifik tanggal ๐Ÿ“…
        if "kemarin" in user_input.lower():
            start, end = get_date_range(1)
            user_input += f" (rentang: {start} sampai {end})"

        response = agent.run(user_input)
        print(f"\n๐Ÿค– Bot: {response}")

    except Exception as e:
        print(f"\n๐Ÿค– Bot: ๐Ÿ’ฅ Error sistem: {str(e)}")
Enter fullscreen mode Exit fullscreen mode

๐Ÿ›ก๏ธ Pertimbangan Keamanan

Implementasi kita mencakup beberapa langkah keamanan:

  1. ๐Ÿ”’ Pencegahan SQL Injection: Memblokir operasi SQL berbahaya
  2. ๐Ÿ” Isolasi Pengguna: Setiap query otomatis difilter berdasarkan pengguna
  3. โœ… Validasi Input: Memvalidasi dan membersihkan semua query SQL
  4. ๐Ÿšจ Penanganan Error: Penanganan error yang kuat mencegah sistem crash

๐ŸŽฎ Contoh Penggunaan

Berikut beberapa contoh interaksi dengan sistem:

  • Menambah pengeluaran:
Anda: Tambah pengeluaran makan siang hari ini, jumlah 50000
Bot: โœ… Pengeluaran berhasil ditambahkan
Enter fullscreen mode Exit fullscreen mode
  • Melihat pengeluaran:
Anda: Tampilkan pengeluaran saya kemarin
Bot: id | deskripsi  | jumlah | tanggal
    ----------------------------------
    1  | makan siang | 50000  | 2024-01-29 12:30:00
Enter fullscreen mode Exit fullscreen mode
  • Mengupdate pengeluaran:
Anda: Update pengeluaran id 1 menjadi 45000
Bot: โœ… 1 data terpengaruh
Enter fullscreen mode Exit fullscreen mode

๐ŸŽฏ Kesimpulan

Proyek ini mendemonstrasikan cara membuat sistem manajemen keuangan yang aman dan mudah digunakan menggunakan Python, SQLite, dan LangChain. Kombinasi pemrosesan bahasa alami dan operasi database tradisional membuatnya mudah diakses oleh pengguna sambil tetap menjaga keamanan dan integritas data.

Beberapa potensi pengembangan yang bisa dilakukan:

  • ๐Ÿ“Š Menambahkan kategori untuk pengeluaran
  • ๐Ÿ’ฐ Mengimplementasikan tracking budget
  • ๐Ÿ“ˆ Menambahkan visualisasi data
  • ๐Ÿ‘ฅ Mendukung multiple user
  • ๐Ÿ” Menambahkan autentikasi

Source code lengkap tersedia di bagian atas tutorial ini. Silakan modifikasi dan kembangkan sesuai kebutuhan Anda!

โš ๏ธ Jangan lupa untuk mengganti OpenAI API key dengan API key Anda sendiri sebelum menjalankan aplikasi.

๐Ÿท๏ธ Tags

python #sqlite #langchain #tutorial #finance #ai

Selamat mencoba! ๐Ÿš€

Top comments (0)