AI/Projects

Project Joing: Profile Evaluation 로직변경 - Youtube Data API

문괜 2024. 11. 15. 20:28
반응형

현재 구현된 Profile Evaluation의 경우 아래와 같은 로직으로 작동한다.

  1. 사용자(크리에이터)에게서 자신의 Youtube Channel URL을 받는다.
  2. 사용자에게 건네받은 URL을 Selenium을 통해 스크린숏을 찍는다.
    • 우리가 Youtube Channel 처음들어갈때의 첫인상을 느끼는 것과 유사한 로직으로 구성했다.
  3. 스크린숏은 LLM에게 전해지고 유해성 평가를 진행하게 된다.

위와 같이 구현한 이유는 언급한 거와 같이 스크린숏이라는 방식이 우리가 느끼는 채널의 첫인상과 유사하다고 판단했기 때문이다.

하지만 이를 위해서 Selenium이 필요 했고 추가적으로 Chrome Driver를 설치해야만 했다. 이는 Chrome Driver를 서비스 서버에 설치해야 하고 용량이 너무 커서 로직을 변경해야만 하는 이유가 됐다.

 

구현동기

Profile에 대한 유해성평가를 재외하고 api요청에서 현재 Selenium이 필요하지 않다. 추가적으로 핵심기능이 아닌 보조기능으로써 주어진 컴퓨팅리소스를 많이 사용한다는 것은 고쳐야할 여지가 있다는 뜻이다. 또한 컴퓨팅리소스가 여유가 있다 하더라도 현재까지 테스트해본 결과 10건의 요청 중 3~4건의 경우 판독불가라고 한다. 그래서 사진으로의 평가 실패를 대비해야 했다. 

 

구현과정

그래서 Selenium을 활용한 스크린샷 방식이 아니면서도 동시에 이미지 평가 실패를 대비한 평가로직을 만들기 위해 Youtube Data API를 사용했다.

 

Youtube Data API를 활용하여 아래의 형태로 요청을 보내면 Youtube 채널의 ID를 가져올 수 있다.

youtube = googleapiclient.discovery.build('youtube', 'v3', developerKey=api_key)
channel_response = youtube.channels().list(
      part='contentDetails',
      id=channel_id
).execute()

 

아래의 결과에서 contentDetails의 relatedPlaylists의 uploads가 채널에 업로드된 영상들의 playlist의 id를 확인할 수 있다.(비밀 정보는 아니지만 혹시나 하는 마음에)

{
   "kind":"youtube#channelListResponse",
   "etag":"***************",
   "pageInfo":{
      "totalResults":1,
      "resultsPerPage":5
   },
   "items":[
      {
         "kind":"youtube#channel",
         "etag":"***************",
         "id":"***************",
         "contentDetails":{
            "relatedPlaylists":{
               "likes":"",
               "uploads":"***************"
            }
         }
      }
   ]
}

 

그리고 해당 아이디로 아래과 같은 요청을 보낸다.

playlist_response = youtube.playlistItems().list(
      part='snippet',
      playlistId=uploads_playlist_id,
      maxResults=4,
      pageToken=next_page_token
  ).execute()

 

그러면 아래와 같은 형태로 반환이 된다.

{
   "kind":"youtube#playlistItemListResponse",
   "etag":"*****************",
   "nextPageToken":"*****************",
   "items":[.....],
   "pageInfo":{
      "totalResults":250,
      "resultsPerPage":4
   }
}

 

