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)