AI Lebenslauf-Ranking

Heutzutage erhalten Unternehmen Hunderte von Bewerbungen für eine einzige Stelle. Personalabteilung und Management müssen eine riesige Menge an Lebensläufen prüfen, um die richtigen Kandidaten für eine einzige Stelle zu finden. Was wäre, wenn KI uns helfen könnte, diesen Prozess schneller und genauer zu gestalten? Bei Innoprox Labs haben wir beschlossen, diese Frage mit Hilfe von NLP und LLMs wie Llama zu beantworten.

Wie AI/LLMs ihre HR Arbeitsabläufe beschleunigen kann

Heutzutage erhalten Unternehmen Hunderte von Bewerbungen für eine einzige Stelle. Personalabteilung und Management müssen eine riesige Menge an Lebensläufen prüfen, um die richtigen Kandidaten für eine einzige Stelle zu finden. Was wäre, wenn KI uns helfen könnte, diesen Prozess schneller und genauer zu gestalten? Bei Innoprox Labs haben wir beschlossen, diese Frage mit Hilfe von NLP und LLMs wie Llama zu beantworten.

Die Herausforderung besteht darin, eine Lösung zu finden, die eine bestimmte Stelle mit allen von den Bewerbern gesendet Dokumenten vergleicht und die Lebensläufe von der höchsten bis zur niedrigsten Übereinstimmung kategorisiert. Im Bereich der NLP ist dies eine Aufgabe der Textklassifikation und der semantischen Ähnlichkeit. Als Lösung schlagen wir vor, die Verwendung von NLTK zur Vorverarbeitung aller Dokumente, einen LLM zur generieren von Vektor-Embeddings für jeden Lebenslauf und die Stellenbeschreibung und einen Ähnlichkeitsalgorithmus zum Vergleich der Vektor-Embeddings jedes Lebenslaufs mit den Vektoren der Stellenbeschreibung.

Unsere Lösung

Für die Vorverarbeitung der Daten haben wir NLTK verwendet. Dieses Toolkit enthält eine Reihe von Textverarbeitungsbibliotheken, die Aufgaben wie Tagging, Tokenisierung und die Entfernung von überflüssig Stoppwörtern, die für die semantische Analyse nicht relevant sind, erleichtern. Bei der Wahl zwischen der Tokenisierung von Wörtern und Sätzen ist es wichtig, die Auswirkungen jeder Strategien zu verstehen:

Tokenisierung von Wörtern: Wir können Texte vergleichen, indem wir die Beziehungen zwischen allen Wörtern untersuchen. Mit dieser Art der Tokenisierung können Nuancen in der Wortwahl und Umschreibung erfasst werden.

Tokenisierung von Sätzen: Sie kann die Gesamtbedeutung zwischen Sätzen erfassen, was robuster gegenüber Variationen in der Wortwahl ist. Sie konzentriert sich mehr auf die Gesamtaussage als auf den Wortgebrauch, was nützlich sein kann, um verschiedene Ideen zu erkennen, die auf unterschiedliche Weise ausgedrückt werden.

In Anbetracht der Tatsache, dass Lebensläufe ein bis mehrere Seiten lang sein können und berufliche Fähigkeiten und Erfahrungen auf verschiedene Weise beschrieben werden können, ist es sinnvoller, sich für eine Satz-Tokenisierung zu entscheiden. Dies erfordert auch weniger Computerressourcen, da der feature-space kleiner ist. Dennoch haben wir beschlossen, beides auszuprobieren, um beide Methoden bezüglich ihrer Genauigkeit zu vergleichen. Unsere Vermutung war richtig: die Satz-Tokenisierung bietet eine insgesamt bessere Genauigkeit für diese Aufgabe. Hier ist ein Beispiel für die Verwendung von NLTK für diese Aufgaben:

fom nltk import pos_tag, sent_tokenize
from nltk.corpues import stopwords
resume_features = []
stop_words = set(stopwords.words("english"))
sentences = sent_tokenize(text)
for sentence in sentences:
  words = [word for word in sentence if word not in stop_words]
  tagged_words = pos_tag(words)
  filtered_words = [word for word, tag in tagged_words if tag not in ['DT', 'IN', 'TO', 'PRP', 'WP']]
  resume_features.extend(filtered_words)

Für die Generierung der Embeddings haben wir uns für die Verwendung von zwei vor-trainierten Modellen entschieden: BERT und Llama. BERT ist ein Modell, das eine Transformator-Encoder-Architektur verwendet und oft für Aufgaben wie Textklassifikation, Stimmungsanalyse und Satzähnlichkeit eingesetzt wird. Llama ist ein transformationsbasiertes Sprachmodell, das sich auf eine effiziente Skalierung und Entwicklung konzentriert. Es ist effizient für eine Vielzahl von Aufgaben, inklusive Textgenerierung und -verständnis, KI-Konversations und fortgeschrittenere NLP-Aufgaben. Es ist ein aktuelleres Modell, das in den letzten Jahren aktualisiert wurde, wobei die letzte Version Llama 3 im Jahr 2023 veröffentlicht wurde.

