본문 바로가기
카테고리 없음

파이썬 질의 응답 AI 5분만에 만드는 법 ( 파이썬, Transformer Models, Bert LLM )

by 수메르 여행자 2024. 3. 14.

최종 노트북 코드

https://github.com/layla-focalors/ai-learn-notebook/blob/main/Dynamic-LLM_%EC%A7%88%EC%9D%98%EC%9D%91%EB%8B%B5.ipynb

 

전제 조건

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 ) 기반 인식으로 데이터를 처리하는 모델이며 각각의 피쳐로 정확도를 높이게 설계되었네요