🔥알림🔥
① 테디노트 유튜브 - 구경하러 가기!
② LangChain 한국어 튜토리얼 바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs) 바로가기 🙌

2 분 소요

이번 포스팅에서는 openai 사의 ChatGPT 기능을 파이썬(python) 모듈을 활용하여 챗봇 을 구현하는 방법에 대하여 알아보겠습니다.

먼저, openai 의 API KEY 를 발급 받아야 합니다. 발급은 다음의 절차를 통해 진행할 수 있습니다.

API KEY 발급

https://platform.openai.com/account/api-keys 로 접속합니다.

Log in 버튼을 클릭 후 계정에 로그인 합니다. 계정이 아직 생성되지 않은 경우에는 Sign up 으로 회원가입 후 로그인 합니다.

chatgpt-01

“Create new secret key” 버튼을 클릭하여 새로운 키를 발급합니다.

create new secret key

Name 에는 발급하는 키에 대한 별칭을 입력합니다.

테스트키 발급

새롭게 발급한 키를 복사합니다. 잃어버리면 다시 발급하여야 하므로, 안전한 곳에 저장해 둡니다.

발급한 키 복사

openai 모듈 설치

Jupyter Notebook을 열고 pip 명령어로 모듈을 설치 합니다. 아나콘다 가상환경에서 설치해도 좋습니다.

# openai 파이썬 패키지 설치
!pip install openai

코드

먼저, 설치한 openai 모듈을 import 한 뒤, 발급받은 API KEY를 다음과 같이 설정합니다.

# 모듈 import
import openai

# API_KEY 입력: 이전 단계에서 복사한 키를 입력합니다.
openai.api_key = 'sk-NBBNkEQ11YFFxMP35IkdT3BdsjiofjdsiodgjGSJ'

아래 코드는 openai 에서 공개한 Chat 기능을 클래스로 구현하였습니다. 보다 편리하게 Chat 기능을 활용할 수 있습니다.

class ChatBot():
    def __init__(self, model='gpt-3.5-turbo'):
        self.model = model
        self.messages = []
        
    def ask(self, question):
        self.messages.append({
            'role': 'user', 
            'content': question
        })
        res = self.__ask__()
        return res
        
    def __ask__(self):
        completion = openai.ChatCompletion.create(
            # model 지정
            model=self.model,
            messages=self.messages
        )
        response = completion.choices[0].message['content']
        self.messages.append({
            'role': 'assistant', 
            'content': response
        })
        return response
    
    def show_messages(self):
        return self.messages
    
    def clear(self):
        self.messages.clear()

활용 예시는 다음과 같습니다.

먼저, ChatBot 클래스 인스턴스 생성시 model 파라미터에 아래 명시한 모델의 종류를 입력하여 지정할 수 있습니다.

# model 파라미터에 다음의 모델 중 하나를 선택
#  'gpt-3.5-turbo',
#  'gpt-3.5-turbo-0301',
#  'gpt-4',
#  'gpt-4-0314'

# 인스턴스를 생성합니다.
chatbot = ChatBot(model='gpt-3.5-turbo')

생성한 chatbotask() 함수로 질의할 수 있습니다.

# 첫 번째 질문
print(chatbot.ask('양자역학에 대하여 알려줘.'))
양자역학은 물리학의 한 분야로서, 미시세계에서 일어나는 사건들을 설명하는 이론입니다. 이론은 매우 이상하고 놀랍습니다. 예를 들어, 양자역학에서는 물질이 입자나 파동 중 하나로 동시에 나타난다는 것, 머리털보다 더 작은 입자들이 존재한다는 것, 그리고 양자친화력으로 두 개의 입자가 서로가 되는 현상 등이 존재합니다.

양자역학은 알버트 아인슈타인, 니어보테르 등에 의해 발전되어 왔으며, 현재는 빛, 전자, 원자, 분자 등의 물리학, 화학, 전자공학에서 필수적인 이론입니다. 이론은 우주의 기초 이론인 일반 상대성 이론과 마찬가지로 우리의 생각과 일반 상식으로 이해하기가 어렵지만, 양자역학은 현실에 존재하는 대부분의 물질과 에너지를 다루기 때문에 매우 중요합니다.

다음은 이어서 질문하는 예시입니다. “한 문장으로 요약해 줘” 라는 질문을 던지면, 이전 질의/응답 내용을 바탕으로 지시사항(prompt)을 수행한 뒤 답변을 출력합니다.

# 두 번째 질문
print(chatbot.ask('한 문장으로 요약해 줘'))
양자역학은 물질의 입자나 파동의 특성을 설명하는 이론으로, 이상하고 복잡하나 현재의 물리학, 화학, 전자공학에서 필수적인 이론입니다.

계속해서 이어서 질문을 할 수 있습니다. 이전 질의/응답 내용을 포함합니다.

# 세 번째 질문
print(chatbot.ask('영어로 번역해 줘'))
Quantum mechanics is a theory that explains the nature of matter as particles or waves, and it is a strange and complicated theory, but an essential one in current fields of physics, chemistry, and electronic engineering.

모든 질의/응답 내용을 초기화 하고 싶다면 clear() 함수를 호출합니다.

# 대화 초기화
chatbot.clear()

웹 인터페이스

gradio 모듈을 설치 후 대화형 웹 인터페이스를 구현할 수 있습니다.

먼저, gradio 모듈을 설치합니다.

# gradio 모듈 설치
!pip install gradio

다음의 코드를 실행하여 웹 인터페이스로 챗봇을 구현할 수 있습니다.

import gradio as gr
import random
import time

# 챗봇 인스턴스 생성
chatgpt = ChatBot()

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

    def respond(message, chat_history):
        # ChatGPT 질의
        bot_message = chatgpt.ask(message)
        # 답변 기록
        chat_history.append((message, bot_message))
        return "", chat_history

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

# 로컬(local) 구동시
demo.launch()

# Share 하는 경우
# demo.launch(share=True)

출력

댓글남기기