본문 바로가기
프로그램/SKT FLY AI

SKT FLY AI : 31일차 - 챗봇

by hsloth 2023. 8. 7.

참고 : https://cafe.naver.com/aiclubcafe
의 생성AI 스터디

OpenAI


Playground에서 자신의 credit이 있는지 확인

키발급

코드 작성

# pip install openai

import os
import openai

openai.api_key = "키값"

completion = openai.ChatCompletion.create(
    model = "gpt-3.5-turbo",
    messages = [
        {"role": "user", "content": "Hello."}
    ]
)

print(completion.choices[0].message.content)

Gradio

# pip install gradio
import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

demo.launch()   

## 변환
# pip install gradio
import gradio as gr
import openai

openai.api_key = "키값"


def greet(content):
    completion = openai.ChatCompletion.create(
        model = "gpt-3.5-turbo",
        messages = [
            {"role": "user", "content": content}
        ]
    )
    return completion.choices[0].message.content

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

demo.launch()   

심리 상담


import gradio as gr
import random
import time

with gr.Blocks() as demo:
    chatbot = gr.Chatbot()
    msg = gr.Textbox()
    clear = gr.Button("Clear")

    def respond(message, chat_history):
        bot_message = random.choice(["How are you?", "I love you", "I'm very hungry"])
        chat_history.append((message, bot_message))
        time.sleep(1)
        return "", chat_history

    msg.submit(respond, [msg, chatbot], [msg, chatbot])
    clear.click(lambda: None, None, chatbot, queue=False)

if __name__ == "__main__":
    demo.launch()

형태소 분석기

!pip install konlpy

### Kkma 형태소 분석기
from konlpy.tag import Kkma

kkma = Kkma()
text = "아버지가 방에 들어갑니다."

morphs = kkma.morphs(text)
print(morphs)

pos = kkma.pos(text)
print(pos)

nouns = kkma.nouns(text)
print(nouns)

text = "오늘 날씨는 어때요? 내일은 덥다던데."
s = kkma.sentences(text)
print(s)

### Komoran 형태소 분석기

from konlpy.tag import Komoran

Komoran = Komoran()
text = "아버지가 방에 들어갑니다."

morphs = Komoran.morphs(text)
print(morphs)

pos = Komoran.pos(text)
print(pos)

nouns = Komoran.nouns(text)
print(nouns)

### Okt 형태소 분석기

from konlpy.tag import Okt

Okt = Okt()

text = "방에 아버지가 들어갑니다."

morphs = Okt.morphs(text)
print(morphs)

pos = Okt.pos(text)
print(pos)

nouns = Okt.nouns(text)
print(nouns)

text = "오늘 날씨가 좋아욬ㅋㅋ"
print(Okt.normalize(text))
print(Okt.phrases(text))

### 사용자 사전 구축

from konlpy.tag import Komoran

Komoran = Komoran()
text = "우리 챗봇은 엔엘피를 좋아해"

pos = Komoran.pos(text)
print(pos)
from konlpy.tag import Komoran

Komoran = Komoran(userdic='./user_dic.tsv')
text = "우리 챗봇은 엔엘피를 좋아해"

pos = Komoran.pos(text)
print(pos)

임베딩


  • 자연어를 숫자나 벡터 형태로 변환하는 과정
  • 문장 임베딩 : 문장 전체를 벡터로 표현하는 방법. 전체 문장의 흐름을 파악해 벡터로 변환하기 때문에 문맥적 의미를 지닌다.
  • 단어 임베딩 : 개별 단어를 벡터로 표현하는 방법. 처리가 빠르고 간단해서 실무에서 많이 사용되지만, 단어의 형태가 같다면 동일한 벡터값으로 표현되는 단점이 있다.

원-핫 인코딩

!pip install konlpy

from konlpy.tag import Komoran

Komoran = Komoran()
text = "오늘 날씨는 구름이 많아요."

nouns = Komoran.nouns(text)
print(nouns)

dics = {}
for word in nouns:
  if word not in dics.keys():
    dics[word] = len(dics)
print(dics)

import numpy as np
nb_classes = len(dics)
targets = list(dics.values())
one_hot_targets = np.eye(nb_classes)[targets]
print(one_hot_targets)

Word2Vec 단어임베딩


from gensim.models import Word2Vec
from konlpy.tag import Komoran

def read_review_data(filename):
  with open(filename, 'r') as f:
    data = [line.split('\t') for line in f.read().splitlines()]
    data = data[1:]
  return data

review_data = read_review_data('./ratings.txt')
print(len(review_data))

# 형태소에서 명사만 추출
komoran = Komoran()
docs = [komoran.nouns(sentence[1]) for sentence in review_data]

print(docs[1])

# Word2Vec 모델 학습
model = Word2Vec(sentences=docs, vector_size=200, window=4, min_count=2, sg=1)

model.save('nvmc.model')

# 말뭉치 개수
model.corpus_count

# 단어 개수(겹치는 것들 제거 한 개수인듯)
model.corpus_total_words

# 모델을 불러올 경우
model = Word2Vec.load('./nvmc.model')

# 두 단어 사이의 관련성
model.wv.similarity(w1='일요일', w2='월요일')

# 단어와 가장 관련성이 높은 단어 top5개 추출
model.wv.most_similar("안성기", topn=5)