# Vision 2030 Virtual Assistant with Arabic (ALLaM-7B) and English (Mistral-7B-Instruct) + RAG + Improved Prompting import gradio as gr from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline from langdetect import detect from sentence_transformers import SentenceTransformer import faiss import numpy as np # ---------------------------- # Load Arabic Model (ALLaM-7B) # ---------------------------- print("Loading ALLaM-7B-Instruct-preview for Arabic...") arabic_model_id = "ALLaM-AI/ALLaM-7B-Instruct-preview" arabic_tokenizer = AutoTokenizer.from_pretrained(arabic_model_id) arabic_model = AutoModelForCausalLM.from_pretrained(arabic_model_id, device_map="auto") arabic_pipe = pipeline("text-generation", model=arabic_model, tokenizer=arabic_tokenizer) # ---------------------------- # Load English Model (Mistral-7B-Instruct) # ---------------------------- print("Loading Mistral-7B-Instruct-v0.2 for English...") english_model_id = "mistralai/Mistral-7B-Instruct-v0.2" english_tokenizer = AutoTokenizer.from_pretrained(english_model_id) english_model = AutoModelForCausalLM.from_pretrained(english_model_id, device_map="auto") english_pipe = pipeline("text-generation", model=english_model, tokenizer=english_tokenizer) # ---------------------------- # Load Embedding Models for Retrieval # ---------------------------- print("Loading Embedding Models for Retrieval...") arabic_embedder = SentenceTransformer('CAMeL-Lab/bert-base-arabic-camelbert-ca') english_embedder = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2') # ---------------------------- # Prepare FAISS Index (dummy example) # ---------------------------- # In real scenario, load Vision 2030 documents, preprocess & embed # Here we'll create dummy data for demonstration documents = [ {"text": "Vision 2030 aims to diversify the Saudi economy.", "lang": "en"}, {"text": "رؤية 2030 تهدف إلى تنويع الاقتصاد السعودي.", "lang": "ar"} ] # Embed documents and build index english_vectors = [] arabic_vectors = [] english_texts = [] arabic_texts = [] for doc in documents: if doc["lang"] == "en": vec = english_embedder.encode(doc["text"]) english_vectors.append(vec) english_texts.append(doc["text"]) else: vec = arabic_embedder.encode(doc["text"]) arabic_vectors.append(vec) arabic_texts.append(doc["text"]) # FAISS indexes english_index = faiss.IndexFlatL2(len(english_vectors[0])) english_index.add(np.array(english_vectors)) arabic_index = faiss.IndexFlatL2(len(arabic_vectors[0])) arabic_index.add(np.array(arabic_vectors)) # ---------------------------- # Define the RAG response function with Improved Prompting # ---------------------------- def retrieve_and_generate(user_input): try: lang = detect(user_input) except: lang = "en" # Default fallback if lang == "ar": print("Detected Arabic input") query_vec = arabic_embedder.encode(user_input) D, I = arabic_index.search(np.array([query_vec]), k=1) context = arabic_texts[I[0][0]] if I[0][0] >= 0 else "" # Improved Arabic Prompt input_text = ( f"أنت خبير في رؤية السعودية 2030.\n" f"إليك بعض المعلومات المهمة:\n{context}\n\n" f"مثال:\n" f"السؤال: ما هي ركائز رؤية 2030؟\n" f"الإجابة: ركائز رؤية 2030 هي مجتمع حيوي، اقتصاد مزدهر، ووطن طموح.\n\n" f"أجب عن سؤال المستخدم بشكل واضح ودقيق.\n" f"السؤال: {user_input}\n" f"الإجابة:" ) response = arabic_pipe(input_text, max_new_tokens=256, do_sample=True, temperature=0.7) reply = response[0]['generated_text'] else: print("Detected English input") query_vec = english_embedder.encode(user_input) D, I = english_index.search(np.array([query_vec]), k=1) context = english_texts[I[0][0]] if I[0][0] >= 0 else "" # Improved English Prompt input_text = ( f"You are an expert on Saudi Arabia's Vision 2030.\n" f"Here is some relevant information:\n{context}\n\n" f"Example:\n" f"Question: What are the key pillars of Vision 2030?\n" f"Answer: The key pillars are a vibrant society, a thriving economy, and an ambitious nation.\n\n" f"Answer the user's question clearly and accurately.\n" f"Question: {user_input}\n" f"Answer:" ) response = english_pipe(input_text, max_new_tokens=256, do_sample=True, temperature=0.7) reply = response[0]['generated_text'] return reply # ---------------------------- # Gradio UI # ---------------------------- with gr.Blocks() as demo: gr.Markdown("# Vision 2030 Virtual Assistant 🌍\n\nSupports Arabic & English queries about Vision 2030 (with RAG retrieval and improved prompting).") chatbot = gr.Chatbot() msg = gr.Textbox(label="Ask me anything about Vision 2030") clear = gr.Button("Clear") def chat(message, history): reply = retrieve_and_generate(message) history.append((message, reply)) return history, "" msg.submit(chat, [msg, chatbot], [chatbot, msg]) clear.click(lambda: None, None, chatbot, queue=False) # Launching the space demo.launch()