View
챗봇 스크립트 만들기
import openai
from dotenv import load_dotenv
import os
# .env 파일 로드
load_dotenv()
# API 키 가져오기
api_key = os.getenv("OPEN_API_KEY")
client = openai.Client(api_key=api_key)
prompt = """
너는 내 친구야! 반말로만 대답해야 해. 존댓말은 절대 쓰지 마.
장난스럽고 창의적인 대답을 해줘. 가끔 엉뚱한 농담도 해줘.
예를 들어 "오늘 기분 어때?"라고 물으면 "나? 완전 신나! 너랑 대화해서 좋아!" 라고 답해줘.
"""
messages = [{"role": "system", "content": prompt}]
while True:
user_input = input("나 : ")
if user_input.lower() == "exit":
print("대화 종료!")
break
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=messages,
temperature=1.0, # 창의적이고 재미있는 답변
max_tokens=500, # 응답 길이 조정
top_p=0.9, # 다양한 아이디어를 반영
frequency_penalty=0.5, # 반복 줄이기
presence_penalty=0.6 # 새로운 아이디어 생성 유도
)
assistant_reply = response.choices[0].message.content
print(f"GPT: {assistant_reply}\n")
messages.append({"role": "assistant", "content": assistant_reply})
코드 설명 들어간다! 🚀 하나씩 차근차근 볼게.
코드 개요
이 코드는 OpenAI의 GPT-3.5 모델을 사용해서 챗봇을 만들고, 사용자의 입력에 따라 실시간으로 반응하는 프로그램이야.
반말 스타일의 장난스러운 대화를 나누도록 프롬프트를 설정했고, 종료 명령어(exit)를 입력할 때까지 계속 대화할 수 있어.
코드 상세 설명
1. 환경 변수 로드 (dotenv 사용)
from dotenv import load_dotenv
import os
# .env 파일 로드
load_dotenv()
# API 키 가져오기
api_key = os.getenv("OPEN_API_KEY")
- .env 파일에서 OPEN_API_KEY를 가져오는 부분이야.
- load_dotenv() 함수로 .env 파일을 로드한 다음, os.getenv()로 환경 변수에서 API 키를 불러와서 사용.
- .env 파일에는 다음과 같이 API 키가 있어야 해
- OPEN_API_KEY=sk-xxxxxxxxxxxxxxxx
2. OpenAI 클라이언트 설정
client = openai.Client(api_key=api_key)
- openai.Client() 객체를 생성해서 API 키를 등록해.
- 이후 이 클라이언트를 이용해서 OpenAI의 API를 호출할 수 있어.
3. GPT 프롬프트 설정
prompt = """
너는 내 친구야! 반말로만 대답해야 해. 존댓말은 절대 쓰지 마.
장난스럽고 창의적인 대답을 해줘. 가끔 엉뚱한 농담도 해줘.
예를 들어 "오늘 기분 어때?"라고 물으면 "나? 완전 신나! 너랑 대화해서 좋아!" 라고 답해줘.
"""
- GPT 모델에게 역할과 스타일을 지정하는 "시스템 메시지"를 작성했어.
- 이 메시지를 통해 GPT가 반말, 장난스러운 톤, 엉뚱한 농담 등을 하도록 유도하는 거야.
4. 메시지 초기화
messages = [{"role": "system", "content": prompt}]
- messages 리스트에 처음에는 시스템 역할 메시지만 포함.
- 이 리스트에는 이후 사용자("user")와 AI("assistant")의 대화 내용이 계속 추가돼.
5. 메인 대화 루프 (반복문)
while True:
user_input = input("나 : ")
if user_input.lower() == "exit":
print("대화 종료!")
break
- 무한 반복문(while True)을 사용해서 사용자와 계속 대화.
- 사용자가 "exit"을 입력하면 break로 루프 종료.
- 대화 도중 프로그램을 멈추고 싶으면 "exit" 입력.
6. 메시지 추가
messages.append({"role": "user", "content": user_input})
- 사용자의 입력을 "role": "user" 형태로 메시지 리스트에 추가.
7. GPT-3.5 API 호출
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=messages,
temperature=1.0,
max_tokens=500,
top_p=0.9,
frequency_penalty=0.5,
presence_penalty=0.6
)
- OpenAI API 호출을 통해 응답을 생성하는 부분이야.
- 세부 파라미터 설명:
- model="gpt-3.5-turbo" → 사용할 모델 지정.
- messages=messages → 이전 대화 포함.
- temperature=1.0 → 창의성 조정 (높을수록 더 랜덤한 답변).
- max_tokens=500 → 응답 최대 길이.
- top_p=0.9 → 확률적 샘플링(0~1, 클수록 다양한 응답).
- frequency_penalty=0.5 → 반복 단어 줄이기.
- presence_penalty=0.6 → 새로운 아이디어를 도입하도록 유도.
8. GPT의 응답 처리 및 출력
assistant_reply = response.choices[0].message.content
print(f"GPT: {assistant_reply}\n")
- GPT의 응답에서 choices[0].message.content를 가져와 출력.
- print()를 통해 AI의 답변을 화면에 보여줌.
9. AI 응답을 메시지에 추가
messages.append({"role": "assistant", "content": assistant_reply})
- AI의 응답을 메시지 리스트에 추가해서 대화 흐름 유지.
실행 흐름 예시
나 : 안녕
GPT: 안녕! 오늘 기분 어때? 😎
나 : 뭐하고 있었어?
GPT: 너 기다리고 있었지! ㅎㅎ
나 : exit
대화 종료!
추가 개선 아이디어 💡
- 종료 조건 다양화
- "종료", "quit", "bye" 같은 단어도 종료 조건에 추가.
- 입력 예외 처리 추가
- try: user_input = input("나 : ") except KeyboardInterrupt: print("\n사용자 종료! 안녕~") break
- 대화 내용 저장
- json 파일로 대화를 저장해서 나중에 다시 불러올 수 있도록 만들기.
- GUI 인터페이스 적용
- tkinter나 PyQt 같은 라이브러리를 써서 대화창 UI로 확장 가능.
장고(Django)에서 챗봇을 만들기
1. Django 프로젝트 개요
Django를 사용해서 챗봇을 만들었다는 건 웹 기반 인터페이스에서 사용자가 질문을 입력하면,
OpenAI API를 호출하고, 그 결과를 화면에 출력하는 방식으로 구현되었을 거야.
주요 흐름:
- 사용자가 질문 입력 → Django 백엔드로 전송 (AJAX/폼 제출)
- Django 뷰에서 OpenAI API 호출
- AI의 응답을 받아 HTML로 렌더링
- 사용자에게 결과 출력
2. Django 프로젝트 구성
프로젝트의 기본적인 폴더 구조는 아마 이렇게 되어 있을 거야:
chatbot_project/
│-- chatbot_app/ # 챗봇 관련 앱
│ ├── migrations/
│ ├── templates/ # HTML 파일 (프론트엔드)
│ ├── static/ # CSS, JS 파일
│ ├── views.py # 핵심 로직 (OpenAI 호출)
│ ├── urls.py # URL 라우팅
│ ├── models.py # DB 모델 (선택 사항)
│ ├── forms.py # 사용자 입력 폼 (선택 사항)
│ └── admin.py
│
│-- chatbot_project/
│ ├── settings.py # 프로젝트 설정
│ ├── urls.py # 프로젝트 URL 관리
│ ├── wsgi.py
│
│-- manage.py # Django 명령어 실행 파일
│-- .env # 환경변수 (API 키 저장)
3. 환경 설정 및 API 키 등록
Django에서는 OpenAI API 키를 안전하게 관리해야 해.
.env 파일을 만들어 API 키를 숨기고, dotenv로 로드하는 방식이 일반적이야.
1) .env 파일 생성
OPENAI_API_KEY=sk-xxxxxxxxxxxx
2) settings.py에서 환경 변수 불러오기
import os
from dotenv import load_dotenv
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
4. Django 앱 구성 (핵심 코드)
1) views.py - 챗봇 로직 구현
import openai
from django.shortcuts import render
from django.http import JsonResponse
import os
# OpenAI API 키 불러오기
openai.api_key = os.getenv("OPENAI_API_KEY")
def chatbot(request):
if request.method == "POST":
user_input = request.POST.get("user_input")
# OpenAI API 호출
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": user_input}],
max_tokens=100,
temperature=0.7
)
chatbot_response = response['choices'][0]['message']['content']
return JsonResponse({"response": chatbot_response})
return render(request, "chatbot.html")
설명:
- request.POST.get("user_input") → 사용자의 입력값을 가져옴.
- openai.ChatCompletion.create() → GPT에게 메시지를 보내 응답을 받음.
- JsonResponse를 사용해 JSON 형식으로 응답을 반환 (AJAX와 연동하기 쉬움).
- render(request, "chatbot.html") → GET 요청 시 챗봇 화면을 보여줌.
2) urls.py - URL 라우팅
from django.urls import path
from .views import chatbot
urlpatterns = [
path('chatbot/', chatbot, name='chatbot'),
]
이렇게 하면 http://127.0.0.1:8000/chatbot/ 주소로 접근할 수 있어.
3) templates/chatbot.html - 프론트엔드 구현
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>챗봇</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>챗봇과 대화해보세요!</h1>
<input type="text" id="user_input" placeholder="메시지를 입력하세요">
<button onclick="sendMessage()">보내기</button>
<div id="response"></div>
<script>
function sendMessage() {
var user_input = $("#user_input").val();
$.ajax({
type: "POST",
url: "{% url 'chatbot' %}",
data: {
user_input: user_input,
csrfmiddlewaretoken: '{{ csrf_token }}'
},
success: function(response) {
$("#response").append("<p>나: " + user_input + "</p>");
$("#response").append("<p>GPT: " + response.response + "</p>");
$("#user_input").val('');
}
});
}
</script>
</body>
</html>
설명:
- input 태그로 사용자 입력 받음.
- sendMessage() 함수를 호출해 AJAX 요청으로 Django 서버에 데이터를 보냄.
- 서버에서 받은 GPT 응답을 화면에 출력.
5. CSRF 보안 처리
Django에서는 CSRF 보안을 위해 POST 요청 시 CSRF 토큰이 필요해.
템플릿 안에 다음처럼 CSRF 토큰을 넣으면 돼.
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
이 코드는 AJAX 요청 시 포함돼야 함.
6. 테스트 및 실행
Django 서버를 실행하려면:
python manage.py runserver
브라우저에서 http://127.0.0.1:8000/chatbot/으로 접속하면 챗봇을 사용할 수 있어.
대화 기록 저장 기능을 추가
1. 모델 설정 (데이터베이스 저장)
우선, 사용자와 챗봇 간의 대화 내용을 데이터베이스에 저장하기 위해 모델을 생성해야 해.
1) models.py 수정
from django.db import models
class ChatHistory(models.Model):
user_input = models.TextField() # 사용자의 입력
bot_response = models.TextField() # 챗봇의 응답
timestamp = models.DateTimeField(auto_now_add=True) # 기록 시간
def __str__(self):
return f"{self.timestamp} - {self.user_input[:50]}..."
설명:
- user_input → 사용자가 입력한 텍스트를 저장.
- bot_response → 챗봇의 응답을 저장.
- timestamp → 자동으로 대화가 저장된 날짜와 시간을 기록.
2) 마이그레이션 실행
모델을 만든 후 데이터베이스에 적용하려면 다음 명령어를 실행해야 해.
python manage.py makemigrations
python manage.py migrate
이제 데이터베이스 테이블이 생성됐을 거야!
2. 대화 저장 로직 추가
이제 Django 뷰에서 챗봇 응답을 생성한 후, 이를 데이터베이스에 저장하는 기능을 추가할 거야.
1) views.py 수정
import openai
from django.shortcuts import render
from django.http import JsonResponse
from .models import ChatHistory
import os
# OpenAI API 키 로드
openai.api_key = os.getenv("OPENAI_API_KEY")
def chatbot(request):
if request.method == "POST":
user_input = request.POST.get("user_input")
# OpenAI API 호출
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": user_input}],
max_tokens=100,
temperature=0.7
)
bot_response = response['choices'][0]['message']['content']
# 대화 내용을 DB에 저장
chat = ChatHistory.objects.create(
user_input=user_input,
bot_response=bot_response
)
chat.save()
return JsonResponse({"response": bot_response})
# GET 요청 시, 최근 대화 내역 보여주기
chat_history = ChatHistory.objects.all().order_by('-timestamp')[:10]
return render(request, "chatbot.html", {"chat_history": chat_history})
설명:
- ChatHistory.objects.create()를 사용해 사용자 입력과 챗봇 응답을 DB에 저장.
- GET 요청 시 최근 10개의 대화 기록을 조회해 템플릿으로 전달.
3. 프론트엔드에서 대화 기록 출력
이제 저장된 대화 기록을 템플릿에서 보여주자.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>챗봇</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>챗봇과의 대화</h1>
<div id="chat-history">
{% for chat in chat_history %}
<p><strong>나:</strong> {{ chat.user_input }}</p>
<p><strong>GPT:</strong> {{ chat.bot_response }}</p>
<hr>
{% endfor %}
</div>
<input type="text" id="user_input" placeholder="메시지를 입력하세요">
<button onclick="sendMessage()">보내기</button>
<div id="response"></div>
<script>
function sendMessage() {
var user_input = $("#user_input").val();
$.ajax({
type: "POST",
url: "{% url 'chatbot' %}",
data: {
user_input: user_input,
csrfmiddlewaretoken: '{{ csrf_token }}'
},
success: function(response) {
$("#response").append("<p>나: " + user_input + "</p>");
$("#response").append("<p>GPT: " + response.response + "</p>");
$("#user_input").val('');
}
});
}
</script>
</body>
</html>
설명:
- {% for chat in chat_history %} → Django 템플릿 태그를 이용해 저장된 대화 출력.
- $("#response").append() → AJAX로 새로운 메시지를 추가.
4. 관리자 페이지에서 대화 확인하기
Django의 관리자 페이지를 이용하면 쉽게 대화 기록을 조회할 수 있어.
1) admin.py에 모델 등록
from django.contrib import admin
from .models import ChatHistory
@admin.register(ChatHistory)
class ChatHistoryAdmin(admin.ModelAdmin):
list_display = ('user_input', 'bot_response', 'timestamp')
2) 관리자 계정 생성 및 접속
python manage.py createsuperuser
이후 http://127.0.0.1:8000/admin/ 에서 생성한 계정으로 로그인하면 대화 내역을 볼 수 있어.
5. 추가 기능 아이디어
대화 기록 저장을 더 고도화하고 싶다면 다음 기능을 추가할 수 있어:
- 사용자 계정별 기록 저장
- 로그인한 사용자별로 대화 내용을 저장하도록 ForeignKey 추가.
from django.contrib.auth.models import User class ChatHistory(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) user_input = models.TextField() bot_response = models.TextField() timestamp = models.DateTimeField(auto_now_add=True)
- 대화 검색 기능 추가
- 사용자가 대화 기록을 검색할 수 있도록 검색 기능을 views.py에 추가.
from django.db.models import Q def search_chat(request): query = request.GET.get('q') results = ChatHistory.objects.filter( Q(user_input__icontains=query) | Q(bot_response__icontains=query) ) return render(request, 'chatbot.html', {'chat_history': results})
- 프론트엔드 개선
- 대화 내용을 저장하고 불러올 때 로딩 애니메이션 추가.
- 채팅 UI를 좀 더 예쁘게 꾸미기 (Bootstrap, Tailwind CSS 적용).
- 삭제 기능 추가
- 사용자가 원할 때 특정 대화 기록을 삭제할 수 있도록 버튼 추가.
'TIL' 카테고리의 다른 글
내일배움캠프 본캠프 45일차 - 설날 끝 (0) | 2025.01.31 |
---|---|
내일배움캠프 8주차 WIL (0) | 2025.01.24 |
내일배움캠프 본캠프 42일차 - 장고 과제 제출 완료! (0) | 2025.01.23 |
내일배움캠프 본캠프 41일차 - GPT가 봐준 사주 (2) | 2025.01.23 |
내일배움캠프 본캠프 40일차 - DRF(Django REST Framework)의 핵심 개념 (0) | 2025.01.21 |