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
๐๏ธ Struktur Proyek
Mari kita bagi aplikasi ini menjadi beberapa komponen utama:
- ๐๏ธ Konfigurasi dan Setup Database
- ๐ ๏ธ SQL Execution Tool
- ๐ค LangChain Agent Integration
- ๐ Date Handling Utilities
- ๐ 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()
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()
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)
}
)
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")
)
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)}")
๐ก๏ธ Pertimbangan Keamanan
Implementasi kita mencakup beberapa langkah keamanan:
- ๐ Pencegahan SQL Injection: Memblokir operasi SQL berbahaya
- ๐ Isolasi Pengguna: Setiap query otomatis difilter berdasarkan pengguna
- โ Validasi Input: Memvalidasi dan membersihkan semua query SQL
- ๐จ 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
- Melihat pengeluaran:
Anda: Tampilkan pengeluaran saya kemarin
Bot: id | deskripsi | jumlah | tanggal
----------------------------------
1 | makan siang | 50000 | 2024-01-29 12:30:00
- Mengupdate pengeluaran:
Anda: Update pengeluaran id 1 menjadi 45000
Bot: โ
1 data terpengaruh
๐ฏ 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)