파이썬 - 나만의 가상 친구, garadio로 AI 챗봇 웹앱 만들기

나만의 AI 만들기

소개

 

[Python] 나만의 음성 AI 일본인 친구 만들기 | github배포 .feat 치사토

미리보기녹화후 확인해보니 음성이 두개가 겹쳐서 녹화되었네요 실제 작동시에는 깨끗한 목소리로 출력됩니다. 특징character.ai의 api를 사용했기 때문에 사이트에있는 다양한 Ai와 소통이 가능하

newstroyblog.tistory.com

지난번 포스팅에서 AI프로젝트를 다뤘는데 character.ai에서 사용자들이 만든 AI 중 원하는 것을 선택해 로컬 환경에서 실행해 보는 프로젝트를 진행했습니다. 

오늘은 OpenAI의 ChatGPT API를 활용하여 AI에게 프롬포트를 설정하여 커스텀마이징하여 AI 챗봇 웹사이트를 만들어 보겠습니다.

OpenAI의 ChatGPT 모델은 최근에 꾸준히 발전하고 있어서 예전에 비해서 더 자연스럽고 퀄리티 높은 대화가 가능해졌습니다. 더욱이, GPTs를 활용한 개인 맞춤형 챗봇 서비스가 가능해지면서 활용 범위가 크게 늘어났습니다. 이번 포스팅에서는 GPT API를 활용하여, 사용자와 친구나 연인처럼 자연스럽게 대화하는 AI 챗봇을 만들어 보는 과정을 소개하겠습니다.
 
 
 

제작 단계

이번 프로젝트는 웹 애플리케이션을 통하여 작동하도록 제작할 예정입니다. 최종 목적은 AI와 자연스러운 대화를 주고받으며 GPT API를 연동하여 파이썬에서 구현하고 웹앱 인터페이스 부분은 그라디오로 처리할 예정입니다.
 
 

제작동기

처음 제작하게 된 이유가 AI관련한 다양한 소재를 영상으로 쉽게 다루어주시는 빵형의 개발도상국 유튜브채널의 chatgpt를 통한 웹앱제작방법을 봤는데 단순히 설명뿐만 아니라 퀄리티 높은 강의안에 코드도 제공하고 있어서 직접 한번 만들어봐야겠다고 생각했습니다. api가 업데이트되면서 response.choices객체의 대화를 읽어와야 하는데 코드가 조금 바뀌어서 최신정보로 수정하였습니다. openai를 파이썬에서 사용하기 위해 github에 올라와있는 최신 정보를 확인하면 코드를 작성하는데 도움이 되실 겁니다. (Openai python github)
 
 

GPT API 크레딧 충전방법

API사용을 위한 크레딧 요금은 ChatGPTAPI의 Billing 페이지에서 충전할 수 있습니다.(링크)
처음부터 많은 금액을 충전할 필요는 없고 체험한다는 느낌으로 소액충전을 해놓고 API사용에 만족한다면 추가금액을 결제하는 걸 권해드립니다.
 

결제 금액은 5달러부터 충전가능합니다. 금액이 일정금액 이상 떨어질 경우 API이용이 불가할 수 있습니다. 이를 방지하기 위해 자동충전도 설정해 놓을 수 있습니다.
 
 
 

파이썬으로 AI친구 만들기

ChatGPT API발급받기

API 발급 사이트로 이동한다음 Create new secret key 버튼을 클릭합니다 (API 발급 사이트 링크)
 

이름은 아무거나 상관없으며 Create secret key를 클릭하면 api key가 발급됩니다.
 

생성된 api key는 다시 확인하기 어려우니 Copy 버튼을 눌러 따로 보관합니다. 나중에 파이썬 코드 작성 시에 api key를 사용하게 됩니다.
 
 
 

가상환경 생성

새로운 프로젝트를 진행하면서 다양한 패키지를 좀 더 쉽게 관리하고 버전별 충돌을 예방할 수 있도록 virtualenv 가상환경에서 프로젝트를 진행할 예정입니다.(파이썬 가상환경 만드는 법)
 

virtualenv chatapp

가상환경 이름은 원하는 이름을 설정하여도 무방하며 저는 chatapp이라는 가상환경을 생성하도록 하겠습니다.
 

./chatapp/Scripts/activate

생성한 가상환경의 activate 명령을 실행하여 가상환경을 활성화해주세요.
 
 
 

필요한 패키지 설치하기

pip install gradio openai

OpenAI의 chatgpt API를 사용하기 위하여 openai 패키지를 설치하고, 웹앱서비스로 만들기 위해서 gradio 패키지를 설치합니다.

  • gradio - 웹앱 애플리케이션을 구현
  • openai - open ai의 chatgpt api를 사용

 

import gradio as gr
from openai import OpenAI

상단에 사용할 모듈을 불러와줍니다.
 
 

client = OpenAI(api_key="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")

client 변수를 생성하고 아까 발급받은 자신의 api key를 입력합니다.
지금 입력된 api key는 제가 임의로 발급받은 key이기 때문에 그대로 사용하시면 올바르게 작동되지 않습니다. 반드시 자신의 api key를 사용해 주세요.
 
 
 

