Zmagasz się z AI lub rozwojem full-stack? Nasi eksperci są tutaj, aby Cię poprowadzić: dostosowane porady, integracja techniczna i nie tylko. Skontaktuj się z nami pod adresem [email protected].

Few-shot NER: ekstrakcja encji bez adnotacji i szkolenia na podstawie GPT

Wstępnie wytrenowane modele ekstrakcji encji oparte na spaCy lub NLTK dają świetne rezultaty, ale wymagają żmudnego procesu adnotacji i treningu, aby wykryć encje nierodzime, takie jak nazwy stanowisk, numery VAT, leki itp. Dzięki dużym modelom językowym, takim jak GPT-3, GPT-J i GPT-NeoX, możliwe jest obecnie wyodrębnienie dowolnego typu encji dzięki uczeniu w kilku ujęciach, bez konieczności dokonywania adnotacji i treningu. W tym artykule pokażemy, jak to zrobić.

NER (ekstrakcja encji) polega na wyodrębnianiu informacji strukturalnych z tekstu niestrukturalnego. Jeśli jesteś początkującym użytkownikiem NER, możesz najpierw przeczytać nasze krótkie wprowadzenie: wprowadzenie do NER.

NER z wykorzystaniem spaCy i NLTK: sposób tradycyjny

W ostatnich latach SpaCy stało się de facto standardem dla NER. (zobacz stronę internetową spaCy). SpaCy to bardzo atrakcyjny framework, ponieważ jest łatwy w użyciu, a jego szybkość sprawia, że dobrze nadaje się do zastosowań produkcyjnych.

SpaCy to framework do przetwarzania języka naturalnego w Pythonie, który proponuje wiele wstępnie wytrenowanych modeli w wielu językach, dzięki czemu można łatwo wyodrębnić kilka typów encji (firmy, miasta, adresy, daty itp.) we własnym języku bez konieczności trenowania własnego modelu.

NLTK jest również interesującym wyborem do ekstrakcji encji z Pythona, ale domyślnie proponuje mniej encji i generalnie NLTK nie jest zalecany do produkcji (jest to raczej narzędzie edukacyjne i badawcze).

Jednak w przypadku tych frameworków szybko natrafia się na pewne ograniczenie: liczba natywnie obsługiwanych encji jest ograniczona. Większość firm chce wykorzystać NER w celu wydobycia specyficznych informacji biznesowych, takich jak informacje o osobach, dane finansowe, zabiegi medyczne itp. Oczywiście, te encje nie są domyślnie obsługiwane przez wstępnie wytrenowane modele SpaCy, więc aby to osiągnąć, trzeba stworzyć własny zbiór danych i wytrenować na jego podstawie własny model.

Szkolenie własnego modelu spaCy to długi i żmudny proces anotacji: jedna lub kilka osób musi współpracować, aby stworzyć ogromny zbiór dobrych przykładów i opatrzyć je przypisami. Aby model mógł się prawidłowo uczyć, potrzebna jest bardzo duża liczba przykładów. Istnieją dobre narzędzia do anotacji (takie jak Prodigy firmy spaCy), ale nadal jest to bolesne zadanie, które sprawia, że wiele projektów NLP zostaje przerwanych.

Ilustracja z adnotacjami

Dobra wiadomość: wraz ze wzrostem popularności dużych modeli językowych, takich jak GPT-3, GPT-J i GPT-NeoX, możliwe jest teraz wyodrębnianie dowolnych encji bez konieczności tworzenia anotacji i trenowania nowego modelu!

Generowanie tekstu za pomocą GPT-3, GPT-J i GPT-NeoX

Duże modele językowe do generowania tekstów zaczęły pojawiać się ostatnio wraz z GPT-3 (zobacz więcej o GPT-3 na stronie OpenAI). Kiedy OpenAI udostępniło model GPT-3, składający się ze 175 miliardów parametrów, była to rewolucja, ponieważ utorowało to drogę wielu nowatorskim aplikacjom sztucznej inteligencji opartym na przetwarzaniu języka naturalnego bez konieczności dodatkowego szkolenia.

Pierwotnym celem modeli GPT, takich jak GPT-3, jest generowanie tekstu: wystarczy podać dane wejściowe do modelu i pozwolić mu wygenerować resztę za Ciebie. Na podstawie generowania tekstu można osiągnąć prawie każdy przypadek użycia przetwarzania języka naturalnego: klasyfikację, streszczanie, konwersacyjną sztuczną inteligencję, parafrazowanie... i oczywiście ekstrakcję encji!

Ponieważ GPT-3 nie jest modelem open-source, społeczność open-source pracowała nad alternatywami dla GPT-3 i obecnie mamy dwa świetne odpowiedniki open-source: GPT-J i GPT-NeoX. Nie są one jeszcze tak duże jak GPT-3, ale nie ma wątpliwości, że to tylko kwestia czasu, zanim społeczność open-source dogoni OpenAI.

Właściwe wykorzystanie tych modeli wymaga zastosowania nowej techniki, zwanej "uczeniem się w kilku ujęciach".

Uczenie się z kilkoma ujęciami

Te duże modele GPT są tak duże, że bardzo szybko mogą się od Ciebie uczyć.