Wir haben uns für BERT entschieden, um unsere Lösung auf konventionellen Laptops ausführen zu können, zumal Llama eine große Menge an RAM und eine High-End-GPU benötigt, um Embeddings in angemessener Zeit zu generieren. Dies ermöglichte es uns, Hunderte von Tests mit einem kleinen Modell durchzuführen, um die Auswirkungen der Textvorverarbeitung und der Feature-Generierung zu bewerten. Um die Verwendung mehrerer Modelle und die Möglichkeit, in Zukunft weitere hinzuzufügen, zu erleichtern, haben wir Hugging Face als Transformers-Paket verwendet. Es bietet einen einfachen Zugang zu mehreren vortrainierten und fine-tunning Modellen, nachdem man ein Konto erstellt, den Zugang beantragt und ein Zugangstoken generiert hat. Hier ist ein Beispiel für die Verwendung der Transformers-Bibliothek mit Llama 2:

from transformers import AutoModel, AutoTokenizer, AutoModelForTokenClassification, AutoModelForCausalLM
import torch
access_token = "your-hf-token"
model_name = "meta-llama/Llama-2-7b-hf
device = "cuda" if torch.cuda.is_available() else "cpu"        
model = AutoModelForCausalLM.from_pretrained(model_name, token=access_token)
tokenizer = AutoTokenizer.from_pretrained(model_name, token=access_token)
tokenizer.pad_token = tokenizer.eos_token"
model.to(device)
resume_embeddings = []
batch_size = 16
with torch.no_grad():
    for i in range(0, len(resume_features), batch_size):
        batch_features = features[i:i+batch_size]
        inputs = tokenizer(batch_features, return_tensors="pt", truncation=True, padding=True, max_length=512).to(device)
        outputs = model(**inputs, output_hidden_states=True)
        hidden_states = outputs.hidden_states[-1]
        embeddings = hidden_states.mean(dim=1).detach().to(device).numpy()
        resume_embeddings.extend(embeddings)

Für den Vergleich der Embeddings von Stellenangeboten und Lebensläufen haben wir die Kosinus-Ähnlichkeit als Metrik gewählt. Diese Metrik wird häufig verwendet, um die Ähnlichkeit zwischen Sätzen, Absätzen oder Dokumenten zu messen, wobei jedes Dokument als ein Vektor von Worthäufigkeiten dargestellt wird. Die Kosinus-Ähnlichkeit mißt, wie ähnlich zwei Vektoren/Embeddings sind, und sie ist einfach zu berechnen, was sie für unsere Aufgabe geeignet macht.

Für jeden Lebenslauf wird eine Ähnlichkeitsmatrix erstellt, indem die Ähnlichkeit aller Embeddings aus der Stellenbeschreibung mit allen Embeddings aus dem Lebenslauf verglichen wird. Der Mittelwert dieser Matrix ergibt die Ähnlichkeitsbewertung oder das Ranking des Lebenslaufs. Mit allen Bewertungen erstellen wir eine Tabelle, in der alle Lebensläufe von der höchsten bis zur niedrigsten Bewertung auf der Grundlage ihrer Ähnlichkeit mit der Stellenbeschreibung aufgeführt sind. Die Kosinus-Ähnlichkeit kann mit SK-Learn berechnet werden:

from sklearn.metrics.pairwise import cosine_similarity
def get_resume_score(resume_embeddings):
  similarity_matrix = cosine_similarity(job_embeddings, resume_embeddings)
  return np.mean(similarity_matrix)

Wir haben herausgefunden, dass für diese spezielle Aufgabe der Matching-Prozess weiter verbessert werden kann, indem Entitäten in der Stellenbeschreibung gefunden werden. In diesem Fall können Entitäten wichtige Informationen wie Fähigkeiten, Jobtitel, Qualifikationen und andere relevante Schlüsselwörter für den Job darstellen. Diese Aufgabe wird als Named Entity Recognition (NER) bezeichnet. Für diese Aufgabe haben wir eine Version von BERT und Llama verwendet, die auf die Extraktion von Entitäten abgestimmt ist. Entitäten führen zu präziseren und relevanteren Embeddings, die die Kernanforderungen der Stelle erfassen, was zu einem genaueren Abgleich mit Lebensläufen führt, die ähnliche Entitäten enthalten. Auf diese Weise können auch Lebensläufe herausgefiltert werden, die nicht den Schlüsselkriterien entsprechen, was den Auswahlprozess effizienter gestaltet. Wir haben diese Erweiterung optional in den Abgleichprozess aufgenommen. Diese optionale Funktion kann zur Erhöhung der Abgleichgenauigkeit beitragen, abhängig von den spezifizierten Kriterien der jeweiligen Stelle.

