매일 업데이트
2023-10-07 01:40 8 min

대규모 언어 모델의 텍스트 분석을 위해 Scikit-LLM을 사용하는 방법

Scikit-LLM은 대형 언어 모델(LLM)을 scikit-learn 프레임워크에 통합하여 텍스트 분석 작업을 간편하게 수행할 수 있도록 돕는 파이썬 라이브러리입니다. scikit-learn에 익숙한 사용자라면 Scikit-LLM을 더 쉽게 활용할 수 있습니다.

Scikit-LLM은 scikit-learn의 대체재가 아니라, 텍스트 분석에 특화된 도구라는 점을 기억해야 합니다. scikit-learn은 범용적인 머신러닝 라이브러리인 반면, Scikit-LLM은 텍스트 데이터를 다루는 데 초점을 맞추고 있습니다.

Scikit-LLM 시작하기

Scikit-LLM을 사용하려면 먼저 해당 라이브러리를 설치하고 API 키를 설정해야 합니다. 먼저 IDE에서 새로운 가상 환경을 만들고, 터미널에서 다음 명령어를 실행하여 라이브러리를 설치합니다.

pip install scikit-llm

이 명령은 Scikit-LLM과 필요한 종속성을 함께 설치합니다.

API 키를 구성하려면, LLM 제공업체에서 API 키를 받아야 합니다. OpenAI API 키를 얻는 방법은 다음과 같습니다.

OpenAI API 페이지로 이동하여 오른쪽 상단에 있는 프로필을 클릭한 다음, "API 키 보기"를 선택합니다. 이렇게 하면 API 키 관리 페이지로 이동합니다.

API 키 페이지에서 "새 비밀 키 생성" 버튼을 클릭합니다.

API 키 이름을 지정하고 "비밀 키 생성" 버튼을 클릭하여 키를 생성합니다. 생성된 키는 다시 표시되지 않으므로 반드시 복사하여 안전한 곳에 보관해야 합니다. 분실 시에는 새로 생성해야 합니다.

이제 API 키가 준비되었으므로, IDE에서 Scikit-LLM 라이브러리의 SKLLMConfig 클래스를 가져옵니다. 이 클래스를 사용하여 대형 언어 모델 관련 구성 옵션을 설정할 수 있습니다.

from skllm.config import SKLLMConfig

이 클래스를 통해 OpenAI API 키와 조직 ID를 설정해야 합니다.

SKLLMConfig.set_openai_key("Your API key")
SKLLMConfig.set_openai_org("Your organization ID")

조직 ID는 조직 이름과 다르며, 조직의 고유 식별자입니다. 조직 ID를 확인하려면 OpenAI 조직 설정 페이지로 이동하여 복사하세요. 이제 Scikit-LLM과 대형 언어 모델 간의 연결이 설정되었습니다.

Scikit-LLM 사용에는 유료 플랜이 필요합니다. 이는 OpenAI 무료 평가판 계정의 요청 속도 제한(분당 3개)이 Scikit-LLM 사용에 충분하지 않기 때문입니다.

무료 평가판 계정을 사용하면 텍스트 분석 중 다음과 유사한 오류가 발생할 수 있습니다.

자세한 내용은 OpenAI 비율 제한 페이지를 참조하십시오.

LLM 제공업체는 OpenAI에만 국한되지 않으며, 다양한 다른 LLM 제공업체를 이용할 수 있습니다.

필수 라이브러리 가져오기 및 데이터 세트 로드

데이터 세트 로딩에 사용될 pandas 라이브러리와 Scikit-LLM 및 scikit-learn에서 필요한 클래스를 가져옵니다.

import pandas as pd
from skllm import ZeroShotGPTClassifier, MultiLabelZeroShotGPTClassifier
from skllm.preprocessing import GPTSummarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import MultiLabelBinarizer

다음으로 텍스트 분석을 수행할 데이터 세트를 로드합니다. 이 예제에서는 IMDB 영화 데이터 세트를 사용하지만, 사용자 고유의 데이터 세트를 사용할 수도 있습니다.

data = pd.read_csv("imdb_movies_dataset.csv")
data = data.head(100)

데이터 세트의 처음 100개 행만 사용할 필요는 없습니다. 전체 데이터 세트를 사용할 수도 있습니다.

이제, 특징(feature)과 레이블(label) 열을 추출하고 데이터 세트를 학습 세트와 테스트 세트로 나눕니다.

X = data['Description']
y = data['Genre']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

"Genre" 열은 예측하고자 하는 레이블을 포함합니다.

