비개발자의 GPT canvas와 Cursor로 육아 도우미 챗봇 만들기…(2탄: 코드 설명)

인트로

이전까지 유튜브 한 채널의 모든 영상의 내용을 학습시켜 질의/응답을 하는 육아 도우미 챗봇을 만들었습니다.

ChatGPT와 Cursor 덕분에 개발 지식 하나 없이도 챗봇을 만들었는데...

AI의 도움으로 코딩을 전혀 몰라도 개발을 할 수 있는 게 장점 인데
코딩을 전혀 모르고 개발을 했다는 게 최대 단점 같네요😅 😭😭

다음 단계로, 만들어진 코드에 대해 더 업데이트를 하기 위해 각 코드가 어떤 역할을 하는지를 알아야할텐데.... 코알못이라서...ㅜㅜ
바로 ChatGPT 4o canvas에게 물어봤습니다.


결과(현재까지 진행된 코드에 대한 상세 설명)

1. 프로젝트 개요 및 주요 개념 설명

- 프로젝트 목표: 이번 프로젝트의 목표는 유튜브에 있는 육아 관련 비디오의 자막 데이터를 사용해, 사용자 질문에 대한 맞춤형 답변을 제공하는 챗봇을 만드는 것입니다. 이 챗봇은 AI를 이용해 비디오 자막을 분석하고, 사용자의 질문에 맞는 정보를 제공하여 육아에 대한 다양한 질문에 대한 답변을 쉽게 얻을 수 있도록 도와줍니다.

- 프로젝트 주요 단계:

1. 유튜브 비디오 수집: 특정 유튜브 채널에서 비디오 목록을 가져옵니다.

2. 비디오 자막 추출: 각 비디오의 자막을 추출합니다.

3. 임베딩 생성: 자막을 컴퓨터가 이해할 수 있는 숫자 벡터(임베딩)로 변환합니다.

4. 질문 유사성 분석 및 답변 생성: 사용자의 질문과 유사한 자막 데이터를 찾아내고, 이를 바탕으로 챗봇이 답변을 생성합니다.

- 사용된 주요 기술 개념:

- 유튜브 API: 유튜브에서 비디오 데이터를 가져오기 위한 도구입니다.

- 임베딩 (Embedding): 자막 같은 텍스트 데이터를 숫자 벡터로 변환하여 컴퓨터가 이해하도록 하는 기술입니다. 이 벡터를 사용해 질문과 유사한 정보를 빠르게 찾을 수 있습니다.

- FAISS: 많은 데이터를 빠르게 검색하기 위한 도구입니다. 이 도구를 통해 질문과 가장 유사한 자막을 찾습니다.

- GPT 모델 (ChatGPT): 사용자의 질문에 대해 자연스러운 답변을 생성하기 위해 사용되는 AI 모델입니다.

2. 각 단계별 코드 구성 및 프로세스 리뷰

#### 2.1 유튜브 비디오 수집

- 코드 설명:

class YouTubeService:
    def __init__(self):
        self.youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)
    
    def get_video_list(self, channel_id):
        # 비디오 목록을 유튜브 API로 가져오는 과정
        videos = []
        next_page_token = None
        while True:
            request = self.youtube.search().list(
                part="snippet",
                channelId=channel_id,
                maxResults=50,
                pageToken=next_page_token,
                type="video"
            )
            response = request.execute()
            videos.extend(response.get("items", []))
            next_page_token = response.get("nextPageToken")
            if not next_page_token:
                break
        return videos

- 유튜브 비디오 수집의 역할:

- 유튜브 API를 사용해 특정 채널의 비디오 목록을 가져옵니다. 채널 ID를 입력하면, 해당 채널의 모든 비디오 정보를 불러오게 됩니다.

- 비개발자 이해용 설명:

- 유튜브에서 자동으로 비디오를 찾고, 그 목록을 받아오는 작업입니다. 이는 사람의 수작업을 줄이고, 프로그램이 비디오 데이터를 수집할 수 있게 해줍니다.

#### 2.2 비디오 자막 추출

- 코드 설명:

