Haben Sie Probleme mit KI oder Full-Stack-Entwicklung? Unsere Experten sind für Sie da: maßgeschneiderte Beratung, technische Integration und mehr. Erreichen Sie uns unter [email protected].

Few-shot NER: Entitätsextraktion ohne Annotation und Training auf Basis von GPT

Vorgefertigte Modelle zur Entitätsextraktion auf der Grundlage von spaCy oder NLTK liefern hervorragende Ergebnisse, erfordern jedoch einen mühsamen Annotations- und Trainingsprozess, um nicht-einheimische Entitäten wie Berufsbezeichnungen, Mehrwertsteuernummern, Medikamente usw. zu erkennen. Dank großer Sprachmodelle wie GPT-3, GPT-J und GPT-NeoX ist es nun möglich, jede Art von Entitäten dank des "few-shot"-Lernens zu extrahieren, ohne Annotation und Training. In diesem Artikel zeigen wir, wie man das macht.

Bei NER (Entity Extraction) geht es im Wesentlichen darum, strukturierte Informationen aus einem unstrukturierten Text zu extrahieren. Wenn Sie neu im Bereich NER sind, können Sie zunächst unsere kurze Einführung lesen: Einführung in NER.

NER mit SpaCy und NLTK: der traditionelle Weg

SpaCy hat sich in den letzten Jahren zum De-facto-Standard für NER entwickelt. (siehe die spaCy-Website). SpaCy ist ein sehr attraktives Framework, weil es einfach zu bedienen ist und sich durch seine Geschwindigkeit gut für den Produktionseinsatz eignet.

SpaCy ist ein Python-Framework für die Verarbeitung natürlicher Sprache, das viele vortrainierte Modelle in mehreren Sprachen anbietet, so dass es einfach ist, verschiedene Entitätstypen (Unternehmen, Städte, Adressen, Daten usw.) in Ihrer eigenen Sprache zu extrahieren, ohne ein eigenes Modell trainieren zu müssen.

NLTK ist auch eine interessante Wahl für die Entitätsextraktion mit Python, aber es schlägt standardmäßig weniger Entitäten vor, und im Allgemeinen wird NLTK nicht für die Produktion empfohlen (es ist eher ein Lehr- und Forschungsrahmenwerk).

Allerdings stößt man mit diesen Frameworks schnell an eine Grenze: Die Anzahl der von Haus aus unterstützten Entitäten ist begrenzt. Die meisten Unternehmen möchten NER nutzen, um spezifische Geschäftsinformationen zu extrahieren, wie z.B. Personendaten, Finanzdaten, medizinische Behandlungen, etc. Natürlich werden diese Entitäten nicht standardmäßig von den in SpaCy vortrainierten Modellen unterstützt. Um dies zu erreichen, müssen Sie also Ihren eigenen Datensatz erstellen und daraus Ihr eigenes Modell trainieren.

Das Training eines eigenen SpaCy-Modells ist ein langwieriger und mühsamer Annotationsprozess: Eine oder mehrere Personen müssen zusammenarbeiten, um eine große Menge guter Beispiele zu erstellen und diese zu annotieren. Damit das Modell richtig lernen kann, ist eine sehr große Menge an Beispielen erforderlich. Es gibt zwar gute Annotationswerkzeuge (wie Prodigy von spaCy), aber es bleibt eine mühsame Aufgabe, die viele NLP-Projekte zum Scheitern bringt.

Illustration einer Anmerkung

Die gute Nachricht: Mit dem Aufkommen von großen Sprachmodellen wie GPT-3, GPT-J und GPT-NeoX ist es nun möglich, beliebige Entitäten zu extrahieren, ohne ein neues Modell zu annotieren und zu trainieren!

Texterstellung mit GPT-3, GPT-J, und GPT-NeoX

Große Sprachmodelle für die Texterzeugung sind erst kürzlich mit GPT-3 aufgetaucht (mehr über GPT-3 auf der Website von OpenAI). Die Veröffentlichung des GPT-3-Modells von OpenAI, das aus 175 Milliarden Parametern besteht, war eine Revolution, denn es ebnete den Weg für viele innovative KI-Anwendungen, die auf der Verarbeitung natürlicher Sprache basieren, ohne dass ein zusätzliches Training erforderlich ist.

