최종 노트북 코드
전제 조건
1. transformer 패기지 설치 )
2. Pytorch 설치
// 깃허브의 각종 트랜스포머 및 학습 모델들은 주기적으로 업데이트 예정입니다
COLAB 에서 불러와서 실행해도 됩니당
from transformers import pipeline
qa = pipeline('question-answering')
print(qa.model)
preset = """A city of freedom that lies in the northeast of Teyvat.
From amongst mountains and wide-open plains, carefree breezes carry the scent of dandelions — a gift from the Anemo God, Barbatos — across Cider Lake to Mondstadt, which sits on an island in the middle of the lake."""
print(preset)
print(qa(question="Who is the God of Mondstadt", context = preset))
코드를 보면 바로 아시겠지만
transformer 모델 중 하나인 question-ansering 모델을 설치하고 해당 모델의 가중치/ 레이어 값을 불러온 다음
preset에 저장된 데이터 중에서 답을 찾는 모델입니다
간단히 말하면 GPT 같은 LLM 계열 중 일부라고 할 수 있죠
뭔가 이걸 수정하고 싶으시면 PRESET에 있는 부분을 수정해서 본인이 뭔하는 문서를 넣은 다음 > 사용자의 입력을 QUESTION 파라미터로 전달하고 CONTEXT에 PRESET 변수를 전달합니다
{'score': 0.583295464515686, 'start': 177, 'end': 185, 'answer': 'Barbatos'}
그러면 이런 식으로 AI가 예측한 스코어와 토큰수 그리고 정답이 나오죠
( 데이터는 원신 위키 크롤링해서 사용했습니다 - 원신 팬.. )
문제
한국어로 사용할 때는 번역 모델을 같이 붙여야 하는 문제가 하나 있습니다
content = """레일라: 새하얀 작은 집, 수메르성에서 볼 수 없는 사막 식물... 음... 어딘지 알 것 같아요.
레일라: 아루 마을이죠? 처음 아루 마을에 야외 실습 갔을 때가 생각나네요.
레일라: 시간 괜찮으면 그 때 있었던 일들을 들려줄게요. 재미있는 일들이 많았거든요
"""
print(qa(question="집은 무슨 색인가?", context = content))
자 이런 식으로 한국어로 100% 입출력을 시작하면
{'score': 0.0029071681201457977, 'start': 15, 'end': 36, 'answer': '수메르성에서 볼 수 없는 사막 식물..'}
뜬금 없는 응답이 나옵니다
물론 이것도 보완하는 방법이 하나 있는데
질문을 영어로 던지면 됩니다
보면 스코어도 매우 낮게 나오죠 ( 망했다는 뜻 )
content = """레일라: 새하얀 작은 집, 수메르성에서 볼 수 없는 사막 식물... 음... 어딘지 알 것 같아요.
레일라: 아루 마을이죠? 처음 아루 마을에 야외 실습 갔을 때가 생각나네요.
레일라: 시간 괜찮으면 그 때 있었던 일들을 들려줄게요. 재미있는 일들이 많았거든요
"""
print(qa(question="What is color of house?", context = content))
이런 식으로 영어 질문을 던져주면
{'score': 0.0027439582627266645, 'start': 0, 'end': 13, 'answer': '레일라: 새하얀 작은 집'}
예측률을 처참하지만 일단 결과가 정상적으로 돌아오는 모습을 볼 수 있습니다
이때는 번역모델 붙여주면 끝납니다 ( 동일한 트랜스포머 모델 )
모델
DistilBertForQuestionAnswering(
(distilbert): DistilBertModel(
(embeddings): Embeddings(
(word_embeddings): Embedding(28996, 768, padding_idx=0)
(position_embeddings): Embedding(512, 768)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(transformer): Transformer(
(layer): ModuleList(
(0-5): 6 x TransformerBlock(
(attention): MultiHeadSelfAttention(
(dropout): Dropout(p=0.1, inplace=False)
(q_lin): Linear(in_features=768, out_features=768, bias=True)
(k_lin): Linear(in_features=768, out_features=768, bias=True)
(v_lin): Linear(in_features=768, out_features=768, bias=True)
(out_lin): Linear(in_features=768, out_features=768, bias=True)
)
(sa_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(ffn): FFN(
(dropout): Dropout(p=0.1, inplace=False)
(lin1): Linear(in_features=768, out_features=3072, bias=True)
(lin2): Linear(in_features=3072, out_features=768, bias=True)
(activation): GELUActivation()
)
(output_layer_norm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
)
)
)
)
(qa_outputs): Linear(in_features=768, out_features=2, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
이런 식으로 모델 설명을 보면 얘가 어떤 식으로 쌓여진 모델인지 알 수 있습니다
Bert 모델 기반으로 간소화된 모델로 (layer) 아래가 레이어라고 보면 됩니다
선형 회귀 ( Linear ) 기반 인식으로 데이터를 처리하는 모델이며 각각의 피쳐로 정확도를 높이게 설계되었네요