| import os |
| import torch |
| import gradio as gr |
| from transformers import AutoModelForCausalLM, AutoTokenizer |
| from peft import PeftModel |
|
|
| |
| |
| |
| |
| BASE_MODEL = "mistralai/Mistral-7B-Instruct-v0.2" |
| LORA_PATH = "vastu_lora_adapter_975" |
| DEVICE = "cpu" |
|
|
| HF_TOKEN = os.getenv("HF_TOKEN") |
|
|
| SYSTEM_PROMPT = """You are a strict and authoritative Vastu Shastra expert. |
| You clearly classify every placement as IDEAL, ACCEPTABLE, or INADVISABLE. |
| You always give practical remedies if something is wrong. |
| Your tone is confident, traditional, and decisive. |
| Avoid unnecessary philosophy. Be precise and actionable. |
| """ |
|
|
| |
| |
| |
| @torch.inference_mode() |
| def load_model(): |
| tokenizer = AutoTokenizer.from_pretrained( |
| BASE_MODEL, |
| token=HF_TOKEN, |
| trust_remote_code=True, |
| ) |
| tokenizer.pad_token = tokenizer.eos_token |
|
|
| base_model = AutoModelForCausalLM.from_pretrained( |
| BASE_MODEL, |
| token=HF_TOKEN, |
| torch_dtype=torch.float32, |
| device_map="cpu", |
| low_cpu_mem_usage=True, |
| trust_remote_code=True, |
| ) |
|
|
| model = PeftModel.from_pretrained( |
| base_model, |
| LORA_PATH, |
| ) |
|
|
| model.eval() |
| return model, tokenizer |
|
|
|
|
| model, tokenizer = load_model() |
|
|
| |
| |
| |
| def generate_response(user_prompt): |
| prompt = f"""### System: |
| {SYSTEM_PROMPT} |
| ### User: |
| {user_prompt} |
| ### Response: |
| """ |
|
|
| inputs = tokenizer(prompt, return_tensors="pt") |
|
|
| outputs = model.generate( |
| **inputs, |
| max_new_tokens=128, |
| do_sample=False, |
| temperature=0.3, |
| repetition_penalty=1.1, |
| pad_token_id=tokenizer.eos_token_id, |
| ) |
|
|
| decoded = tokenizer.decode(outputs[0], skip_special_tokens=True) |
| return decoded.split("### Response:")[-1].strip() |
|
|
|
|
| |
| |
| |
| with gr.Blocks(title="π§ Vastu AI Advisor (CPU)") as demo: |
| gr.Markdown("# π§ Vastu AI Advisor") |
| gr.Markdown( |
| "**CPU-based demo.** Responses may take ~30β45 seconds.\n\n" |
| "Ask questions about room placement, directions, and remedies." |
| ) |
|
|
| chatbot = gr.Chatbot(height=420) |
| msg = gr.Textbox( |
| placeholder="Ask a Vastu question (e.g. Is a toilet in NE acceptable?)", |
| lines=2, |
| ) |
|
|
| def chat(user_msg, history): |
| response = generate_response(user_msg) |
| history.append((user_msg, response)) |
| return history, "" |
|
|
| msg.submit(chat, [msg, chatbot], [chatbot, msg]) |
|
|
|
|
| demo.launch( |
| server_name="0.0.0.0", |
| server_port=7860, |
| ) |
|
|
|
|