코딩 교육 TIL

2024-05-24 AI 코딩 TI

HyunjunPark 2024. 5. 24. 19:18
  • 튜터님의 피드백을 반영하여, 키오스크만이라도 DRF로 변경

장점 :

API 구축의 간편함: DRF는 직관적인 API 구축 도구를 제공합니다. 이를 통해 HTTP 요청을 쉽게 처리하고 JSON 응답을 반환할 수 있습니다.

직렬화 기능: DRF는 데이터를 직렬화하고 역직렬화하는 도구를 제공하여, 데이터베이스의 쿼리셋을 JSON과 같은 형태로 변환하고 반대로도 쉽게 처리할 수 있습니다.

인증 및 권한 관리: DRF는 다양한 인증 및 권한 부여 메커니즘을 제공하여, API의 보안성을 강화할 수 있습니다.

필터링, 검색 및 페이징: DRF는 내장된 필터링, 검색 및 페이징 기능을 제공하여, 데이터의 부분적 조회 및 관리를 용이하게 합니다.

유연성 및 확장성: DRF는 클래스 기반 뷰와 믹스인을 제공하여, 필요한 기능을 쉽게 확장하고 사용자 정의할 수 있습니다.

  • 진행 중 오류 : django.http.request.RawPostDataException

→ 일반적으로 Django가 요청의 본문(body)에 이미 접근한 후에 다시 접근하려고 할 때 발생한다. 이 오류는 주로 미들웨어, 뷰, 또는 다른 요청 처리 로직에서 요청 본문을 여러 번 읽으려 할 때 발생

해결방법 :

  1. 요청 본문을 한 번만 읽기
  2. @csrf_exempt 사용
  3. 커스텀 미들웨어 점검
  • 코드
    @method_decorator(csrf_exempt)
        def post(self, request):
            try:
                # 요청의 본문을 한 번만 읽어서 사용
                data = request.data
                selected_items = data.get('items', [])
                total_price = data.get('total_price', 0)
    
                today = datetime.now().date()
    
                last_order = Order.objects.filter(created_at__date=today).order_by('-id').first()
                if last_order:
                    order_number = last_order.order_number + 1
                else:
                    order_number = 1
    
                new_order = Order.objects.create(
                    order_number=order_number,
                    order_menu=selected_items,
                    total_price=total_price,
                    status="A"
                )
                return JsonResponse({'order_number': new_order.order_number}, status=201)
            except json.JSONDecodeError:
                return JsonResponse({'error': 'Invalid JSON'}, status=400)
    
@method_decorator(csrf_exempt)
    def post(self, request):
        try:
            # 요청의 본문을 한 번만 읽어서 사용
            data = request.data
            selected_items = data.get('items', [])
            total_price = data.get('total_price', 0)

            today = datetime.now().date()

            last_order = Order.objects.filter(created_at__date=today).order_by('-id').first()
            if last_order:
                order_number = last_order.order_number + 1
            else:
                order_number = 1

            new_order = Order.objects.create(
                order_number=order_number,
                order_menu=selected_items,
                total_price=total_price,
                status="A"
            )
            return JsonResponse({'order_number': new_order.order_number}, status=201)
        except json.JSONDecodeError:
            return JsonResponse({'error': 'Invalid JSON'}, status=400)
  • admin ID별로 가게 및 메뉴 카테고리 별로 각각의 변경이 가능하게 구현
  • ex) 치킨 / 카페 가게별로 불러오는 메뉴가 다르게 설정
  • 코드
########################  model  ########################

class User(AbstractUser):
    CATEGORY_CHOICES = (
        ("CH", "치킨"), # 한글로 수정
        ("CA", "카페"),
    )

    store_name = models.CharField(max_length=100)
    tel = models.CharField(max_length=100, unique=True)
    address = models.CharField(max_length=100)
    category = models.CharField(max_length=2, choices=CATEGORY_CHOICES)


########################  bot.py  ######################

def get_user_menu_and_hashtags(user):
    # 현재 로그인된 사용자의 메뉴 가져오기
    user_menu = Menu.objects.filter(store=user)
    # 메뉴에 연결된 해시태그 가져오기
    user_hashtags = Hashtag.objects.filter(menu_items__in=user_menu).distinct()

    # 메뉴 이름과 해시태그 문자열로 변환
    menu_list = [menu.food_name for menu in user_menu]
    hashtag_list = [hashtag.hashtag for hashtag in user_hashtags]

    return menu_list, hashtag_list


def bot(input_text, current_user):
    client = OpenAI(api_key=settings.OPEN_API_KEY)

    # 사용자의 카테고리 가져오기
    category = current_user.category

    # 사용자의 메뉴 및 해시태그 가져오기
    menu, hashtags = get_user_menu_and_hashtags(current_user)

    # 카테고리에 따라 시스템 지침 작성
    if category == "CH":
        category_text = "치킨"
    elif category == "CA":
        category_text = "카페"
    else:
        category_text = "음식점"

    system_instructions = f"""
        이제부터 너는 "{category_text} 직원"이야. 
        너는 고객의 말에 따라 메뉴를 추천해 줘야해 우리가게에는 {menu}가 있어.
        그리고 아래의 카테고리 중에서 고객의 질문과 관련이 있는 항목을 선택해줘: {hashtags}
        선택된 항목은 '선택된 항목: [항목]' 형식으로 반환하고,
        고객에게 전달할 메시지는 한 문장으로 서비스를 하는 직원처럼 '메세지: "내용"'으로 작성해줘.
    """
  • AI음성인식 기능이 포함된 키오스크에 더욱 편하게 볼 수 있도록 음성인식과 연동되는 챗봇을 표현
  • 저연령층에게는 계속적인 음성인식은 불필요하다고 느낄 수 있다는 점에서, 버튼 형식의 on/off 음성인식 기능을 추가
  • 프롬프트를 좀 더 간결하고 저연령층에 맞게 용건 전달식으로 변경