spaCy 또는 NLTK를 기반으로 사전 학습된 엔티티 추출 모델은 훌륭한 결과를 제공하지만 직책, 부가가치세 번호, 약물 등과 같은 네이티브가 아닌 엔티티를 감지하려면 지루한 주석 및 학습 과정이 필요합니다. 이제 GPT-3, GPT-J, GPT-NeoX와 같은 대규모 언어 모델 덕분에 주석이나 훈련 없이도 단발성 학습으로 모든 유형의 엔티티를 추출할 수 있습니다. 이 글에서는 그 방법을 보여드리겠습니다.
NER(엔티티 추출)은 기본적으로 비정형 텍스트에서 정형화된 정보를 추출하는 것입니다. NER을 처음 접하는 경우 먼저 간단한 소개를 읽어보시기 바랍니다: NER 소개.
스파시는 지난 몇 년 동안 NER의 사실상 표준이 되었습니다. (스파시 웹사이트 보기). SpaCy는 사용하기 쉽고 속도가 빨라 프로덕션에 사용하기에 적합하기 때문에 매우 매력적인 프레임워크입니다.
스파시는 여러 언어로 사전 학습된 다양한 모델을 제안하는 파이썬 자연어 처리 프레임워크로, 직접 모델을 학습시키지 않고도 여러 엔티티 유형(회사, 도시, 주소, 날짜 등)을 자국어로 쉽게 추출할 수 있습니다.
NLTK는 Python으로 엔티티를 추출하는 데에도 흥미로운 선택이지만 기본적으로 더 적은 엔티티를 제안하며 일반적으로 프로덕션에는 권장되지 않습니다(교육 및 연구용 프레임워크에 더 가깝습니다).
그러나 이러한 프레임워크는 기본적으로 지원되는 엔티티의 수가 제한되어 있다는 한계에 금방 부딪히게 됩니다. 대부분의 기업은 개인 정보, 재무 데이터, 의료 데이터 등과 같은 특정 비즈니스 정보를 추출하기 위해 NER을 활용하고자 합니다. 물론 이러한 엔티티는 기본적으로 spaCy 사전 학습된 모델에서 지원되지 않으므로, 이를 위해서는 자체 데이터 세트를 생성하고 이를 통해 자체 모델을 학습시켜야 합니다.
스파시 모델을 학습시키려면 한 명 또는 여러 명이 협업하여 방대한 양의 좋은 예제를 만들고 주석을 달아야 하므로 길고 지루한 주석 작업이 필요합니다. 모델이 제대로 학습하려면 매우 많은 양의 예제가 필요합니다. 스파시(spaCy)의 Prodigy와 같은 좋은 주석 도구가 존재하지만, 여전히 많은 NLP 프로젝트가 중단되는 원인이 되는 고통스러운 작업으로 남아 있습니다.
주석 그림
좋은 소식: GPT-3, GPT-J, GPT-NeoX와 같은 대규모 언어 모델이 등장하면서 이제 새로운 모델에 주석을 달거나 학습시키지 않고도 모든 엔티티를 추출할 수 있게 되었습니다!
텍스트 생성을 위한 대규모 언어 모델은 최근 GPT-3를 통해 등장하기 시작했습니다. (OpenAI 웹사이트에서 GPT-3에 대해 자세히 알아보기). OpenAI가 1,750억 개의 파라미터로 구성된 GPT-3 모델을 출시했을 때, 추가 학습 없이도 자연어 처리를 기반으로 하는 수많은 최첨단 AI 애플리케이션의 길을 열었기 때문에 이는 혁명적인 일이었습니다.
GPT-3과 같은 GPT 모델의 초기 목표는 텍스트를 생성하는 것입니다. 모델에 입력만 하면 나머지는 자동으로 생성되도록 하는 것입니다. 텍스트 생성을 기반으로 분류, 요약, 대화형 AI, 의역은 물론 엔티티 추출 등 거의 모든 자연어 처리 사용 사례를 달성할 수 있습니다!
GPT-3는 오픈 소스 모델이 아니기 때문에 오픈 소스 커뮤니티는 GPT-3를 대체할 수 있는 대안을 연구해 왔으며, 현재 두 가지 훌륭한 오픈 소스 대안을 보유하고 있습니다: GPT-J와 GPT-NeoX입니다. 아직은 GPT-3만큼 크지는 않지만 오픈소스 커뮤니티가 OpenAI를 따라잡는 것은 시간 문제일 뿐이라는 것은 의심의 여지가 없습니다.
이러한 모델을 제대로 활용하려면 '소수 샷 학습'이라는 새로운 기술이 필요합니다.
이 대형 GPT 모델은 너무 커서 매우 빠르게 학습할 수 있습니다.
GPT-3가 간단한 제품 설명을 생성해 주기를 원한다고 가정해 보겠습니다. 다음은 숏샷 학습이 없는 예제입니다:
Generate a product description containing these specific keywords: t-shirt, men, $50
이렇게 하면 아무 소용없는 응답을 받게 됩니다. 예를 들어 다음과 같은 내용이 될 수 있습니다:
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
좋은 소식: 모델에 몇 가지 예시를 제공하는 것만으로도 훨씬 더 나은 결과를 얻을 수 있습니다!
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:
결과는 다음과 같습니다:
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.
보시다시피, 처음에 제공한 세 가지 예제 덕분에 이제 모델의 응답이 완벽하게 의도한 대로 이루어졌습니다. 하지만 이 모델은 이런 종류의 제품 설명 생성 작업에 대해 훈련된 적이 없습니다. 이것이 바로 몇 개의 예제만으로 즉석에서 '전이 학습'을 수행하는 '숏샷 학습' 기법의 핵심입니다. 이런 종류의 결과를 얻으려면 일반적으로 수많은 예제를 사용하여 자연어 처리 모델을 훈련해야 하지만 여기서는 그렇지 않습니다.
이제 소수 샷 학습을 통해 엔티티 추출을 수행합니다.
웹사이트에서 직함을 추출하고 싶다고 가정해 보겠습니다. 실제 요청을 하기 전에 몇 가지 직책 추출 예시를 제시하기만 하면 됩니다:
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:
결과는 다음과 같습니다:
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
아시다시피, 몇 개의 샷으로 구성된 예제를 만드는 방식에 신중을 기해야 합니다. 직책이 전혀 발견되지 않을 수도 있기 때문에 "없음"을 반환하는 예제를 만들었습니다(오탐을 방지합니다). 여러 직책을 동시에 추출하고 싶으신가요? 이 경우 여러 직함을 반환하는 예제(예: 쉼표로 구분된 직함)도 만드는 것이 중요합니다.
더 많은 예제를 추가하면 더 나은 결과를 얻을 수 있습니다. 그리고 예제는 가능한 한 실제 최종 요청에 가깝게 작성하는 것이 중요합니다. 예를 들어, 단순한 문장이 아닌 전체 단락을 분석할 예정이라면 단락으로 예시를 만드는 것이 가장 좋습니다.
GPT 모델에 액세스할 수 없는 경우 NLP 클라우드 API를 사용하면 됩니다. 여러 클라이언트를 사용할 수 있습니다(Python, Go, Node.js, Ruby, PHP...). 여기서는 Python 클라이언트와 함께 GPT-J를 사용하는 예제를 보여드리겠습니다:
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
)
결과는 다음과 같습니다: CTO
방금 사용한 텍스트 생성 매개변수에 대해 간단히 설명해 드리겠습니다.
GPT-J가 너무 독창적인 결과를 생성하는 것을 원하지 않기 때문에, 요청에서 본 것에 충실하기를 원하기 때문에 매우 낮은 최고 p 값을 설정했습니다.
"LENGTH_NO_INPUT"은 최대 길이 값에 입력 텍스트를 고려하지 않아야 함을 의미합니다.
"remove_input"은 결과에서 입력 텍스트를 제거해야 함을 의미합니다.
"end_sequence"는 모델이 이 문자를 만나면 텍스트 생성을 중지해야 함을 의미합니다. 몇 가지 예제에서 각 답변 끝에 "###"을 추가한 것처럼, 모델은 응답을 생성한 후 자동으로 "###"을 생성하고 거기서 멈춥니다.
"remove_end_sequence"는 응답에서 "###"을 제거한다는 의미입니다.
자세한 내용은 NLP 클라우드 설명서에서 확인할 수 있습니다: 여기를 참조하세요.
GPT 모델로 엔티티 추출을 수행하면 모델이 학습되지 않았더라도 새로운 엔티티를 즉시 추출할 수 있으므로 많은 자유를 얻을 수 있습니다!
하지만 이러한 대규모 언어 모델은 규모가 크고 상대적으로 느리다는 대가가 따릅니다.
예를 들어, GPT-J 또는 GPT-NeoX를 사용하려면 NVIDIA RTX A6000 또는 A40과 같이 많은 VRAM을 갖춘 대용량 GPU가 필요합니다. 그리고 약간의 지연 시간(엔티티를 추출하는 데 약 500ms가 소요됨)이 발생합니다. 반대로 스파시나 NLTK는 인프라 측면에서 훨씬 빠르고 비용도 적게 듭니다.
2022년에는 주석이나 교육 없이도 고급 NER을 매우 쉽게 수행할 수 있습니다! 이는 기업이 엔티티 추출 프로젝트를 더 빠르게 제공하는 데 큰 도움이 될 것이며, 자연어 처리를 기반으로 하는 더 많은 최첨단 애플리케이션을 사용할 수 있게 해줄 것입니다.
하지만 GPT-3, GPT-J, GPT-NeoX와 같은 대규모 언어 모델은 비용이 많이 들기 때문에 관련 인프라 비용을 과소평가해서는 안 됩니다.
이 글이 시간과 비용을 절약하는 데 도움이 되길 바랍니다!
François
NLP 클라우드의 풀스택 엔지니어