Scikit-LLM을 이용한 제로샷 텍스트 분류

제로샷 텍스트 분류는 대형 언어 모델에서 제공되는 기능으로, 명시적인 학습 데이터 없이 텍스트를 미리 정의된 범주로 분류합니다. 이는 모델 학습 중에 예상하지 못한 카테고리의 텍스트를 분류해야 하는 작업에 유용합니다.

Scikit-LLM으로 제로샷 텍스트 분류를 수행하려면 ZeroShotGPTClassifier 클래스를 사용합니다.

zero_shot_clf = ZeroShotGPTClassifier(openai_model="gpt-3.5-turbo")
zero_shot_clf.fit(X_train, y_train)
zero_shot_predictions = zero_shot_clf.predict(X_test)

print("Zero-Shot Text Classification Report:")
print(classification_report(y_test, zero_shot_predictions))

출력 결과는 다음과 같습니다.

분류 보고서는 모델이 예측하려는 각 레이블에 대한 평가 지표를 제공합니다.

Scikit-LLM을 이용한 다중 레이블 제로샷 텍스트 분류

경우에 따라 하나의 텍스트가 동시에 여러 범주에 속할 수 있습니다. 기존 분류 모델은 이러한 경우에 어려움을 겪지만, Scikit-LLM은 이러한 다중 레이블 분류를 지원합니다. 다중 레이블 제로샷 텍스트 분류는 하나의 텍스트에 여러 설명 레이블을 할당하는 데 중요합니다.

MultiLabelZeroShotGPTClassifier를 사용하여 각 텍스트에 적합한 레이블을 예측해 보세요.

candidate_labels = ["Action", "Comedy", "Drama", "Horror", "Sci-Fi"]
multi_label_zero_shot_clf = MultiLabelZeroShotGPTClassifier(max_labels=2)
multi_label_zero_shot_clf.fit(X_train, candidate_labels)
multi_label_zero_shot_predictions = multi_label_zero_shot_clf.predict(X_test)

mlb = MultiLabelBinarizer()
y_test_binary = mlb.fit_transform(y_test)
multi_label_zero_shot_predictions_binary = mlb.transform(multi_label_zero_shot_predictions)

print("Multi-Label Zero-Shot Text Classification Report:")
print(classification_report(y_test_binary, multi_label_zero_shot_predictions_binary))

위의 코드에서는 텍스트가 속할 수 있는 후보 레이블을 정의합니다.

출력은 다음과 같습니다.

이 보고서를 통해 다중 레이블 분류에서 모델이 각 레이블에 대해 얼마나 잘 수행하는지 파악할 수 있습니다.

Scikit-LLM을 이용한 텍스트 벡터화

텍스트 벡터화는 텍스트 데이터를 머신러닝 모델이 이해할 수 있는 숫자 형식으로 변환하는 과정입니다. Scikit-LLM은 이를 위해 GPTVectorizer를 제공합니다. GPT 모델을 사용하여 텍스트를 고정 차원의 벡터로 변환할 수 있습니다.

TF-IDF (Term Frequency-Inverse Document Frequency)를 사용하여 이 과정을 수행할 수 있습니다.

tfidf_vectorizer = TfidfVectorizer(max_features=1000)
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)
X_test_tfidf = tfidf_vectorizer.transform(X_test)

print("TF-IDF Vectorized Features (First 5 samples):")
print(X_train_tfidf[:5])

출력은 다음과 같습니다.

출력 결과는 데이터 세트의 처음 5개 샘플에 대한 TF-IDF 벡터화된 특징을 나타냅니다.

Scikit-LLM을 이용한 텍스트 요약

텍스트 요약은 핵심 정보를 유지하면서 텍스트를 압축하는 데 사용됩니다. Scikit-LLM은 GPT 모델을 사용하여 간결한 텍스트 요약을 생성하는 GPTSummarizer를 제공합니다.

summarizer = GPTSummarizer(openai_model="gpt-3.5-turbo", max_words=15)
summaries = summarizer.fit_transform(X_test)
print(summaries)

출력은 다음과 같습니다.

위의 내용은 테스트 데이터를 요약한 결과입니다.

LLM 기반 애플리케이션 구축

Scikit-LLM은 대형 언어 모델을 통해 텍스트 분석의 새로운 가능성을 열어줍니다. 대형 언어 모델의 작동 원리를 이해하는 것은 매우 중요합니다. 이러한 최첨단 기술의 강점과 약점을 파악하는 것은 효율적인 애플리케이션을 구축하는 데 도움이 될 것입니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.