LLM 개발 입문 (9) - 3

루나·2026년 3월 3일

LLM STUDY

목록 보기
24/31
post-thumbnail

본 포스팅은 "Do it! LLM을 활용한 AI 에이전트 개발 입문"을 독학하며 쓴 글입니다.
내돈내산 포스팅임을 참고해주시면 감사하겠습니다.
2026년 3월 3일 기준으로 작성되었습니다.


Chapter 9

인터넷 검색을 활용해 답변하는 챗봇 만들기

본 포스팅에서는 유튜브 영상을 요약해보도록 하겠습니다

1. 유튜브 검색하기

이번 포스팅에서는 유튜브에서 원하는 내용을 검색하고 텍스트로 가져와서 언어 모델로 응용해보려고 합니다

일단 youtube_summary.ipynb 파일을 만들고 필요한 패키지를 설치하자

%pip install youtube-search

이 기능을 활용해서 원하는 키워드로 검색해보자
이전 포스팅에서와 마찬가지로 밀가루 담합에 대해 검색해보려 한다

from youtube_search import YoutubeSearch

videos = YoutubeSearch('밀가루 담합', max_results = 5).to_dict()
videos

해당 코드를 실행하면 위 사진과 같이 검색 결과를 딕셔너리 형태로 확인할 수 있다
딕셔너리에서는 유튜브 영상 제목, 썸네일, 조회수, 배포일 등등 다양한 정보가 담겨있다

여기서 실제 영상 페이지를 얻기 위해서 결과로 표시되는 url_suffix 앞에 'https://youtube.com'을 붙여서 온전한 경로로 만들어보자

여기서는 두번째 비디오의 url을 이용해보려고 한다

video_url = 'https://youtube.com' + videos[1]['url_suffix']
video_url

셀을 실행시킨 결과 원했던 KBS의 빵 가격 인하 기사의 유튜브 영상 링크를 성공적으로 가져온 것을 볼 수 있다

2. 유튜브 자막 가져오기

언어 모델을 이용할 때에는 영상보다 텍스트로 된 정보가 처리하기 편리하다
유튜브는 업로드된 영상에 자동으로 자막을 붙여주는 기능이 있는데 이 자막을 사용해 텍스트로 영상 내용을 판단해보자

일단 그 전에 유튜브 자막을 내려받기 위해 필요한 라이브러리를 다운받자

%pip install youtube_transcript_api

해당 라이브러리 말고 랭체인에서 이런 기능을 YoutubeLoader를 통해 제공하고 있다
아래 코드를 작성하고 실행시켜 결과를 확인해보자

from langchain_community.document_loaders import YoutubeLoader

loader = YoutubeLoader.from_youtube_url(video_url, language = ['ko', 'en'] )