gpt 대화 부분 함수처리

def chat_with_gpt(input, history):
    history.append({"role": "user", "content": input})
    gpt_response = client.chat.completions.create(
        model="gpt-4",
        messages=history
        )
    response = gpt_response.choices[0].message.content
    history.append({"role": "assistant", "content": response})

    messages = [(history[i]["content"], history[i+1]["content"]) for i in range(1, len(history), 2)]

    return messages, history

GPT와의 대화를 처리하는 부분을 chat_with_gpt함수로 묶어두었습니다. 
get_resopnse에 model부분은 아래에서 조금 더 자세히 설명하겠습니다.

  • history.append함수로 history변수에 user의 입력한 텍스트 내용을 추가합니다.
  • chat_with_gpt함수는 사용자의 입력(input)과 대화기록(history)을 받아서 챗봇의 응답을 생성하고 대화기록을 업데이트하는 역할에 사용됩니다.
  • get_resopnse는 OpenAI의 chat API를 사용하여 ai의 생성된 답변을 받아오는 역할을 합니다. 이때 model부분은 사용하고 싶은 모델을 입력하면 됩니다. history부분은 대화가 오고 갈 때 이전의 대화내용을 ai가 기억하여 지속적인 대화가 가능하도록 합니다.
  • response는 gpt_response에서 챗봇의 대답을 추출한 것입니다.
  • history.append는 history변수에 챗봇의 대답을 대화기록에 추가합니다.
  • mesaages는 사용자와 챗봇의 대화를 주고받는 형태를 나타냅니다. [("사용자1"), ("챗봇1"), ("사용자2"), ("챗봇2")] 같은 형식(get_resopnse의 messages변수는 OpenAI의 api호출에 사용되는 인자이며 지금의 messages 변수는 대화를 저장하기 위한 새로운 변수입니다.) 실제 print로 출력해보면 GPT설정 명령어,사용자입력,ai응답 내용이 담겨있습니다.
  • return값으로 get_resopnse함수에서 message와 history 함수를 반환합니다.

 
 
 

gpt모델 항목 가격 및 추천모델

    gpt_response = client.chat.completions.create(
        model="gpt-4",
        messages=history)

gpt 대화 부분 함수처리 부분에서 get_response으로 api를 호출할 때 사용할 gpt 모델을 선택할 수 있습니다.
사용가능한 GPT3.5 및 GPT4 모델은 아래를 확인해 주세요.
 

API페이지의 playground에서 chat부분의 사용가능 모델을 보면 사용가능 모델을 간략하게 확인할 수 있습니다(playground)
 
 
GPT3.5 모델(링크)

gpt3.5 모델 중에서도 다양한 모델이 있습니다. 각 모델별로 성능이 약간씩 다르며 입력토큰의 제한양도 다릅니다.
저는 gpt-3.5 turbo 모델을 사용해 봤는데 아무리 많이 사용해도 0.0? 달러 수준에 불과하여 가격대비 응답속도도 준수하고 만족하였습니다. 각 모델별 실시간 사용요금은 Usage페이지에서 확인할 수 있습니다(gpt 사용요금 확인)
 

Openai의 가격표를 확인하면 gpt-3.5 turbo의 가격이 나와있습니다.(링크)
 
 
GPT4모델 (링크)

gpt4모델도 다양한 모델이 나뉘어있는데 gpt3.5 버전과 다르게 비교적 최근의 훈련데이터로 학습되었습니다. 때문에 성능이 우수하고 더 많은 처리가 가능합니다. gpt-4 모델을 사용해 봤는데 전체적으로 성능은 준수하나 채팅을 주고받으면서 사용요금을 확인해 보니 gpt3.5에 비해 요금이 더 나가기 때문에 이 부분은 잘 확인하며 맞는 걸 사용하시는 걸 권해드립니다.
 

이전에 봤던 gpt3.5 버전에 비해서는 가격이 조금 더 비싼 편입니다. 사실 가격표만 볼 때는 크게 체감이 안 돼서 실제로 사용해 보고 평균 사용량을 모니터링해 보고 예산과 목적에 맞는 모델을 선택하는 게 가장 좋습니다. 
 
 
추천모델

API에서 사용가능한 모델을 전체적으로 보려면 Limits페이지에서 확인가능합니다(링크)
 
제 개인적으로는 gpt-3.5-turbo 모델을 추천해 드립니다. 응답속도도 빠른 편이며 대화를 여러 번 주고받아도 퀄리티가 떨어지는 편도 아니고 비용이 저렴해서 충분히 만족하는 수준이었습니다.
 
 
 

그라디오 웹앱 인터페이스

with gr.Blocks() as demo:
    chatbot = gr.Chatbot(label="ChatBot")

    state = gr.State([{
        "role": "system",
        "content": """
		당신의 역할은 지금부터 사용자의 요구에 맞게 적절한 응답을하는 ai비서입니다. 
		"""}])

    with gr.Row():
        txt = gr.Textbox(show_label=False, placeholder="대화를 입력해주세요.").style(container=False)
        
    txt.submit(chat_with_gpt, [txt, state], [chatbot, state])
    txt.submit(lambda x: gr.update(value=''), [],[txt])

