만든 챗봇에 글을 작성하면 다이어리, todo, 일정으로 자동 분류 되는 방법

SSO·2025년 1월 7일
0

최종 프로젝트를 하면서 보다 좋은 코드가 없을까 검색하며, 조합해본 결과 다음과 같은 코드가 나왔다. 다만, 이 코드를 최종적으로 쓸 것이 아닌, 목적에 맞게 수정할 것이기 때문이다. 또다른 공부라고 생각하면 된다.
아래는 챗봇 API에서 사용자가 작성한 내용을 받아서 다이어리, 할 일(To-Do), 일정(Schedule)로 자동 분류하여 각각 저장하는 코드의 정리된 예시이다. 이 코드는 OpenAI API를 사용해 입력된 내용을 분석하고, 해당 데이터를 각 앱(다이어리, 할 일, 일정)에 저장하는 방식이다.

1. 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

2. 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)

3. 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]

4. 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

5. 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

6. chatbot/urls.py - 챗봇 URL 설정

from django.urls import path
from . import views

urlpatterns = [
    path('process/', views.chatbot_process, name='chatbot_process'),
]

7. main/urls.py - 메인 URL 설정

from django.urls import path, include

urlpatterns = [
    path('chatbot/', include('chatbot.urls')),
    # 다른 앱의 URL들
]

8. 사용자 입력 예시

사용자가 챗봇에 메시지를 입력합니다:

오늘은 매우 바쁜 하루였어요. 아침에는 회의를 했고, 점심에는 친구와 만났어요. 오후에는 업무를 마무리하고 저녁에는 가족과 시간을 보냈어요.

할 일 목록:
1. 내일 회의 준비
2. 프로젝트 문서 작성
3. 운동하기

그리고 내일 친구와 저녁을 먹기로 했어요.

9. AI의 응답 예시

AI가 메시지를 분석한 후 반환하는 내용:

Diary: 오늘은 매우 바쁜 하루였어요. 아침에는 회의를 했고, 점심에는 친구와 만났어요. 오후에는 업무를 마무리하고 저녁에는 가족과 시간을 보냈어요.

To-Do:
1. 내일 회의 준비
2. 프로젝트 문서 작성
3. 운동하기

Schedule:
1. 내일 친구와 저녁 먹기

10. API 응답 예시

챗봇 API가 반환하는 응답:

{
  "diary": "오늘은 매우 바쁜 하루였어요. 아침에는 회의를 했고, 점심에는 친구와 만났어요. 오후에는 업무를 마무리하고 저녁에는 가족과 시간을 보냈어요.",
  "todo": [
    "내일 회의 준비",
    "프로젝트 문서 작성",
    "운동하기"
  ],
  "schedule": [
    "내일 친구와 저녁 먹기"
  ]
}

이 코드를 기반으로 챗봇은 사용자의 입력을 분석하고, 해당 내용을 다이어리, 할 일(To-Do), 일정(Schedule)에 자동으로 추가할 수 있게된다.

보다 코드의 구조가 어렵지만, 사용자면에서 편리성이 느껴진다면, 그것또한 이점이라고 보기에 많은 고민이 필요한 분야라는 것을 느꼈다.

profile
개발자로 한걸음씩!

0개의 댓글