The FinAI chatbot is your personal financial assistant that answers questions about your money in natural, conversational language. Ask anything about your spending patterns, wallet balances, or recent transactions, and get instant, context-aware responses.
# From app/routes/ai.py:80-83wallets = Wallet.query.filter_by(user_id=user_id).all()context_text = "--- TỔNG QUAN TÀI CHÍNH ---\nSỐ DƯ CÁC VÍ:\n"for w in wallets: context_text += f"- {w.name}: {int(w.balance):,} VND\n"
Example context:
SỐ DƯ CÁC VÍ:- Tiền mặt: 5,000,000 VND- Techcombank: 25,000,000 VND- Momo: 1,500,000 VND
The AI receives a detailed prompt that defines its personality and response style:
# From app/ai_service.py:76-98prompt = f"""Bạn là FinAI – một trợ lý tài chính cá nhân thông minh, thân thiện, nói chuyện tự nhiên như một người bạn hiểu về tiền bạc.Dữ liệu tài chính gần đây của người dùng:{context_data}Câu hỏi: "{user_question}"Cách trả lời:- Trả lời kết quả chính ngay câu đầu tiên (ngắn gọn, rõ ràng).- Viết như đang nói chuyện thật, KHÔNG mang văn phong báo cáo.- Không dùng các câu mở đầu kiểu: "Dựa trên dữ liệu...", "Theo thông tin tôi có..."- Nếu có lời khuyên hoặc cảnh báo, hãy xuống dòng 1 lần trước khi viết.- Dùng emoji nhẹ nhàng (1–2 cái là đủ).- Giữ câu trả lời trong 3–6 câu, tránh lan man.Nếu thiếu dữ liệu, hỏi lại một cách tự nhiên như đang trò chuyện.QUY TẮC KẾ TOÁN (BẮT BUỘC):- "CHI TIÊU" = tiền ra khỏi hệ thống.- "CHUYỂN KHOẢN" = tiền chuyển giữa ví của bạn → KHÔNG phải chi tiêu.- Khi tính tổng chi tiêu: TUYỆT ĐỐI không cộng chuyển khoản."""
[ { "role": "user", "content": "Tháng này tôi chi tiêu bao nhiêu?" }, { "role": "ai", "content": "Tháng này bạn chi tiêu tổng cộng 5,500,000đ. Phần lớn tiền đi vào Ăn uống (3.5 triệu) và Xăng xe (1.2 triệu). Có vẻ tháng này bạn ăn uống nhiều hơn bình thường đấy!" }]
The API returns the 20 most recent messages, ordered chronologically (app/routes/ai.py:154).
User: “Tháng này tôi chi tiêu bao nhiêu?”FinAI: “Tháng này bạn chi tiêu tổng cộng 5,500,000đ. Trong đó Ăn uống chiếm nhiều nhất với 3.5 triệu, tiếp theo là Xăng xe 1.2 triệu và Giải trí 800k.Lưu ý là tôi không tính chuyển khoản giữa các ví của bạn nhé, đó không phải chi tiêu thật.”
Example: Asking about wallet balance
User: “Tôi còn bao nhiêu tiền trong ví Momo?”FinAI: “Ví Momo của bạn đang có 1,500,000đ.”
Example: Asking for financial advice
User: “Tôi nên tiết kiệm như thế nào?”FinAI: “Nhìn vào chi tiêu của bạn, tôi thấy Ăn uống chiếm tới 3.5 triệu/tháng. Bạn có thể thử nấu ăn tại nhà nhiều hơn, hoặc giảm số lần đi cafe xuống còn 3-4 lần/tuần.Ngoài ra, tháng này bạn chuyển 2 triệu vào tiết kiệm rồi, đó là dấu hiệu tốt! Cứ giữ thói quen này nhé.”
Example: Handling missing data
User: “Tôi có vượt ngân sách không?”FinAI: “Bạn chưa tạo ngân sách nào cả. Muốn tôi hướng dẫn cách tạo ngân sách không?”
The AI is specifically trained to distinguish between expenses and transfers:
# From app/ai_service.py:94-97QUY TẮC KẾ TOÁN (BẮT BUỘC):- "CHI TIÊU" = tiền ra khỏi hệ thống.- "CHUYỂN KHOẢN" = tiền chuyển giữa ví của bạn → KHÔNG phải chi tiêu.- Khi tính tổng chi tiêu: TUYỆT ĐỐI không cộng chuyển khoản.
This prevents the AI from incorrectly inflating your spending totals by counting internal transfers between your own wallets.
# From app/ai_service.py:107-109except Exception as e: print(f"Chat Error: {e}") return "Xin lỗi, hệ thống AI đang bận kết nối. Vui lòng thử lại sau vài giây nhé!"
The system returns a friendly Vietnamese error message and logs the technical error for debugging.
# From app/routes/ai.py:86-92# Uses GROUP BY to aggregate spending by category in one queryexpense_summary = db.session.query( Category.name, func.sum(Transaction.amount)).join(...).filter(...).group_by(Category.name).all()
This prevents N+1 query problems and reduces database load.
# From app/routes/ai.py:171-177user_setting = UserSetting.query.get(user_id)if user_setting and user_setting.ai_suggestions == 0: return jsonify({ 'status': 'disabled', 'message': 'Tính năng AI đang bị tắt.' })
This applies to the dashboard insights feature (see Reports).