import spaces import os import gradio as gr from pdf2image import convert_from_path from byaldi import RAGMultiModalModel from transformers import Qwen2VLForConditionalGeneration, AutoProcessor from qwen_vl_utils import process_vision_info import torch import torchvision import subprocess def install_poppler(): try: subprocess.run(["pdfinfo"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) except FileNotFoundError: print("Poppler not found. Installing...") subprocess.run("apt-get update", shell=True) subprocess.run("apt-get install -y poppler-utils", shell=True) install_poppler() subprocess.run('pip install flash-attn --no-build-isolation', env={'FLASH_ATTENTION_SKIP_CUDA_BUILD': "TRUE"}, shell=True) RAG = RAGMultiModalModel.from_pretrained("vidore/colpali-v1.2") model = Qwen2VLForConditionalGeneration.from_pretrained("Qwen/Qwen2-VL-2B-Instruct", trust_remote_code=True, torch_dtype=torch.bfloat16).cuda().eval() processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-2B-Instruct", trust_remote_code=True) @spaces.GPU() def process_pdf_and_query(pdf_file, user_query): images = convert_from_path(pdf_file.name) num_images = len(images) RAG.index( input_path=pdf_file.name, index_name="image_index", store_collection_with_index=False, overwrite=True ) results = RAG.search(user_query, k=1) if not results: return "No results found.", num_images image_index = results[0]["page_num"] - 1 messages = [ { "role": "user", "content": [ { "type": "image", "image": images[image_index], }, {"type": "text", "text": user_query}, ], } ] text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) image_inputs, video_inputs = process_vision_info(messages) inputs = processor( text=[text], images=image_inputs, videos=video_inputs, padding=True, return_tensors="pt", ) inputs = inputs.to("cuda") generated_ids = model.generate(**inputs, max_new_tokens=50) generated_ids_trimmed = [ out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) ] output_text = processor.batch_decode( generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False ) return output_text[0], num_images css = """ body { font-family: Arial, sans-serif; background-color: #2b2b2b; color: #e0e0e0; } .container { max-width: 800px; margin: 0 auto; padding: 20px; background-color: #363636; border-radius: 10px; box-shadow: 0 0 10px rgba(0,0,0,0.3); } .title { font-size: 24px; font-weight: bold; text-align: center; margin-bottom: 20px; color: #50fa7b; } .submit-btn { background-color: #50fa7b; color: #282a36; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; font-weight: bold; } .submit-btn:hover { background-color: #45c967; } .duplicate-button { background-color: #8be9fd; color: #282a36; padding: 10px 20px; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; font-weight: bold; margin-top: 20px; } .duplicate-button:hover { background-color: #79c7d8; } a { color: #8be9fd; text-decoration: none; } a:hover { text-decoration: underline; } """ explanation = """
MICA est une intelligene artificielle dédiée à la comptabilité associative, offrant analyse automatisée, recommandations personnalisées et conformité RGPD. Il simplifie la gestion comptable, optimise les décisions et détecte les anomalies. MICA complète l’expertise humaine pour un gain de temps et de précision, tout en respectant les spécificités du secteur associatif.