최종 프로젝트를 하면서 보다 좋은 코드가 없을까 검색하며, 조합해본 결과 다음과 같은 코드가 나왔다. 다만, 이 코드를 최종적으로 쓸 것이 아닌, 목적에 맞게 수정할 것이기 때문이다. 또다른 공부라고 생각하면 된다.
아래는 챗봇 API에서 사용자가 작성한 내용을 받아서 다이어리, 할 일(To-Do), 일정(Schedule)로 자동 분류하여 각각 저장하는 코드의 정리된 예시이다. 이 코드는 OpenAI API를 사용해 입력된 내용을 분석하고, 해당 데이터를 각 앱(다이어리, 할 일, 일정)에 저장하는 방식이다.
chatbot/utils.py
- OpenAI API 호출 및 데이터 처리import openai
# OpenAI API 키 설정
openai.api_key = "your_openai_api_key"
def analyze_chatbot_input(content):
"""
OpenAI GPT를 사용하여 입력된 내용을 분석하고 Diary, To-Do, Schedule 데이터를 추출합니다.
"""
prompt = f"""
아래 내용을 분석하여 Diary, To-Do, Schedule 데이터를 추출하세요.
입력: "{content}"
형식:
Diary: [일기 내용]
To-Do: [할 일 목록]
Schedule: [일정 목록]
"""
try:
response = openai.Completion.create(
engine="text-davinci-003",
prompt=prompt,
max_tokens=200,
temperature=0.7
)
return response.choices[0].text.strip()
except Exception as e:
print(f"OpenAI 호출 에러: {e}")
return None
chatbot/views.py
- 챗봇 API 구현from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .utils import analyze_chatbot_input
from diary.models import Diary
from todo.models import Todo
from schedule.models import Schedule
@api_view(['POST'])
def chatbot_process(request):
"""
챗봇 입력을 처리하고 Diary, To-Do, Schedule에 데이터를 저장합니다.
"""
content = request.data.get("content", "")
if not content:
return Response({"error": "내용이 비어 있습니다."}, status=status.HTTP_400_BAD_REQUEST)
# AI 분석 호출
ai_response = analyze_chatbot_input(content)
if not ai_response:
return Response({"error": "AI 분석 실패"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# AI 응답 파싱
try:
diary_start = ai_response.find("Diary:") + len("Diary:")
todo_start = ai_response.find("To-Do:")
schedule_start = ai_response.find("Schedule:")
diary_content = ai_response[diary_start:todo_start].strip()
todo_items = ai_response[todo_start + len("To-Do:"):schedule_start].strip().split("\n")
schedule_items = ai_response[schedule_start + len("Schedule:"):].strip().split("\n")
except Exception as e:
return Response({"error": f"AI 응답 파싱 실패: {e}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
# Diary 저장
if diary_content:
Diary.objects.create(user=request.user, content=diary_content)
# To-Do 저장
for task in todo_items:
if task.strip(): # 빈 항목 무시
Todo.objects.create(user=request.user, task=task.strip())
# Schedule 저장
for schedule in schedule_items:
if schedule.strip():
Schedule.objects.create(user=request.user, event=schedule.strip())
return Response({
"diary": diary_content,
"todo": todo_items,
"schedule": schedule_items
}, status=status.HTTP_201_CREATED)
diary/models.py
- 다이어리 모델from django.db import models
from django.contrib.auth.models import User
class Diary(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.content[:50]
todo/models.py
- 할 일(To-Do) 모델from django.db import models
from django.contrib.auth.models import User
class Todo(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
task = models.CharField(max_length=255)
select_date = models.DateField(null=True, blank=True)
def __str__(self):
return self.task
schedule/models.py
- 일정(Schedule) 모델from django.db import models
from django.contrib.auth.models import User
class Schedule(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
event = models.CharField(max_length=255)
date = models.DateField(null=True, blank=True)
def __str__(self):
return self.event
chatbot/urls.py
- 챗봇 URL 설정from django.urls import path
from . import views
urlpatterns = [
path('process/', views.chatbot_process, name='chatbot_process'),
]
main/urls.py
- 메인 URL 설정from django.urls import path, include
urlpatterns = [
path('chatbot/', include('chatbot.urls')),
# 다른 앱의 URL들
]
사용자가 챗봇에 메시지를 입력합니다:
오늘은 매우 바쁜 하루였어요. 아침에는 회의를 했고, 점심에는 친구와 만났어요. 오후에는 업무를 마무리하고 저녁에는 가족과 시간을 보냈어요.
할 일 목록:
1. 내일 회의 준비
2. 프로젝트 문서 작성
3. 운동하기
그리고 내일 친구와 저녁을 먹기로 했어요.
AI가 메시지를 분석한 후 반환하는 내용:
Diary: 오늘은 매우 바쁜 하루였어요. 아침에는 회의를 했고, 점심에는 친구와 만났어요. 오후에는 업무를 마무리하고 저녁에는 가족과 시간을 보냈어요.
To-Do:
1. 내일 회의 준비
2. 프로젝트 문서 작성
3. 운동하기
Schedule:
1. 내일 친구와 저녁 먹기
챗봇 API가 반환하는 응답:
{
"diary": "오늘은 매우 바쁜 하루였어요. 아침에는 회의를 했고, 점심에는 친구와 만났어요. 오후에는 업무를 마무리하고 저녁에는 가족과 시간을 보냈어요.",
"todo": [
"내일 회의 준비",
"프로젝트 문서 작성",
"운동하기"
],
"schedule": [
"내일 친구와 저녁 먹기"
]
}
이 코드를 기반으로 챗봇은 사용자의 입력을 분석하고, 해당 내용을 다이어리, 할 일(To-Do), 일정(Schedule)에 자동으로 추가할 수 있게된다.
보다 코드의 구조가 어렵지만, 사용자면에서 편리성이 느껴진다면, 그것또한 이점이라고 보기에 많은 고민이 필요한 분야라는 것을 느꼈다.