|
|
|
|
|
"""AI Loan Officer Assistant.ipynb |
|
|
|
|
|
Automatically generated by Colab. |
|
|
|
|
|
Original file is located at |
|
|
https://colab.research.google.com/drive/1Om043ogOg3FZB4mkhCZY2gcOapGFM-5q |
|
|
""" |
|
|
|
|
|
import os |
|
|
import time |
|
|
import pandas as pd |
|
|
import gradio as gr |
|
|
from google import genai |
|
|
from google.genai import types |
|
|
from google.api_core import exceptions |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os |
|
|
import time |
|
|
import pandas as pd |
|
|
import gradio as gr |
|
|
from google import genai |
|
|
from google.genai import types |
|
|
from google.api_core import exceptions |
|
|
|
|
|
|
|
|
|
|
|
client = genai.Client(api_key=os.environ.get('GOOGLE_API_KEY')) |
|
|
|
|
|
|
|
|
STABLE_MODEL = "gemini-flash-latest" |
|
|
|
|
|
|
|
|
df_credit = pd.DataFrame({'ID': [1111, 2222, 3333, 4444, 5555], 'Credit_Score': [455, 685, 825, 840, 350]}) |
|
|
df_account = pd.DataFrame({ |
|
|
'ID': [1111, 2222, 3333, 4444, 5555], |
|
|
'Name': ['Loren', 'Matt', 'Hilda', 'Andy', 'Kit'], |
|
|
'Email': ['loren@gmail.com', 'matt@yahoo.com', 'halida@gmail.com', 'andy@gmail.com', 'kit@yahho.com'], |
|
|
'Status': ['Good-standing', 'Closed', 'Delinquent', 'Good-standing', 'Delinquent'], |
|
|
'Nationality': ['Singaporean', 'NonSingaporean', 'Singaporean', 'NonSingaporean', 'Singaporean'] |
|
|
}) |
|
|
df_gov = pd.DataFrame({'ID': [2222, 4444], 'PR_Status': [True, False]}) |
|
|
df_merged = df_account.merge(df_credit, on="ID").merge(df_gov, on="ID", how="left").fillna(False) |
|
|
|
|
|
|
|
|
risk_policy_file = client.files.upload(file="Bank Loan Overall Risk Policy.pdf") |
|
|
interest_policy_file = client.files.upload(file="Bank Loan Interest Rate Policy.pdf") |
|
|
|
|
|
|
|
|
def process_loan_request(applicant_id, customer_name_optional): |
|
|
try: |
|
|
|
|
|
row = df_merged[df_merged['ID'] == int(applicant_id)] |
|
|
if row.empty: return "Error: Applicant ID not found." |
|
|
applicant = row.iloc[0] |
|
|
|
|
|
|
|
|
prompt = f""" |
|
|
You are a Senior Loan Officer. Assess the application for the individual provided. |
|
|
Stick strictly to the information and tables provided in the attached PDF policies. |
|
|
|
|
|
APPLICANT DATA: |
|
|
Name: {applicant['Name']} |
|
|
ID: {applicant_id} |
|
|
Email: {applicant['Email']} |
|
|
Credit Score: {applicant['Credit_Score']} |
|
|
Account Status: {applicant['Status']} |
|
|
Nationality: {applicant['Nationality']} |
|
|
PR Status: {applicant['PR_Status']} |
|
|
|
|
|
REQUIRED OUTPUT PATTERN: |
|
|
|
|
|
# Loan Assessment Report: {applicant['Name']} (ID: {applicant_id}, Email: {applicant['Email']}) |
|
|
|
|
|
### **1. Info Retrieval** |
|
|
| Applicant Detail | Value | |
|
|
| :--- | :--- | |
|
|
| Name (ID) | {applicant['Name']} ({applicant_id}) | |
|
|
| Credit Score | {applicant['Credit_Score']} | |
|
|
| Account Status | {applicant['Status']} | |
|
|
| Nationality | {applicant['Nationality']} | |
|
|
| PR Status | {applicant['PR_Status']} | |
|
|
|
|
|
### **2. PR Status Check** |
|
|
- For Non-Singaporean applicants: State result as "PR Status -> [True/False]". |
|
|
- For Singaporean applicants: State "Check not required for Singaporean". |
|
|
|
|
|
### **3. Overall Risk Assessment** |
|
|
- Reference 'Bank Loan Overall Risk Policy.pdf'. |
|
|
- Calculation: Credit Score [{applicant['Credit_Score']}] + Account Status [{applicant['Status']}] -> Overall Risk: [Value from Table] |
|
|
|
|
|
### **4. Interest Rate Determination** |
|
|
- Reference 'Bank Loan Interest Rate Policy.pdf'. |
|
|
- Calculation: Overall Risk [Value from Table] -> [Rate from Table] |
|
|
- Apply conservative rule if risk falls between categories. |
|
|
|
|
|
### **5. Final Report & Recommendation** |
|
|
- Recommend the loan interest rate OR Not recommend. |
|
|
- Rationale: Based on risk profile and compliance (PR false for Non-Singaporean leads to 'Not recommend'). |
|
|
""" |
|
|
|
|
|
|
|
|
response = client.models.generate_content( |
|
|
model=STABLE_MODEL, |
|
|
contents=[risk_policy_file, interest_policy_file, prompt] |
|
|
) |
|
|
return response.text |
|
|
|
|
|
except exceptions.ResourceExhausted: |
|
|
return "Error: Quota reached. Please wait 60 seconds." |
|
|
except Exception as e: |
|
|
return f"System Error: {str(e)}" |
|
|
|
|
|
|
|
|
demo = gr.Interface( |
|
|
fn=process_loan_request, |
|
|
inputs=[gr.Textbox(label="Applicant ID"), gr.Textbox(label="Name (Optional)")], |
|
|
outputs=gr.Markdown(), |
|
|
title="🏦 Enterprise AI Loan Risk Assessment Tool" |
|
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |