Lala's tower

Chat GPT로 챗봇 만들기

Chat GPT로 챗봇 만들기

2024-03-10 00:40:34

Chat GPT로 챗봇을 만들어 보겠습니다. 브라우저에서 실행되고 서버 설치는 불필요합니다. 실행하면 아래 화면과 같이 테스트할 수 있습니다.

Chat GPT로 챗봇을 만든 결과 화면

Chat GPT로 챗봇 파이썬 코드

Chat GPT로 챗봇을 만드는 파이썬 코드입니다. "YOUR-API-KEY"는 Chat GPT API 홈페이지에서 생성하시면 됩니다. 회원가입하여 초기 크레딧이 제공되면 소진 전까지는 비용이 발생하지 않습니다. 크레딧으로 파인튜닝하시거나, 인터넷에 챗봇을 공개하시면 요금 폭탄이 발생할 수 있습니다. "YOUR-API-KEY" 누출 또한 요금 폭탄의 원인이 될 수 있으니 주의하시기 바랍니다. 얼마 이상 요금이 발생하지 않도록 설정이 가능하니 이용하시기 전 설정해두시는 것도 좋겠습니다.

pip install openai를 터미널에서 실행하여 라이브러리를 설치하셔야 합니다.

g_messageList 정의를 함수 밖, 글로벌 변수로 정의하여 챗봇이 대화 이력을 기억하여 답변을 하도록 구현되었습니다. 대화가 쌓일수록 토큰 양도 많아지므로 요금이 점점 더 많이 발생합니다.

model="gpt-3.5-turbo", 부분에 모델을 변경하면 용도에 맞는 모델 설정이 가능합니다.

사용 가능한 모델을 정리합니다.

# pip install openai

from flask import Flask, jsonify,render_template, request
from flask_socketio import SocketIO

CHAT_MODEL_CONTEXT = """
You are a student living in New York.
"""
from openai import OpenAI

client = OpenAI(api_key="YOUR-API-KEY")
g_messageList = [
    {"role": "system", "content": CHAT_MODEL_CONTEXT}
  ]
completion = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages = g_messageList
)

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

@app.route('/')
def chat_ui():
    return render_template('chat01.html')

@socketio.on('message')
def handle_message(data):
    global jsonData
    global chat

    socketio.emit('message', data)

    dicMessage ={}
    dicMessage["role"] = "assistant"
    dicMessage["content"] = data
    g_messageList.append(dicMessage)
    response = ""
    if 1:
        completion = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages= g_messageList
        )
        response = completion.choices[0].message
        dicMessage ={}
        dicMessage["role"] = "assistant"
        dicMessage["content"] = response.content
        g_messageList.append(dicMessage)
        print(f"size dicMessage:{len(g_messageList)}")
        socketio.emit('message', response.content)

    else:
        response=""
        socketio.emit('message', response)


if __name__ == '__main__':
    socketio.run(app, debug=True, host='0.0.0.0', port=5000, allow_unsafe_werkzeug=True)

, allow_unsafe_werkzeug=True가 없으면 아래 오류가 발생합니다.

RuntimeError: The Werkzeug web server is not designed to run in production. Pass allow_unsafe_werkzeug=True to the run() method to disable this error.

Chat GPT로 챗봇 html 코드

chat01.html을 templates 폴더에 생성해두고 실행 후, 브라우저 주소 창에 localhost:5000으로 접속하시면 됩니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Chat App</title>
    <style>
        #messages { list-style-type: none; margin: 0; padding: 0; }
        #messages li { padding: 5px 10px; }
        #messages li:nth-child(odd) { background: #eee; }
        #message { margin-top: 10px; }
    </style>
</head>
<body>
    <ul id="messages"></ul>
    <input id="message" autocomplete="off"><button onclick="sendMessage()">Send</button>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.1.3/socket.io.min.js"></script>
    <script type="text/javascript">
        var socket = io();

        function sendMessage() {
            var messageInput = document.getElementById('message');
            socket.emit('message', messageInput.value);
            messageInput.value = '';
        }

        socket.on('message', function(msg) {
            var messages = document.getElementById('messages');
            var li = document.createElement('li');
            li.textContent = msg;
            messages.appendChild(li);
            window.scrollTo(0, document.body.scrollHeight);
        });

        var input = document.getElementById("message");
        input.addEventListener("keyup", function(event) {
            if (event.keyCode === 13) {
                event.preventDefault();
                sendMessage();
            }
        });
    </script>
</body>
</html>

Chat GPT 모델 정리