demo.launch(debug=True, share=True)

AI관련 서비스를 사용하다 보니 gradio로 구현된 인터페이스를 많이 접했었는데 gradio라이브러리는 머신러닝 모델의 인터페이스를 빠르게 생성하여 복잡한 웹 개발없이도 쉽게 인터페이스를 구출할 수 있다는 장점을 가지고 있습니다. 이번에 처음 사용해 보았는데 실제로 인터페이스 구현도 간단하고 활용가능성이 넓어 굉장히 만족스러웠습니다.

  • gr.Blocks() gradio는 인터페이스를 하나의 블록으로 묶어서 사용가능합니다.
  • chatbot는 챗봇인터페이스를 생성합니다. 이 공간에는 대화를 주고받은 내용이 메시지형태로 나오게 됩니다.
  • state변수의 gr.State()는 챗봇의 초기상태를 설정합니다. 이 부분에 ChatGPT에게 역할을 부여해줘야 하는데 해당 코드에서는 임의로 작성해 보았습니다. 조금 더 자연스러운 대화를 원한다면 AI의 직업 및 관심사 나이나 말투 행동등 자세한 요구사항을 입력하면 그에 맞는 자연스러운 응답을 합니다. state변수는 chat_with_gpt 함수를 호출할 때 state인자 값으로 넘겨줍니다.
  • gr.Row()는 여러 개의 gradio인터페이스를 가로로 배치합니다.
  • gr.Textbox()는 텍스트 입력창을 생성합니다. 사용자가 메시지를 입력하면 txt변수에 저장됩니다.
  • txt.submit는 텍스트창에 입력을 받으면  txt와 state를 인자값으로 넘겨 chat_with_gpt함수를 실행하고 결과값을 chatbot과 state에 반영합니다.
  • txt.submit의 lambda 식은 텍스트창에 텍스트를 입력하여 제출할 경우 텍스트창을 비워주는 역할을 합니다.
  • demo.launch는 챗봇을 실행하는데 debug=True는 디버그 모드를 활성화하고 share=True는 로컬이 아닌 외부로도 공유할 수 있도록 로컬링크와 함께 별도로 URL을 생성합니다.

 

기타 오류

Import "gradio" cloud not be

가상환경에서 gradio를 설치하고 불러오려고 하면 노란 줄로 경고메세지가 나오는데 파이썬 인터프리터 버전의 문제인거 같습니다.버전별 설치되는 경로등이 달라져서 발생할 수 있다고 추측되는데 이번 게시물에서는 신경쓰지않고 작업해도 괜찮습니다.
 
 

'ChatCompletion' object is not subscriptable

강의안의 코드를 사용하다 보면 위와 같은 에러메시지를 확인할 수 있는데 OpenAI의 최신 패키지에서 response.choices의 객체타입이 변경되어 그렇습니다.
 

최신 openai python Github 페이지를 확인해 보면 다음과 같이 메시지를 가져오는 걸 확인할 수 있습니다.(링크)
 
 
 

실행화면

프로그램을 실행한 뒤 브라우저로 이동하면 사진과 같은 인터페이스가 나오게 됩니다.
사진에서는 미리 질문할 대화를 입력한 상태인데 엔터키를 눌러서 AI에게 메시지를 전송하고 응답받을 수 있습니다.
 
 
 

AI응답화면

처음 질문한 내용은 노란색 대화상자로 나타나고 제가 사용한 gpt-3.5-turbo-16k 모델 기준으로 약 2~3초 정도의 응답시간이 소요되었습니다. 답변의 퀄리티는 미리 입력한 프롬포트 설정에 따라서 달라지겠지만 원하는 수준의 의사소통이 가능했습니다.
 


 

마무리

초기 GPT-3 모델에 이어 다양한 AI 모델들이 등장하고 있으며, 이들은 지속적인 업데이트를 통해 현재는 사용자 커스텀마이징이 가능하고 확장성이 뛰어나다는 장점을 가지고 있습니다. 사용자가 자신만의 챗봇을 서비스하는데 매우 유용하지만 커스텀마이징은 두 가지 면에서 장단점이 존재합니다.
 
예를 들어, 이전에 음성 AI 친구를 만들 때는 이미 잘 구성된 캐릭터를 활용했고 많은 데이터의 캐릭터가 존재하여 선택만 하면 되기 때문에 그 과정이 상대적으로 수월했습니다. 반면, 이번에는 캐릭터 설정을 직접 구현해야 하는 점에서 약간의 부담감을 느낄 수 있습니다.

그럼에도 불구하고, 시간과 노력을 들여 챗봇을 만들면, 자신만의 대화 스타일을 구현할 수 있다는 큰 장점이 있습니다. 더불어 AI를 통해 추가적인 기능도 적용해 볼 수 있으므로 단순히 대화뿐만 아니라 다른 API와도 연동이 가능해 보입니다.

 

다음번에는 현재 작성된 내용에다가 단순 대화뿐만 아니라 ai에게 명령까지 추가적으로 내리면서 기능을 작동하도록 작성해보겠습니다.

Top