import os os.system("pip install git+https://github.com/shumingma/transformers.git") import threading import torch import torch._dynamo torch._dynamo.config.suppress_errors = True import numpy as np from transformers import ( AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer, ) from sentence_transformers import SentenceTransformer from PyPDF2 import PdfReader from sklearn.metrics.pairwise import cosine_similarity import gradio as gr BITNET_ID = "microsoft/bitnet-b1.58-2B-4T" # Load models tokenizer = AutoTokenizer.from_pretrained(BITNET_ID) bitnet = AutoModelForCausalLM.from_pretrained( BITNET_ID, torch_dtype=torch.bfloat16, device_map="auto" ) def extract_pdf_text(file_obj, max_chars=5000): """Extracts and returns up to max_chars of text from all pages of a PDF.""" reader = PdfReader(file_obj) text = "\n".join([page.extract_text() for page in reader.pages if page.extract_text()]) return text[:max_chars] def summarize_document(file, system_message, max_tokens, temperature, top_p): if not file: return "⚠️ Adjunta un archivo PDF primero." # Extraer los primeros 5000 caracteres text_fragment = extract_pdf_text(file, max_chars=5000) if not text_fragment: return "❌ No se pudo extraer texto del PDF." input_text = system_message + "\n" + text_fragment inputs = tokenizer(input_text, return_tensors="pt").to(bitnet.device) output_ids = bitnet.generate( **inputs, max_new_tokens=max_tokens, do_sample=True, temperature=temperature, top_p=top_p, pad_token_id=tokenizer.eos_token_id ) full_output = tokenizer.decode(output_ids[0], skip_special_tokens=True) # Quitar el system_message duplicado, si lo hay if full_output.startswith(system_message): summary = full_output[len(system_message):].strip() else: summary = full_output # Limitar la longitud del resumen a 1024 caracteres max_output_length = 1024 if len(summary) > max_output_length: summary = summary[:max_output_length] + "..." return summary css = """ .gradio-container { max-width: 800px !important; margin: auto; } h1, h2 { text-align: center; } """ with gr.Blocks(css=css, theme=gr.themes.Soft(), title="Resumen BITNet de PDF Científico") as demo: gr.HTML("