def get_video_transcript(video_id):
    # 비디오 자막을 가져오는 과정
    try:
        transcript = YouTubeTranscriptApi.get_transcript(video_id, languages=['ko'])
        return ' '.join([entry['text'] for entry in transcript])
    except Exception as e:
        logging.error(f"자막 가져오기 실패 (비디오 ID: {video_id}): {str(e)}")
        return None

- 비디오 자막 추출의 역할:

- 각 비디오의 자막을 가져와서 텍스트 형태로 변환합니다.

- 비개발자 이해용 설명:

- 프로그램이 비디오에서 말하는 내용을 글자로 변환하는 작업입니다. 이렇게 텍스트로 만들어야 컴퓨터가 내용을 분석할 수 있습니다.

#### 2.3 임베딩 생성

- 코드 설명:

def create_embedding(text):
    # 텍스트의 임베딩 생성
    try:
        response = openai.Embedding.create(
            input=text,
            model="text-embedding-ada-002"
        )
        return response['data'][0]['embedding']
    except Exception as e:
        logging.error(f"임베딩 생성 실패: {str(e)}")
        return None

- 임베딩 생성의 역할:

- 자막을 컴퓨터가 이해할 수 있는 숫자 형태의 데이터(임베딩)로 변환합니다.

- 비개발자 이해용 설명:

- 컴퓨터는 텍스트를 그대로 이해할 수 없기 때문에, 자막을 숫자들로 변환하여 컴퓨터가 분석할 수 있도록 합니다. 임베딩은 이런 변환을 의미합니다.

#### 2.4 질문 유사성 분석 및 답변 생성

- 코드 설명:

def get_relevant_context(question, k=3):
    # 질문에 대한 임베딩 생성
    question_embedding = create_embedding(question)
    # FAISS를 사용해 유사한 자막 검색
    D, I = index.search(np.array([question_embedding]).astype('float32'), k)
    results = []
    for idx, distance in zip(I[0], D[0]):
        results.append({
            'text': df.iloc[idx]['transcript'],
            'title': df.iloc[idx]['title'],
            'distance': float(distance)
        })
    return results

- 질문과 유사한 자막 검색:

- 사용자의 질문과 비슷한 내용을 가진 자막을 찾습니다.

- 비개발자 이해용 설명:

- 사용자가 질문하면, 그 질문과 관련된 비디오의 자막을 찾습니다. 예를 들어, "아이의 수면 방법"에 대해 질문하면, 이와 관련된 내용을 가진 자막을 찾는 것이죠.

#### 2.5 GPT를 이용한 답변 생성

- 코드 설명:

def chat_with_gpt(prompt):
    # GPT 모델을 사용해 답변 생성
    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "육아 관련 전문가입니다."},
                {"role": "user", "content": prompt}
            ],
            max_tokens=500,
            temperature=0.7
        )
        return response.choices[0].message['content']
    except Exception as e:
        logging.error(f"GPT 응답 생성 실패: {str(e)}")
        return "죄송합니다. 일시적인 오류가 발생했습니다."

- 답변 생성의 역할:

- 찾은 자막 정보를 바탕으로 AI가 사용자의 질문에 대한 답변을 생성합니다.

- 비개발자 이해용 설명:

- AI가 유사한 자막의 내용을 참고하여 질문에 대한 답변을 만들어줍니다. 이렇게 하면 사용자는 육아에 대해 실질적인 조언을 쉽게 받을 수 있습니다.

이와 같은 흐름으로 비개발자도 이해할 수 있도록 프로젝트를 단계별로 정리하고 설명하면, 전체적인 큰 그림부터 세부적인 코드의 역할까지 이해하는 데 도움이 될 것입니다. 이런 방식으로 계속 작업해 나갈 수 있게 제가 도와드릴게요. 추가로 설명이 필요한 부분이나 더 세부적으로 다루었으면 하는 부분이 있나요?


모든 해설은 GPT가 알려주었고, 그대로 복사해왔습니다.

다음으론, 수정할 부분이 없을지 조금 더 고민해서 챗봇을 업데이트 해보려고 합니다.

1
2개의 답글

👉 이 게시글도 읽어보세요