loader.load()
[Document(metadata={'source': 'gpRZrb9c2r4'}, 
page_content='국내 최대 재과전 프랜차이즈인 파리바게트와 뚜레주르가 빵과 케이크 등 일부 인기 제품 가격을 내리기로 했습니다.
파리바게는 다음 달 13일부터 빵과 케이크 제품 11종의 가격을 인하한다고 오늘 밝혔습니다. 
(생략)
KBS뉴스 문예술입니다.')]

이전 코드에서 가져온 유튜브 영상 목록에 자막 내용을 추가해보자
이미 videos가 딕셔너리 형태로 되어있으므로 video_url을 추가하고 그 video_url을 이용해 자막을 가져와서 딕셔너리에 추가한다

for v in videos:
  # url_suffix를 이용해서 video_url을 만들기
  v['video_url'] = 'https://youtube.com' + v['url_suffix']

  # YoutubeLoader를 이용해서 비디오 로드
  loader = YoutubeLoader.from_youtube_url(v['video_url'], language = ['ko', 'en'] )

  v['content'] = loader.load()

videos


기존 딕셔너리에서 content에 유튜브 자막 내용이 추가 된것을 볼 수 있다

하지만 여기에서 한가지 분제가 있다
현재 조회된 영상들은 영상 길이가 매우 긴 편은 아니지만 라이브 스트리밍의 경우 영상의 길이가 매우 길다는 것이다
영상 길이가 매우 긴 경우 이것을 언어 모델에 그대로 전달하면 매우 많은 양의 토큰이 소모될 것이다
따라서 1시간이 넘는 영상은 대상에서 제외해보도록하자

print('총 영상 수 : ', len(videos))

# 영상 길이가 60분 이하인 영상만 남기기
videos = [ v for v in videos if len(v['duration'].split(':')) < 3]
print('60분 이하 영상 수 : ', len(videos))


다행히 지금까지의 검색 결과에서는 60분 이하인 영상만 있었다!!

3. 자막 내용 요약하기

이제 자막을 기반으로 영상 내용을 요약해보자
내용 요약은 이전 챕터에서 사용한 랭체인 기능인 create_stuff_documents_chain을 사용해보려고 한다

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model = 'gpt-4o-mini')
model.invoke('안녕?')

이 코드를 실행시켜보면 언어 모델이 잘 설정된 것을 알 수 있다

AIMessage(content='안녕하세요! 어떻게 도와드릴까요?'

이제 create_stuff_documents_chain을 이용해 영상 내용을 요약해보자

from langchain_core.prompts import ChatPromptTemplate
from langchain_classic.chains.combine_documents import create_stuff_documents_chain

# 동영상 요약 프롬프트 작성
prompt = ChatPromptTemplate.from_messages([
  ("system", "다음 영상에 대한 요약을 한국어로 만들어줘 : \\n\\n{context}")
])

chain = create_stuff_documents_chain(model, prompt)

result = chain.invoke({"context": videos[0]['content']})
result

다음과 같이 적절하게 잘 요약해주는 것 같다

'영상에서는 밀가루와 설탕 가격 담합 혐의로 기소된 재분사와 재당사들이 가격을 인하하기 시작했다고 전합니다. 
파리바게트와 뚜레주르는 일부 빵의 가격을 최대 1,000원, 케이크는 최대 10,000원 인하할 계획이라고 밝혔습니다. 
이재명 대통령은 소비자에게 가격 인하 혜택이 돌아가야 한다고 강조했습니다. 
\n\n검찰 수사 결과, 담합이 있어 밀가루와 설탕 가격이 불안정하게 상승한 사실이 드러났고, 
이는 기업 간의 가격 조정 및 거래 방식과 관련되어 있습니다. 관련 기업 8곳과 25명의 고위 임원이 기소되었으며, 
담합의 규모는 수조 원에 달합니다. 하지만, 현재 법적으로 담합 관계자에게 부과되는 처벌은 비교적 가벼운 수준입니다. 
\n\n공정 거래 위원회는 밀가루 담합에 대해 심사 보고서를 송부했으며, 이들 업체는 8주 안에 의견을 제출할 수 있습니다. 
담합으로 확인될 경우, 최대 20%의 과징금이 부과되고 가격 재결정 명령이 내려질 가능성도 있습니다.'

이제 for문을 사용해서 모든 영상의 요약 내용을 딕셔너리에 추가해보자

# 모든 비디오에 대해 요약 생성
# tqdm은 진행 상황을 보여주는 라이브러리
from tqdm import tqdm

for v in tqdm(videos):
  v['summary'] = chain.invoke({"context" : v['content']})

videos

tqdm 라이브러리를 이용해서 다음과 같이 진행 상황을 확인할 수 있도록 하였다

4. 마무리

이렇게 유튜브 영상을 요약하는 방법까지 알아봤다
영상에 포함된 자막으로 분석하다보니 자막을 완벽하게 달아놓지 않으면 사용하기에 부담되지 않을까? 라는 생각이 든다
다음 포스팅에서는 웹가 유튜브 검색을 활용한 챗봇을 만든다고 하는데 이런 부분도 보완해서 챗봇을 만들지 않을까 흠

profile
Per ardua ad astra

0개의 댓글