Chat GPT로 챗봇 만들기

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-turbohttps://api.openai.com/v1/chat/completions
Updated legacy models (2023)gpt-3.5-turbo-instructbabbage-002davinci-002https://api.openai.com/v1/completions
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을 사용하시면됩니다.

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

Leave a Comment