Das ursprüngliche Ziel von GPT-Modellen wie GPT-3 ist die Generierung von Text: Sie geben dem Modell einfach eine Eingabe und lassen es den Rest für Sie generieren. Auf der Grundlage der Textgenerierung kann so ziemlich jeder Anwendungsfall der Verarbeitung natürlicher Sprache realisiert werden: Klassifizierung, Zusammenfassung, Konversations-KI, Paraphrasierung... und natürlich Entity-Extraktion!

Da GPT-3 kein Open-Source-Modell ist, hat die Open-Source-Gemeinschaft an Alternativen zu GPT-3 gearbeitet und wir haben jetzt 2 großartige Open-Source-Entsprechungen: GPT-J und GPT-NeoX. Sie sind noch nicht so groß wie GPT-3, aber es ist zweifellos nur eine Frage der Zeit, bis die Open-Source-Gemeinschaft zu OpenAI aufschließt.

Um diese Modelle richtig nutzen zu können, ist eine neue Technik erforderlich, die als "few-shot learning" bezeichnet wird.

Few-shot Learning

Diese großen GPT-Modelle sind so groß, dass sie sehr schnell von Ihnen lernen können.

Angenommen, Sie möchten, dass GPT-3 eine kurze Produktbeschreibung für Sie erstellt. Hier ist ein Beispiel ohne "few-shot learning":

Generate a product description containing these specific keywords: t-shirt, men, $50

Die Antwort, die Sie erhalten werden, wird nutzlos sein. Sie könnte zum Beispiel so lauten:

Generate a product description containing these specific keywords: t-shirt, men, $50 and short.

The product description needs to be a few words long. Don’t use plurals, use the keywords in the order they are

Die gute Nachricht: Sie können viel bessere Ergebnisse erzielen, wenn Sie dem Modell einfach ein paar Beispiele geben!

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1499
Result:

Das Ergebnis wird in etwa so aussehen:

Generate a product description containing specific keywords.

Keywords: shoes, women, $59
Result: Beautiful shoes for women at the price of $59.
###
Keywords: trousers, men, $69
Result: Modern trousers for men, for $69 only.
###
Keywords: gloves, winter, $19
Result: Amazingly hot gloves for cold winters, at $19.
###
Keywords: gpu, gaming, $1,499
Result: The best gaming GPU on the market, at the price of $1,499 only.

Wie Sie sehen können, ist die Antwort des Modells dank der 3 Beispiele, die wir ihm zuerst gegeben haben, nun perfekt auf den Punkt. Dennoch wurde dieses Modell nie auf diese Art von Aufgabe zur Erstellung von Produktbeschreibungen trainiert. Genau darum geht es bei der "few-shot learning"-Technik: Sie führen ein "Transfer-Lernen" mit nur ein paar Beispielen durch. Um ein solches Ergebnis zu erzielen, muss man normalerweise ein Modell für die Verarbeitung natürlicher Sprache mit Tonnen von Beispielen trainieren, aber nicht hier.

Entitätsextraktion mit Few-shot Learning

Jetzt werden wir die Entitätsextraktion mit Hilfe von "few-shot learning" durchführen.

Nehmen wir an, Sie möchten Jobtitel aus Websites extrahieren. Geben Sie einfach ein paar Beispiele für die Extraktion von Berufsbezeichnungen an, bevor Sie Ihre eigentliche Anfrage stellen:

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title:

Das Ergebnis wird wie folgt aussehen:

Extract job titles from the following sentences.

Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
Job title: Linux Engineer
###
Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
Job title: none
###
Sentence: Marc Simoncini | Director | Meetic
Job title: Director
###
Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
Job title: CEO
###
Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
Job title: CTO

Wie Sie bemerkt haben, müssen wir bei der Erstellung unserer Beispiele mit wenigen Ausnahmen klug vorgehen. Es kann vorkommen, dass überhaupt keine Berufsbezeichnung gefunden wird. Deshalb haben wir ein Beispiel erstellt, das "keine" zurückgibt (so werden falsch positive Ergebnisse vermieden). Vielleicht möchten Sie mehrere Berufsbezeichnungen gleichzeitig extrahieren? In diesem Fall ist es wichtig, Beispiele zu erstellen, die ebenfalls mehrere Berufsbezeichnungen zurückgeben (z. B. durch Komma getrennte Berufsbezeichnungen).

