import argparse import os os.environ["PYTHONUTF8"] = "1" # Keep Windows encoding clean import torch from transformers import AutoTokenizer, AutoModelForCausalLM from peft import PeftModel # 1. Hardware setup DEVICE = "cuda" if torch.cuda.is_available() else "cpu" print(f"Running inference on: {DEVICE}") # 2. Define our local path and the base model we used BASE_MODEL_ID = "Qwen/Qwen2.5-0.5B-Instruct" ADAPTER_DIR = "./fine_tuned_gen_model" print("Loading tokenizer...") tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL_ID) print("Loading base model weights...") base_model = AutoModelForCausalLM.from_pretrained( BASE_MODEL_ID, torch_dtype=torch.float16 if DEVICE == "cuda" else torch.float32, ).to(DEVICE) print("Merging fine-tuned Juspay adapters...") # This layers your custom weights on top of the base model model = PeftModel.from_pretrained(base_model, ADAPTER_DIR).to(DEVICE) model.eval() # Put model in evaluation mode def generate_answer(user_query: str) -> str: prompt = f"User: {user_query}\nAssistant:" inputs = tokenizer(prompt, return_tensors="pt").to(DEVICE) with torch.no_grad(): output_ids = model.generate( **inputs, max_new_tokens=150, temperature=0.3, do_sample=True, top_p=0.95, pad_token_id=tokenizer.eos_token_id, eos_token_id=tokenizer.eos_token_id, ) generated_text = tokenizer.decode(output_ids[0], skip_special_tokens=True) return generated_text.replace(prompt, "").strip() def run_cli() -> None: print("\n🚀 Juspay Interview Bot Initialized! (Type 'quit' to exit)") print("-" * 50) while True: user_query = input("\nCandidate Question: ") if user_query.strip().lower() == "quit": break answer = generate_answer(user_query) print(f"\nAI Response:\n{answer}") print("-" * 50) def run_gradio() -> None: import gradio as gr with gr.Blocks() as demo: gr.Markdown("# Juspay Interview Bot") gr.Markdown( "Ask the fine-tuned Qwen model your interview questions and get an instant response." ) question = gr.Textbox( label="Candidate Question", placeholder="Enter your interview question here...", lines=4, ) answer = gr.Textbox(label="AI Response", lines=8) submit = gr.Button("Generate") submit.click(fn=generate_answer, inputs=question, outputs=answer) demo.launch(share=False) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Run the Juspay Interview Bot") parser.add_argument( "--interface", choices=["cli", "gradio"], default="gradio", help="Choose interface mode", ) args = parser.parse_args() if args.interface == "cli": run_cli() else: run_gradio()