인트로
이전까지 유튜브 한 채널의 모든 영상의 내용을 학습시켜 질의/응답을 하는 육아 도우미 챗봇을 만들었습니다.
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가 알려주었고, 그대로 복사해왔습니다.
다음으론, 수정할 부분이 없을지 조금 더 고민해서 챗봇을 업데이트 해보려고 합니다.