Spaces:
Runtime error
Runtime error
| # backend/app/ai_processor.py | |
| import torch | |
| from transformers import AutoModelForSeq2SeqLM, AutoTokenizer | |
| import os | |
| import traceback # Untuk logging error | |
| # --- MODEL_NAME tetap sama seperti yang sudah Anda pilih dan uji --- | |
| MODEL_NAME = "google/flan-t5-small" | |
| # MODEL_NAME = "facebook/bart-large-cnn" | |
| # MODEL_NAME = "sshleifer/distilbart-cnn-6-6" | |
| model = None | |
| tokenizer = None | |
| device = None | |
| def initialize_model(): | |
| global model, tokenizer, device | |
| if model is not None and tokenizer is not None: | |
| # print("INFO: AI Processor - Model dan tokenizer sudah dimuat.") # Bisa di-uncomment jika perlu | |
| return True | |
| try: | |
| print(f"INFO: AI Processor - Memulai proses pemuatan model: {MODEL_NAME}...") | |
| if torch.cuda.is_available(): | |
| device = torch.device("cuda") | |
| print("INFO: AI Processor - GPU (CUDA) terdeteksi.") | |
| else: | |
| device = torch.device("cpu") | |
| print("INFO: AI Processor - GPU tidak terdeteksi, menggunakan CPU.") | |
| print(f"INFO: AI Processor - Memuat tokenizer untuk {MODEL_NAME}...") | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) | |
| print("INFO: AI Processor - Tokenizer berhasil dimuat.") | |
| print(f"INFO: AI Processor - Memuat model {MODEL_NAME} ke device {device}...") | |
| model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_NAME) | |
| model.to(device) | |
| model.eval() | |
| print(f"INFO: AI Processor - Model {MODEL_NAME} berhasil dimuat ke {device}.") | |
| return True | |
| except Exception as e: | |
| print(f"ERROR: AI Processor - Gagal memuat model {MODEL_NAME}: {str(e)}") | |
| traceback.print_exc() | |
| model = None | |
| tokenizer = None | |
| return False | |
| def generate_cv_summary(input_text: str) -> str: | |
| global model, tokenizer, device | |
| if model is None or tokenizer is None: | |
| error_msg = "ERROR: AI Processor - Model atau tokenizer belum berhasil diinisialisasi. Coba panggil initialize_model() lagi." | |
| print(error_msg) | |
| if not initialize_model(): # Coba inisialisasi ulang | |
| return error_msg + " Inisialisasi ulang juga gagal." | |
| if model is None or tokenizer is None: # Cek lagi setelah coba inisialisasi ulang | |
| return "ERROR: AI Processor - Model tetap tidak tersedia setelah mencoba inisialisasi ulang." | |
| # Log ini bisa dipertahankan untuk melihat apa yang diproses | |
| # print(f"INFO: AI Processor - Menerima teks untuk diringkas (panjang: {len(input_text)} char).") | |
| try: | |
| # --- PROMPT ANDA YANG SUDAH DISESUAIKAN --- | |
| prompt_prefix = "Summarize the following work experience for a professional, ATS-friendly CV. Focus on quantifiable achievements, key responsibilities, and relevant skills. Use concise bullet points if appropriate: " | |
| # Atau prompt lain yang sudah Anda temukan bekerja dengan baik. | |
| # ----------------------------------------- | |
| text_to_summarize = prompt_prefix + input_text | |
| # print(f"DEBUG: AI Processor - Teks input ke tokenizer: '{text_to_summarize[:100]}...'") # Hapus jika terlalu verbose | |
| inputs = tokenizer(text_to_summarize, return_tensors="pt", max_length=1024, truncation=True, padding="longest") | |
| input_ids = inputs.input_ids.to(device) | |
| attention_mask = inputs.attention_mask.to(device) | |
| # print(f"DEBUG: AI Processor - Melakukan inferensi pada device {device}...") # Hapus jika terlalu verbose | |
| with torch.no_grad(): | |
| summary_ids = model.generate( | |
| input_ids, | |
| attention_mask=attention_mask, | |
| max_length=250, | |
| min_length=50, | |
| num_beams=4, | |
| early_stopping=True, | |
| no_repeat_ngram_size=3, | |
| ) | |
| summary_text = tokenizer.decode(summary_ids[0], skip_special_tokens=True) | |
| # print(f"INFO: AI Processor - Ringkasan digenerate: '{summary_text[:100]}...'") # Bisa dipertahankan | |
| return summary_text.strip() | |
| except Exception as e: | |
| print(f"ERROR: AI Processor - Error saat proses generasi ringkasan: {str(e)}") | |
| traceback.print_exc() | |
| return "Error: Terjadi masalah internal pada AI saat mencoba membuat ringkasan. Silakan coba lagi." | |
| # initialize_model() akan dipanggil dari startup event di main.py |