Sie erhalten noch bessere Ergebnisse, wenn Sie noch mehr Beispiele hinzufügen. Und es ist wichtig, dass Ihre Beispiele so nah wie möglich an Ihrer eigentlichen Aufgabe sind. Wenn Sie zum Beispiel wissen, dass Sie ganze Absätze statt nur Sätze analysieren werden, ist es am besten, wenn Sie auch Beispiele mit Absätzen erstellen.

Wenn Sie keinen Zugang zu einem GPT-Modell haben, können Sie einfach die NLP Cloud API verwenden. Es sind mehrere Clients verfügbar (Python, Go, Node.js, Ruby, PHP...). Wir zeigen hier ein Beispiel mit GPT-J und dem Python-Client:

import nlpcloud

client = nlpcloud.Client("gpt-j", "your API token", gpu=True)
client.generation("""Extract job titles from the following sentences.

    Sentence: John Doe has been working for Microsoft for 20 years as a Linux Engineer.
    Job title: Linux Engineer
    ###
    Sentence: John Doe has been working for Microsoft for 20 years and he loved it.
    Job title: none
    ###
    Sentence: Marc Simoncini | Director | Meetic
    Job title: Director
    ###
    Sentence: Franck Riboud was born on 7 November 1955 in Lyon. He is the son of Antoine Riboud, who transformed the former European glassmaker BSN Group into a leading player in the food industry. He is the CEO at Danone.
    Job title: CEO
    ###
    Sentence: Damien is the CTO of Platform.sh, he was previously the CTO of Commerce Guys, a leading ecommerce provider.
    Job title:""",
top_p=0.1,
length_no_input=True,
remove_input=True,
end_sequence="###",
remove_end_sequence=True
)

Das Ergebnis wird sein: CTO

Ich möchte Ihnen kurz die Parameter für die Texterstellung erläutern, die wir gerade verwendet haben.

Wir haben einen sehr niedrigen oberen p-Wert festgelegt, weil wir nicht wollen, dass GPT-J zu originelle Ergebnisse erzeugt: Wir wollen nur, dass es sich an das hält, was es in Ihrer Anfrage gesehen hat.

"length_no_input" bedeutet, dass der maximale Längenwert den Eingabetext nicht berücksichtigen soll.

"remove_input" bedeutet, dass der Eingabetext aus dem Ergebnis entfernt werden soll.

"end_sequence" bedeutet, dass das Modell aufhören soll, Text zu erzeugen, wenn es auf dieses Zeichen trifft. Da wir in unseren Beispielen "###" am Ende jeder Antwort hinzugefügt haben, wird das Modell automatisch "###" generieren, nachdem es die Antwort erzeugt hat, und es wird dort aufhören.

"remove_end_sequence" bedeutet, dass wir "###" aus der Antwort entfernen wollen.

Weitere Einzelheiten finden Sie in der NLP Cloud-Dokumentation: sehen Sie es hier.

Überlegungen zur Leistung

Die Entitätsextraktion mit einem GPT-Modell bietet viele Freiheiten, da jede neue Entität im Handumdrehen extrahiert werden kann, selbst wenn das Modell nicht dafür trainiert wurde!

Das hat jedoch seinen Preis: Diese großen Sprachmodelle sind riesig und relativ langsam.

Wenn Sie beispielsweise GPT-J oder GPT-NeoX verwenden möchten, benötigen Sie einen großen Grafikprozessor mit viel VRAM wie eine NVIDIA RTX A6000 oder A40. Außerdem kommt es zu einer gewissen Latenz (das Extrahieren einer Entität dauert etwa 500 ms). Im Gegensatz dazu sind SpaCy oder NLTK viel schneller und weniger kostspielig, was die Infrastruktur betrifft.

Schlussfolgerung

Im Jahr 2022 wird es möglich sein, fortgeschrittene NER sehr einfach und ohne jegliche Annotation und Schulung durchzuführen! Dies wird den Unternehmen helfen, ihre Projekte zur Entitätsextraktion schneller durchzuführen, und es ermöglicht auch mehr innovative Anwendungen auf der Grundlage der Verarbeitung natürlicher Sprache.

Große Sprachmodelle wie GPT-3, GPT-J und GPT-NeoX sind jedoch kostspielig, so dass Sie die damit verbundenen Infrastrukturkosten nicht unterschätzen sollten.

Ich hoffe, dieser Artikel wird Ihnen helfen, Zeit und Geld zu sparen!

Julien Salinas
CTO bei NLP Cloud