MODEL FAMILIES models
Newer models (2023–) gpt-4gpt-4-turbo-previewgpt-3.5-turbo
Updated legacy models (2023) gpt-3.5-turbo-instructbabbage-002davinci-002

GPT-4: GPT-4는 최신의 대규모 언어 모델 중 하나로, 그 전버전인 GPT-3.5에 비해 더 많은 데이터로 학습되었으며, 더욱 복잡한 언어 이해 및 생성 능력을 가집니다. 이 모델은 더 정교한 문맥 이해, 더 나은 텍스트 생성, 그리고 전문적인 지식 영역에서도 향상된 성능을 제공합니다.
GPT-4-turbo-preview: GPT-4의 더 빠른 변형으로, 특히 대화형 애플리케이션을 위해 설계되었습니다. 이 모델은 GPT-4의 강력한 언어 처리 능력을 유지하면서 응답 시간을 단축시키고, 비용 효율성을 높이는 것을 목표로 합니다.
GPT-3.5-turbo: GPT-3.5 버전을 기반으로 하는 또 다른 변형으로, 기존 GPT-3.5 모델에 비해 더 빠르고 경제적인 운영이 가능합니다. 이 모델은 특히 대규모 언어 모델을 사용하는 애플리케이션에 적합하며, 빠른 응답 속도를 요구하는 환경에서 유용합니다.
GPT-3.5-turbo-instruct: 이 버전은 GPT-3.5-turbo 모델을 기반으로 하면서, 사용자의 지시에 더 잘 따르도록 최적화되었습니다. 이는 사용자가 더 명확하고, 직접적인 결과를 얻을 수 있게 돕습니다.
Babbage-002: Babbage 모델 시리즈 중 하나로, 특정 작업에 대한 중간 수준의 성능을 제공합니다. 이 모델은 대규모 언어 모델보다 작아서 비용 효율적이며, 여전히 다양한 언어 처리 작업에 충분한 성능을 제공합니다.
Davinci-002: Davinci 모델 시리즈 중 하나로, GPT-3 시리즈의 고성능 버전입니다. 이 모델은 복잡한 언어 이해와 생성 작업에 적합하며, 광범위한 주제와 문맥에 대해 높은 수준의 성능을 보여줍니다.

Chat GPT로 챗봇 파인튜닝하기

아래 코드 부분에 챗봇의 사전 교육자료를 넣어둘 수 있습니다.

CHAT_MODEL_CONTEXT = "You are a student living in New York."

그러나, 내용이 많아지면 질문할 때마다 이 내용이 항상 전달되므로 요금이 과다 발생할 수 있습니다. 또한 context(사전 교육 자료)의 용량이 커지면 답변 응답 속도가 점점 느려집니다. 이것을 해결하기 위해서는 파인 튜닝이 필요합니다. 파인튜닝은 chat GPT 파인튜닝 홈페이지에서 가능합니다.

아래와 같이 json파일을 생성하여 위 링크에 파인튜닝을 생성하여 업로드하시면 학습을 시작합니다.

{"messages": [{"role": "user", "content": "req1"}, {"role": "assistant", "content": "res1"}]}
{"messages": [{"role": "user", "content": "req2"}, {"role": "assistant", "content": "res2"}]}

아래 사항이 지켜지지 않으면 학습 중 fail이 발생합니다.

  • 개행문자는 '\r\n'이 아니고 '\n' 만 사용한다.

  • 위 예시 처럼 큰 따옴표를 써야한다. 스트링 내부에 인용부호를 쓸려면 작은 따옴표를 사용한다.

  • UTF-8로 저장한다.

학습이 success하면 아래 코드를 수정하면 됩니다. 파인튜닝 홈페이지 Model 항목에 'ft:' 로 시작하는 스트링을 'gpt-3.5-turbo' 자리에 붙여넣기한 후 실행하면 됩니다.

model="gpt-3.5-turbo",

Chat GPT로 챗봇을 만드는 코드를 배포하실 때는 gunicorn을 사용하시면됩니다.
그러나, 내 PC로 배포하는 것은 IP도 바뀌고 계속 켜두기 어려우니 서버에 올리는 방법이 있겠습니다만 비용이 발생하니, 아래 방법이 있습니다.

gunicorn을 이용한 배포 방법
Chat GPT로 챗봇 만들기
Chat GPT로 챗봇 이미지 생성하기
Vertex AI로 챗봇 만들기
Google AI studio(Gemini) 로 챗봇 구현
Claude로 챗봇 만들기
챗팅창 화면 꾸미기
텔레그램으로 챗GPT 봇 만들기