import gradio as gr import openai import fitz # PyMuPDF import torch from transformers import pipeline, BloomForCausalLM, BloomTokenizerFast from huggingface_hub import login import requests import os import transformers hf_api_key = os.getenv("HF_API_KEY") login(token=hf_api_key) # Set OpenAI and Hugging Face API keys openai.api_key = os.getenv("openai") def extract_text_from_pdf(pdf_file): document = fitz.open(pdf_file) text = "" for page_num in range(len(document)): page = document.load_page(page_num) text += page.get_text() return text # Initialize the Gemma model gemma_pipe = pipeline( "text-generation", model="google/gemma-2-2b-it", model_kwargs={"torch_dtype": torch.bfloat16}, device="cpu" ) # Initialize the Bloom model bloom_model = BloomForCausalLM.from_pretrained("bigscience/bloom-560m") bloom_tokenizer = BloomTokenizerFast.from_pretrained("bigscience/bloom-560m") def evaluate_with_gpt(resume_text, job_description): prompt = f"""من یک مسءول استخدام هستم و میخوام درصد تطابق عنوان شغلی فرد با شرح شغلی را برای من محاسبه کنی. لطفا درصد تطابق بین نمونه کار کارجو و نمونه کار ذکرشده در شرح شغلی را بدست بیار و دقیق 0یا 1 را محاسبه کن. میخوام خودت به عنوان یک مدل زبانی 0یا 1 بدی . عنوان شغلی: {resume_text} شرح شغل: {job_description} """ try: response = openai.ChatCompletion.create( model="gpt-4o-mini", # یا مدل دیگر messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": prompt} ], temperature=0 # دما ثابت است ) return response.choices[0].message['content'] except Exception as e: return f"Error during resume evaluation: {e}" def evaluate_with_gemma(pdf_file, job_description): resume_text = extract_text_from_pdf(pdf_file) keywords = "وضعیت خدمت سربازی، سن، محل سکونت، محدوده حقوق پرداختی، میزان سابقه کار مدیریتی، میزان سابقه کار مرتبط با گروه شغلی مشابه، میزان سابقه کار در صنعت، میزان تحصیلات، مهارت زبان، مهارت های نرم افزاری" prompt = f""" به عنوان یک تحلیلگر با تجربه سیستم ردیابی متقاضی (ATS)، نقش شما شامل ارزیابی رزومه نسبت به شرح شغل و کلمات کلیدی مشخصی است. لطفاً رزومه فرد را با در نظر گرفتن کلمات کلیدی تعیین شده مطابقت دهید و درصد تطابق را بر اساس معیارهای کلیدی و همچنین تعداد کلمات کلیدی گمشده و منطبق محاسبه کنید. ارزیابی را بر اساس دقیقا این کلمات کلیدی {keywords} محاسبه کن. شرح شغل: {job_description} رزومه: {resume_text} من پاسخ را در یک رشته با ساختار زیر می‌خواهم: {{"تطابق شرح شغل با رزومه فرد ":"%"، "تعداد کلمات کلیدی غیر منطبق ":""، "تعداد کلمات کلیدی منطبق ":""}} """ outputs = gemma_pipe(prompt, max_new_tokens=256) return outputs[0]["generated_text"].strip() from transformers import AutoModelForCausalLM, AutoTokenizer import torch def evaluate_with_qwen(resume_text, job_description): # بارگذاری مدل و توکنایزر model = AutoModelForCausalLM.from_pretrained( "Qwen/Qwen2-1.5B-Instruct", torch_dtype="auto", device_map="auto" ).to("cuda" if torch.cuda.is_available() else "cpu") tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-72B-Instruct") # تعریف پرامپت prompt = f""" من یک مسءول استخدام هستم و میخوام درصد تطابق رزومه فرد با شرح شغلی را برای من محاسبه کنی لطفا درصد تطابق بین رزومه و شرح شغلی را بدست بیار. لطفا دقیق این درصد را محاسبه کن. میخوام خودت به عنوان یک مدل زبانی درصد تطابق را برای من محاسبه کنی. شرح شغل: {job_description} رزومه: {resume_text} """ # آماده‌سازی پیام برای مدل messages = [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": prompt} ] text = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True ) model_inputs = tokenizer([text], return_tensors="pt").to("cuda" if torch.cuda.is_available() else "cpu") # تولید پاسخ generated_ids = model.generate( model_inputs.input_ids, max_new_tokens=512 ) # حذف توکن‌های ورودی از پاسخ تولید شده generated_ids = [ output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids) ] # تبدیل پاسخ به متن response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0] return response def evaluate_with_bloom(pdf_file, job_description): resume_text = extract_text_from_pdf(pdf_file) keywords = "وضعیت خدمت سربازی، سن، محل سکونت، محدوده حقوق پرداختی، میزان سابقه کار مدیریتی، میزان سابقه کار مرتبط با گروه شغلی مشابه، میزان سابقه کار در صنعت، میزان تحصیلات، مهارت زبان، مهارت های نرم افزاری" prompt = f""" به عنوان یک تحلیلگر با تجربه سیستم ردیابی متقاضی (ATS)، نقش شما شامل ارزیابی رزومه نسبت به شرح شغل و کلمات کلیدی مشخصی است. لطفاً رزومه فرد را با در نظر گرفتن کلمات کلیدی تعیین شده مطابقت دهید و درصد تطابق را بر اساس معیارهای کلیدی و همچنین تعداد کلمات کلیدی گمشده و منطبق محاسبه کنید. ارزیابی را بر اساس دقیقا این کلمات کلیدی {keywords} محاسبه کن. شرح شغل: {job_description} رزومه: {resume_text}""" inputs = bloom_tokenizer(prompt, return_tensors="pt") outputs = bloom_model.generate(inputs["input_ids"], max_length=2000) return bloom_tokenizer.decode(outputs[0], skip_special_tokens=True).strip() def evaluate_with_jabir(resume_text, job_description): #resume_text = extract_text_from_pdf(pdf_file) prompt = f"""من یک مسءول استخدام هستم و میخوام درصد تطابق رزومه فرد با شرح شغلی را برای من محاسبه کنی لطفا درصد تطابق بین رزومه و شرح شغلی را بدست بیارلطفا دقیق این درصد را محاسبه کن شرح شغل: {job_description} رزومه: {resume_text}""" base_url = "https://api.jabirproject.org/generate" headers = {"apikey": "7471142a-deb4-4a70-8ee3-6603e21bcc1d"} data = { "messages": [{"role": "user", "content": prompt}] } response = requests.post(base_url, headers=headers, json=data) if response.ok: return response.json() else: return f"Error: {response.status_code}, {response.text}" hf_api_key = os.getenv("HF_API_KEY1") login(token=hf_api_key) model_id = "meta-llama/Meta-Llama-3.1-8B-Instruct" pipeline = transformers.pipeline( "text-generation", model=model_id, model_kwargs={"torch_dtype": torch.bfloat16}, device_map="auto", ) def evaluate_with_llama(resume_text, job_description): keywords = "وضعیت خدمت سربازی، سن، محل سکونت، محدوده حقوق پرداختی، میزان سابقه کار مدیریتی، میزان سابقه کار مرتبط با گروه شغلی مشابه، میزان سابقه کار در صنعت، میزان تحصیلات، مهارت زبان، مهارت های نرم افزاری" prompt = f""" به عنوان یک تحلیلگر با تجربه سیستم ردیابی متقاضی (ATS)، نقش شما شامل ارزیابی رزومه نسبت به شرح شغل و کلمات کلیدی مشخصی است. لطفاً رزومه فرد را با در نظر گرفتن کلمات کلیدی تعیین شده مطابقت دهید و درصد تطابق را بر اساس معیارهای کلیدی و همچنین تعداد کلمات کلیدی گمشده و منطبق محاسبه کنید. ارزیابی را بر اساس دقیقا این کلمات کلیدی {keywords} محاسبه کن. شرح شغل: {job_description} رزومه: {resume_text} من پاسخ را در یک رشته با ساختار زیر می‌خواهم: {{"تطابق شرح شغل با رزومه فرد ":"%", "تعداد کلمات کلیدی غیر منطبق ":"", "تعداد کلمات کلیدی منطبق ":""}} """ outputs = pipeline( prompt, max_new_tokens=256, ) return outputs[0]["generated_text"]