Finance_chatbot / app.py
anonymousiam's picture
Update app.py
217d7cd verified
raw
history blame
6.64 kB
# app.py - Main file for Hugging Face Spaces deployment
import numpy as np
import pandas as pd
import torch
import gradio as gr
from transformers import pipeline, AutoTokenizer
# Use a more lightweight approach with the pipeline API
# This is more memory-efficient for Spaces deployment
try:
# First try to load a lightweight text generation model
generator = pipeline('text-generation',
model="distilgpt2",
max_length=100)
tokenizer = AutoTokenizer.from_pretrained("distilgpt2")
print("Using distilGPT2 model")
except Exception as e:
# Fallback to an even smaller model if resources are limited
print(f"Error loading distilGPT2: {e}")
print("Falling back to smaller model")
generator = pipeline('text-generation',
model="sshleifer/tiny-gpt2",
max_length=100)
tokenizer = AutoTokenizer.from_pretrained("sshleifer/tiny-gpt2")
# Financial knowledge base - simple templates and responses
financial_templates = {
"budget": "Here's a simple budget template based on the 50/30/20 rule:\n- 50% for needs (rent, groceries, utilities)\n- 30% for wants (dining out, entertainment)\n- 20% for savings and debt repayment",
"emergency fund": "An emergency fund should ideally cover 3-6 months of expenses. Start with a goal of $1,000, then build from there.",
"debt": "Focus on high-interest debt first (like credit cards). Consider the debt avalanche (highest interest first) or debt snowball (smallest balance first) methods.",
"investing": "For beginners, consider index funds or ETFs for diversification. Time in the market beats timing the market.",
"retirement": "Take advantage of employer matches in retirement accounts - it's free money. Start early to benefit from compound interest.",
"save money": "To save money, try the 30-day rule (wait 30 days before making non-essential purchases), meal prep to reduce food costs, and use cashback apps for everyday purchases.",
"credit score": "To improve your credit score: pay bills on time, reduce credit card balances, don't close old accounts, and check your credit report regularly for errors."
}
# Define guided chat flow
def guided_response(user_message, chat_history):
# Check if we should use a template response
for key, template in financial_templates.items():
if key.lower() in user_message.lower():
return "", chat_history + [[user_message, template]]
# For more general queries, use the AI model with a financial prefix
try:
prompt = f"The following is financial advice: {user_message}\nFinancial advisor:"
outputs = generator(prompt, max_length=150, temperature=0.7, num_return_sequences=1)
# Extract relevant part of the response
response = outputs[0]['generated_text'].replace(prompt, "").strip()
# Cleanup and limit response
response = response.split('.')[0] + '.' if '.' in response else response
# Add disclaimer for AI-generated content
response += "\n\n(Note: This is general advice. Please consult a professional financial advisor for specific situations.)"
except Exception as e:
response = f"I'm sorry, I couldn't generate advice at the moment. Please try asking about budgeting, emergency funds, debt, investing, or retirement."
return "", chat_history + [[user_message, response]]
# Create budget calculator function
def calculate_budget(monthly_income, housing, utilities, groceries, transportation):
if not monthly_income or monthly_income <= 0:
return "Please enter a valid monthly income greater than zero."
# Convert inputs to float and handle potential None values
housing = float(housing or 0)
utilities = float(utilities or 0)
groceries = float(groceries or 0)
transportation = float(transportation or 0)
monthly_income = float(monthly_income)
total_needs = housing + utilities + groceries + transportation
needs_percent = (total_needs / monthly_income) * 100 if monthly_income > 0 else 0
available_for_wants = monthly_income * 0.3
available_for_savings = monthly_income * 0.2
return f"""Based on the 50/30/20 rule:
Current spending on needs: ${total_needs:.2f} ({needs_percent:.1f}% of income)
Recommended max for needs: ${monthly_income * 0.5:.2f} (50%)
Available for wants: ${available_for_wants:.2f} (30%)
Recommended for savings/debt: ${available_for_savings:.2f} (20%)
{'Your needs expenses are within recommended limits!' if needs_percent <= 50 else 'Your needs expenses exceed 50% of income. Consider areas to reduce spending.'}
"""
# Setup Gradio interface with tabs
with gr.Blocks() as app:
gr.Markdown("# Financial Advisor Bot")
gr.Markdown("Ask questions about personal finance or use the budget calculator.")
with gr.Tab("Chat Advisor"):
chatbot = gr.Chatbot(height=400)
msg = gr.Textbox(label="Ask about budgeting, emergency funds, debt, investing, retirement, etc.")
clear = gr.Button("Clear")
# Set up the chat interface
msg.submit(guided_response, [msg, chatbot], [msg, chatbot])
clear.click(lambda: None, None, chatbot, queue=False)
# Add some example prompts to help users
gr.Examples(
examples=[
"How should I create a budget?",
"How much should I save for an emergency fund?",
"What's the best way to pay off debt?",
"How should I start investing?",
"How can I save for retirement?"
],
inputs=msg
)
with gr.Tab("Budget Calculator"):
gr.Markdown("## 50/30/20 Budget Calculator")
with gr.Row():
income = gr.Number(label="Monthly Income (after tax)")
with gr.Row():
gr.Markdown("### Monthly Expenses (Needs)")
with gr.Row():
housing = gr.Number(label="Housing", value=0)
utilities = gr.Number(label="Utilities", value=0)
groceries = gr.Number(label="Groceries", value=0)
transport = gr.Number(label="Transportation", value=0)
calculate_btn = gr.Button("Calculate Budget")
output = gr.Textbox(label="Budget Analysis", lines=8)
calculate_btn.click(
calculate_budget,
inputs=[income, housing, utilities, groceries, transport],
outputs=output
)
# Launch the app
app.launch()