Um die Lebensläufe, die diese Schlüsselwörter enthalten besser zu bewerten, haben wir die Embeddings gewichtet. Die Embeddings, die aus den extrahierten Entitäten abgeleitet wurden, haben ein höheres Gewicht als die allgemeinen Embeddings, die aus dem Rest des Lebenslaufs abgeleitet wurden.

weights = {
  'skills': 0.4,
  'key_skills': 0.6
  }
embeddings = resume_embeddings * weights['skills']
key_embeddings = key_resume_embeddings * .weights['key_skills']

Für diese Lösung haben wir kein Modell trainiert oder fine-getuned, da wir keinen Zugang zu Daten außerhalb unserer eigenen oder öffentlich zugänglichen Datensätze mit von KI generierten oder synthetischen Daten haben. Wir haben Text aus diesen Datensätzen extrahiert, um Embeddings zu generieren und Vergleiche durchzuführen. Wir sind uns im Unklaren über die rechlichte Aspekte, falls eine Maschine eine Vorauswahl des besten Kandidaten für eine Stelle trifft. Bedenke, dieses Projekt ist ein Experiment. Alle Pakete und Lizenzen, die wir verwendet haben, sind Open-Source oder stehen unter speziellen Lizenzen, die eine freie Nutzung unter bestimmten Bedingungen erlauben. Llama Modelle haben hingegen Lizenzbeschränkungen. Außerdem ist dies keine Rechtsberatung, sondern es ist ein Lab Projekt, das wir bei Innoprox entwickelt haben, um zu verstehen, wann solch eine Lösung innerhalb eines Unternehmes praktikabel genutzt werden kann.

Unsere Schlussfolgerungen und Erkenntnisse aus diesem Lab Projekt bei Innoprox

Wie erwartet hat die Wahl des LLM einen Einfluss auf die Genauigkeit und den Matching-Prozess. Llama zum Beispiel ist ein mächtigeres Modell, das in mannigfaltigen Datensätzen trainiert wurde und daher 7Mrd bis 70Mrd Parameter hat, im Vergleich zu BERT, das nur 110M hat. Modelle wie Llama sind zwar rechenintensiv, haben aber ein besseres Verständnis von Sprache, was zu besseren kontextuellen Embeddings führt, die für Aufgaben, die ein tiefes Verständnis von Text oder in diesem Fall von Lebensläufen erfordern, entscheidend sind. Eine klare Einschränkung von BERT ist die maximale Grenze von 512 Tokens, die bei der Verarbeitung langer Texte wie mehrseitigen Lebensläufen oder Stellenbeschreibungen ein Problem darstellen kann. Dies erfordert eine Aufteilung des Textes in einzelne Abschnitte und führt dazu, dass die Lösung an semantischem Verständnis verliert. Modelle wie Llama haben diese Einschränkung nicht und können längere Dokumente verarbeiten, um weitreichende Abhängigkeiten zu erfassen. Dennoch haben wir mit BERT akzeptable Ergebnisse erzielt. In einem Datensatz von 100 Lebensläufen war das Modell in der Lage, die besten Kandidaten korrekt zu identifizieren. Um zukünftig bessere Ergebnisse zu erzielen, könnte ein fine-getuned Modell an einem spezifischen Datensatz von Lebensläufen und Stellenbeschreibungen vorgenommen werden.Wie erwartet hat die Wahl des LLM einen Einfluss auf die Genauigkeit und den Matching-Prozess. Llama zum Beispiel ist ein mächtigeres Modell, das in mannigfaltigen Datensätzen trainiert wurde und daher 7Mrd bis 70Mrd Parameter hat, im Vergleich zu BERT, das nur 110M hat. Modelle wie Llama sind zwar rechenintensiv, haben aber ein besseres Verständnis von Sprache, was zu besseren kontextuellen Embeddings führt, die für Aufgaben, die ein tiefes Verständnis von Text oder in diesem Fall von Lebensläufen erfordern, entscheidend sind. Eine klare Einschränkung von BERT ist die maximale Grenze von 512 Tokens, die bei der Verarbeitung langer Texte wie mehrseitigen Lebensläufen oder Stellenbeschreibungen ein Problem darstellen kann. Dies erfordert eine Aufteilung des Textes in einzelne Abschnitte und führt dazu, dass die Lösung an semantischem Verständnis verliert. Modelle wie Llama haben diese Einschränkung nicht und können längere Dokumente verarbeiten, um weitreichende Abhängigkeiten zu erfassen. Dennoch haben wir mit BERT akzeptable Ergebnisse erzielt. In einem Datensatz von 100 Lebensläufen war das Modell in der Lage, die besten Kandidaten korrekt zu identifizieren. Um zukünftig bessere Ergebnisse zu erzielen, könnte ein fine-getuned Modell an einem spezifischen Datensatz von Lebensläufen und Stellenbeschreibungen vorgenommen werden.

Table of Contents