그리고 그 안에 items를 자세히 보면 아래와 같은 정보들이 있다.

	{
         "kind":"youtube#playlistItem",
         "etag":"*******************",
         "id":"*******************",
         "snippet":{
            "publishedAt":"2024-11-01T09:30:07Z",
            "channelId":"*******************",
            "title":"안성재 셰프님의 '모수 홍콩' 미식 탐방기 (with 홍석천)",
            "description":"흑백요리사의 히어로, 국내 유일 미쉐린 3스타 안성재 셰프님의 현재 유일한 레스토랑,\n모수 홍콩 MOSU HONGKONG에 다녀왔습니다.\n\n🔽오늘 영상에 등장한 장소 지도 링크와 촬영도구🔽\n✅ 브이로그 카메라 : https://link.coupang.com/a/bmCkbz\n✅ 푸드 카메라 : https://link.coupang.com/a/bmCliz\n✅ 동시녹음 보이스 레코더 : https://link.coupang.com/a/bKOfpo\n✅ 후시녹음 나레이션 마이크 : https://link.coupang.com/a/bnDkq7\n✅ 랩탑 : https://link.coupang.com/a/bmClTW\n(이상 제휴 링크로 구매 시 수수료를 받아 채널 운영에 도움이 됩니다.)\n\n모수 홍콩 https://maps.app.goo.gl/YbnnoFwGEwP9ofiQ6\n\n육식맨 (홈쿠킹&푸드트립) : https://www.youtube.com/@YOOXICMAN\n잡식맨 (일상&라이브&쇼츠) : https://www.youtube.com/@JOBXICMAN\n인스타그램 : https://www.instagram.com/yooxicman/\n비즈니스 메일 : yooxicman@gmail.com\n\n[육식맨 YOOXICMAN 채널 소개]\n고기 없이 못 사는 육식주의자를 위한 본격 육식 요리 채널!!!\n평범한 아파트 가정집에서 평범하지 않은 고기 요리에 도전합니다!\n\n[육식맨 영상의 4대 목표]\n◇ 참 보기 좋고 먹어 보고 싶은 육식\n◇ 군더더기, 시간 낭비 없이 깔끔한 영상 편집\n◇ 흥미로우면서 진실한 리액션\n◇ 꽤 도움이 되며 부담스럽지 않은 요리 정보\n\n[BGM]\n유튜브 저작권 해결되는 구독형 유료 음원 사이트 Artlist\nhttps://artlist.io/Yooxicman-1309311\n이 URL을 통해 구독하시면 2개월 추가 혜택을 받으실 수 있고, \n저도 2개월 구독 연장 혜택을 받습니다.",
            "thumbnails":{
               "default":{
                  "url":"https://i.ytimg.com/vi/aMKPGl9D_0o/default.jpg",
                  "width":120,
                  "height":90
               },
               "medium":{
                  "url":"https://i.ytimg.com/vi/aMKPGl9D_0o/mqdefault.jpg",
                  "width":320,
                  "height":180
               },
               "high":{
                  "url":"https://i.ytimg.com/vi/aMKPGl9D_0o/hqdefault.jpg",
                  "width":480,
                  "height":360
               },
               "standard":{
                  "url":"https://i.ytimg.com/vi/aMKPGl9D_0o/sddefault.jpg",
                  "width":640,
                  "height":480
               },
               "maxres":{
                  "url":"https://i.ytimg.com/vi/aMKPGl9D_0o/maxresdefault.jpg",
                  "width":1280,
                  "height":720
               }
            },
            "channelTitle":"육식맨 YOOXICMAN",
            "playlistId":"UU0VR2v4TZeGcOrZHnmwbU_Q",
            "position":1,
            "resourceId":{
               "kind":"youtube#video",
               "videoId":"aMKPGl9D_0o"
            },
            "videoOwnerChannelTitle":"육식맨 YOOXICMAN",
            "videoOwnerChannelId":"*******************"
         }
	},

 

그리고 여기서 사진의 종류를 선택하고 해당 URL로 들어가 보면 아래와 같은 사진이 나온다.

그렇다 육식맨 채널을 이용해 테스트하고 있었다.

 

여기서 나의 경우에 영상들의 썸내일과 제목 설명을 활용하기 위해 해당 정보들을 따로 반환하는 로직을 만들었다.

사진의 경우 Standard를 사용하였고 Text 정보의 경우 Title과 Description을 사용하였다. 추후 변경될 수 있으나 현재는 기본형 태인 Standard를 사용하기로 결정했다. 

 

그리고 이 시점부터 Text Evaluation과 Image Evaluation으로 나눠서 평가를 진행한다.

 

다음으로는 구체적인 Text Evaluation과 Image Evaluation에 대해 설명하겠다.

 

구체적인 구현한 코드를 확인하고 싶다면 아래의 링크에서 확인할 수 있다.

 

 

Profile Evaluation Refactoring

 

Project-Joing-MVP-Dev/Joing-Dev/evaluation/profile/refactoring at main · jwywoo/Project-Joing-MVP-Dev

Contribute to jwywoo/Project-Joing-MVP-Dev development by creating an account on GitHub.

github.com

 

반응형