Załóżmy, że chcesz, aby GPT-3 wygenerował dla Ciebie krótki opis produktu. Oto przykład bez nauki kilku ujęć:

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

Odpowiedź, którą otrzymasz, będzie bezużyteczna. Może to być na przykład coś takiego:

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

Dobra wiadomość: można osiągnąć znacznie lepsze wyniki, podając modelowi kilka przykładów!

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:

Wynik będzie wyglądał mniej więcej tak:

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.

Jak widać, dzięki trzem przykładom, które podaliśmy na początku, odpowiedź modelu jest idealnie dopasowana do celu. Jednak model ten nigdy nie był szkolony do tego rodzaju zadań związanych z generowaniem opisów produktów. Na tym właśnie polega technika "few-shot learning": przeprowadzasz "transfer learning" w locie, korzystając tylko z kilku przykładów. Aby osiągnąć taki rezultat, zwykle trzeba wytrenować model przetwarzania języka naturalnego na tonach przykładów, ale nie w tym przypadku.

Wyodrębnianie encji za pomocą uczenia w kilku ujęciach

Teraz zajmiemy się ekstrakcją encji dzięki uczeniu w kilku ujęciach.

Załóżmy, że chcesz wyodrębnić nazwy stanowisk z witryn internetowych. Wystarczy podać kilka przykładów wyodrębniania tytułów stanowisk przed zgłoszeniem konkretnego żądania:

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:

W rezultacie otrzymamy następujące wyniki:

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

Jak zauważyłeś, musimy być sprytni w tworzeniu naszych kilkustrzałowych przykładów. Może się zdarzyć, że w ogóle nie zostanie znaleziona żadna nazwa stanowiska, dlatego stworzyliśmy przykład zwracający "brak" (pozwala to uniknąć fałszywych pozytywów). Może chcesz wyodrębnić kilka nazw stanowisk jednocześnie? W takim przypadku ważne jest, aby utworzyć przykłady zwracające również kilka nazw stanowisk (na przykład rozdzielonych przecinkami).

Jeszcze lepsze wyniki można uzyskać, dodając jeszcze więcej przykładów. Ważne jest, aby przykłady były jak najbardziej zbliżone do ostatecznego wniosku. Na przykład, jeśli wiesz, że będziesz analizować całe akapity, a nie tylko zdania, najlepiej jest stworzyć przykłady również z akapitami.

Jeśli nie masz dostępu do modelu GPT, możesz po prostu skorzystać z API NLP Cloud. Dostępnych jest kilka klientów (Python, Go, Node.js, Ruby, PHP...). Pokażemy tu przykład użycia GPT-J z klientem Pythona:

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
)

Wynik będzie następujący: CTO

Pozwolę sobie krótko wyjaśnić parametry generowania tekstu, których właśnie użyliśmy.

Ustawiliśmy bardzo niską górną wartość p, ponieważ nie chcemy, aby GPT-J tworzył zbyt oryginalne wyniki: chcemy, aby trzymał się tego, co widział w żądaniu użytkownika.

"length_no_input" oznacza, że maksymalna wartość długości nie powinna uwzględniać tekstu wejściowego.

"remove_input" oznacza, że tekst wejściowy powinien zostać usunięty z wyniku.

"end_sequence" oznacza, że gdy model napotka ten znak, powinien przestać generować tekst. Ponieważ w naszym kilkuzdjęciowym przykładzie dodaliśmy "###" na końcu każdej odpowiedzi, model automatycznie wygeneruje "###" po wygenerowaniu odpowiedzi i na tym poprzestanie.

Polecenie "remove_end_sequence" oznacza, że chcemy usunąć "###" z odpowiedzi.

Więcej szczegółów można znaleźć w dokumentacji chmury NLP: zobacz tutaj.

Uwagi dotyczące wydajności

Wykonywanie ekstrakcji encji za pomocą modelu GPT daje dużą swobodę, ponieważ każdą nową encję można wyodrębnić w locie, nawet jeśli model nie był do tego szkolony!

Wiąże się to jednak z kosztami: te duże modele językowe są ogromne i stosunkowo powolne.

Na przykład, jeśli chcesz użyć GPT-J lub GPT-NeoX, będzie to wymagało ogromnego procesora graficznego z dużą ilością pamięci VRAM, takiego jak NVIDIA RTX A6000 lub A40. Do tego dochodzą pewne opóźnienia (wyodrębnienie encji zajmuje około 500 ms). Z drugiej strony, spaCy lub NLTK będą znacznie szybsze i mniej kosztowne z punktu widzenia infrastruktury.

Wniosek

W 2022 r. możliwe będzie wykonywanie zaawansowanego NER w bardzo prosty sposób, bez żadnych adnotacji i szkoleń! To znacznie ułatwi firmom szybszą realizację projektów ekstrakcji encji, a także pozwoli na tworzenie bardziej nowatorskich aplikacji opartych na przetwarzaniu języka naturalnego.

Duże modele językowe, takie jak GPT-3, GPT-J i GPT-NeoX, są jednak kosztowne, dlatego nie należy lekceważyć kosztów związanych z infrastrukturą.

Mam nadzieję, że ten artykuł pomoże Ci zaoszczędzić czas i pieniądze!

Julien Salinas
CTO w NLP Cloud