파트너십
멀티모달 RAG: TwelveLabs와 Chroma를 활용한 비디오 챗 구현하기

제임스 러
개발자는 Twelve Labs Embed API와 Chroma를 사용하여 비디오 임베딩을 생성하고, 시맨틱 검색을 통해 관련 클립을 검색하며, Pegasus를 활용해 비디오 콘텐츠와 대화하는 멀티모달 RAG 시스템을 구축할 수 있습니다. 오픈소스 LLaVA-NeXT-Video 모델과의 직접 분석 및 비교 내용도 함께 제공됩니다.
개발자는 Twelve Labs Embed API와 Chroma를 사용하여 비디오 임베딩을 생성하고, 시맨틱 검색을 통해 관련 클립을 검색하며, Pegasus를 활용해 비디오 콘텐츠와 대화하는 멀티모달 RAG 시스템을 구축할 수 있습니다. 오픈소스 LLaVA-NeXT-Video 모델과의 직접 분석 및 비교 내용도 함께 제공됩니다.

목차
뉴스레터 구독하기
뉴스레터 구독하기
영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.
영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.
AI로 영상을 검색하고, 분석하고, 탐색하세요.
2025. 3. 21.
20분
링크 복사하기
초안을 검토해 주신 Chroma 팀의 Jeff Huber님과 Itai Smith님께 깊은 감사를 드립니다!
비디오 대상 RAG 기반 Q&A를 구현하기 위해 TwelveLabs의 Embed API와 Chroma의 Vector Database를 통합하는 튜토리얼에 오신 것을 환영합니다. 이 가이드에서는 생성형 모델을 사용해 비정형 비디오 데이터베이스에서 텍스트로 된 답변을 추출하는 방법을 배웁니다.
우리는 TwelveLabs의 풍부하고 문맥적인 임베딩을 Chroma의 벡터 데이터베이스와 결합하여 비디오 임베딩을 저장, 인덱싱 및 검색하는 챗 애플리케이션을 만들 것입니다. 이 노트북은 단 몇 줄의 코드만으로 이러한 기술이 구현할 수 있는 실질적인 가능성을 보여줍니다.
비교를 위해, 텍스트 답변 생성에 TwelveLabs의 Generate API를 사용하는 경우와 선도적인 오픈소스 모델인 LLaVA-NeXT-Video를 사용할 때 개발자 경험이 어떻게 다른지도 함께 보여드립니다.
1 - 개요
이 튜토리얼에서는 TwelveLabs Marengo를 사용해 비디오 임베딩을 생성하고, Chroma를 사용하여 이 임베딩을 저장 및 검색해 관련 비디오를 찾은 다음, TwelveLabs Pegasus와 LLaVA-NeXT-Video를 사용해 검색된 비디오와 대화하는 몇 가지 예제를 살펴보겠습니다.
진행 과정은 다음과 같습니다:
TwelveLabs Marengo 엔진을 사용한 비디오 임베딩 생성
Chroma 데이터베이스에 비디오 임베딩 저장
관련 비디오 세그먼트를 찾기 위해 Chroma 데이터베이스의 임베딩 검색
TwelveLabs Pegasus를 사용해 반환된 비디오 세그먼트와 대화하기
오픈소스 모델을 사용해 반환된 비디오 세그먼트와 대화하기
Pegasus와 오픈소스 모델 비교
Chroma 및 TwelveLabs 임베딩을 사용해 여러 비디오 검색
Pegasus를 사용해 전체 비디오와 대화하기
오픈소스 모델을 사용해 전체 비디오와 대화하기
2 - 설정 및 설치
필수 라이브러리 설치
먼저 TwelveLabs 및 Chroma SDK를 설치합니다.
# Install Twelve Labs and Chroma libraries !pip install --upgrade twelvelabs !pip install --upgrade chromadb
다음으로, 오픈소스 모델을 실행하는 데 사용할 라이브러리를 설치합니다.
# Install libraries for use with the open source model !pip install protobuf==3.20.3 !pip install --upgrade -q accelerate bitsandbytes !pip install git+https://github.com/huggingface/transformers.git !pip install av
Colab 이외의 환경에서 이 튜토리얼을 실행하는 경우, 아래 셀의 주석을 해제하여 작업할 비디오 데이터를 확인하는 데 사용되는 라이브러리를 설치하세요.
# Extra Things to install if you're not on colab # !python -m pip install pillow # !python -m pip install sentencepiece # !python -m pip install matplotlib
3 - 비디오 데이터 준비
그 다음, 비디오 데이터를 준비합니다.
비디오 데이터 사용
이 데모는 TwelveLabs Google Drive 폴더에 있는 비디오 데이터를 사용합니다. 이를 사용하려면 해당 폴더를 본인의 Google Drive에 연동한 다음, 해당 Google Drive를 이 Colab에 마운트해야 합니다.
Google Drive에 폴더 연동하기
해당 링크를 통해 누구나 폴더에 액세스할 수 있습니다: https://drive.google.com/drive/folders/1k6FmkVglFsdtJG4MTIK-2dk1Dk9gTPtu?usp=share_link
이 폴더를 본인 Google Drive의 적절한 위치에 연동하려면:
Google Drive에서 "공유 문서함"으로 이동합니다.
액세스하려는 공유 폴더를 찾습니다.
"정리" -> "바로가기 추가"를 선택합니다.
대상 위치로 "내 드라이브"를 선택하고 "추가"를 클릭합니다.
이제 이 폴더는 /content/drive/MyDrive/TwelveLabs-Chroma 경로로 접근이 가능합니다.
드라이브 마운트
여기서 본인의 드라이브를 이 Colab에 마운트합니다.
from google.colab import drive drive.mount('/content/drive')
비디오 경로 설정
그 다음 우리가 작업할 비디오의 경로를 설정합니다. 이 경로는 비디오 폴더를 연동한 위치에 따라 달라질 수 있습니다.
video_folder_path = "/content/drive/MyDrive/TwelveLabs-Chroma/videos/"
비디오 해상도 업스케일링
일부 비디오는 임베딩 엔진에서 사용하기에 해상도가 너무 낮기 때문에, upscale_video 함수를 사용해 해상도를 두 배로 늘려줍니다.
import numpy as np import subprocess import os def upscale_video(input_file, output_path, target_width=854, target_height=480): output_file = os.path.join(output_path, os.path.basename(input_file)) if os.path.exists(output_file): print(f"Skipping {input_file} as {output_file} already exists.") return """ Upscale a video to the target width and height using FFmpeg. Args: input_file (str): Path to the input video file. output_file (str): Path to save the upscaled video. target_width (int): Desired output width. Default is 854. target_height (int): Desired output height. Default is 480. """ # FFmpeg command to upscale the video ffmpeg_command = [ 'ffmpeg', '-i', input_file, # Input file '-vf', f'scale={target_width}:{target_height}', # Scale filter with target dimensions '-c:a', 'copy', # Copy audio stream without re-encoding output_file, # Output file "-y" ] # Run the FFmpeg command subprocess.run(ffmpeg_command) print(f"Upscaled video saved to {output_file}")
먼저, 업스케일링된 비디오를 저장할 경로를 생성합니다.
upscaled_video_dir = video_folder_path + "upscaled_videos/"
그 다음 비디오 해상도를 업스케일링합니다. 이미 업스케일링을 완료하여 폴더에 저장된 비디오는 건너뜁니다.
# Upscale all .mp4 videos # Create output directory if it doesn't exist if not os.path.exists(upscaled_video_dir): os.makedirs(upscaled_video_dir) # Iterate over all files in the raw video directory for filename in os.listdir(video_folder_path): # Check if the file is a video file input_filepath = os.path.join(video_folder_path, filename) if filename.endswith(".mp4"): upscale_video(input_filepath, upscaled_video_dir)
# Output ... Upscaled video saved to ../videos/upscaled_videos/How To Make Birria Tacos [4nIFJFgH99w].mp4 ... Upscaled video saved to ../videos/upscaled_videos/How To Make a McDonald's Cheeseburger [SvOx7tA_Cv8].mp4 ... Upscaled video saved to ../videos/upscaled_videos/How To Make Potato Wedges [eZXbMWPJkKQ]
4 - TwelveLabs Marengo 엔진을 사용한 비디오 임베딩 생성
여기서는 비디오 임베딩을 생성하기 위해 TwelveLabs Marengo 엔진을 사용할 것입니다.
우선 TwelveLabs API 키를 불러오는 것부터 시작하겠습니다. 이 키는 Colab 좌측 패널의
초안을 검토해 주신 Chroma 팀의 Jeff Huber님과 Itai Smith님께 깊은 감사를 드립니다!
비디오 대상 RAG 기반 Q&A를 구현하기 위해 TwelveLabs의 Embed API와 Chroma의 Vector Database를 통합하는 튜토리얼에 오신 것을 환영합니다. 이 가이드에서는 생성형 모델을 사용해 비정형 비디오 데이터베이스에서 텍스트로 된 답변을 추출하는 방법을 배웁니다.
우리는 TwelveLabs의 풍부하고 문맥적인 임베딩을 Chroma의 벡터 데이터베이스와 결합하여 비디오 임베딩을 저장, 인덱싱 및 검색하는 챗 애플리케이션을 만들 것입니다. 이 노트북은 단 몇 줄의 코드만으로 이러한 기술이 구현할 수 있는 실질적인 가능성을 보여줍니다.
비교를 위해, 텍스트 답변 생성에 TwelveLabs의 Generate API를 사용하는 경우와 선도적인 오픈소스 모델인 LLaVA-NeXT-Video를 사용할 때 개발자 경험이 어떻게 다른지도 함께 보여드립니다.
1 - 개요
이 튜토리얼에서는 TwelveLabs Marengo를 사용해 비디오 임베딩을 생성하고, Chroma를 사용하여 이 임베딩을 저장 및 검색해 관련 비디오를 찾은 다음, TwelveLabs Pegasus와 LLaVA-NeXT-Video를 사용해 검색된 비디오와 대화하는 몇 가지 예제를 살펴보겠습니다.
진행 과정은 다음과 같습니다:
TwelveLabs Marengo 엔진을 사용한 비디오 임베딩 생성
Chroma 데이터베이스에 비디오 임베딩 저장
관련 비디오 세그먼트를 찾기 위해 Chroma 데이터베이스의 임베딩 검색
TwelveLabs Pegasus를 사용해 반환된 비디오 세그먼트와 대화하기
오픈소스 모델을 사용해 반환된 비디오 세그먼트와 대화하기
Pegasus와 오픈소스 모델 비교
Chroma 및 TwelveLabs 임베딩을 사용해 여러 비디오 검색
Pegasus를 사용해 전체 비디오와 대화하기
오픈소스 모델을 사용해 전체 비디오와 대화하기
2 - 설정 및 설치
필수 라이브러리 설치
먼저 TwelveLabs 및 Chroma SDK를 설치합니다.
# Install Twelve Labs and Chroma libraries !pip install --upgrade twelvelabs !pip install --upgrade chromadb
다음으로, 오픈소스 모델을 실행하는 데 사용할 라이브러리를 설치합니다.
# Install libraries for use with the open source model !pip install protobuf==3.20.3 !pip install --upgrade -q accelerate bitsandbytes !pip install git+https://github.com/huggingface/transformers.git !pip install av
Colab 이외의 환경에서 이 튜토리얼을 실행하는 경우, 아래 셀의 주석을 해제하여 작업할 비디오 데이터를 확인하는 데 사용되는 라이브러리를 설치하세요.
# Extra Things to install if you're not on colab # !python -m pip install pillow # !python -m pip install sentencepiece # !python -m pip install matplotlib
3 - 비디오 데이터 준비
그 다음, 비디오 데이터를 준비합니다.
비디오 데이터 사용
이 데모는 TwelveLabs Google Drive 폴더에 있는 비디오 데이터를 사용합니다. 이를 사용하려면 해당 폴더를 본인의 Google Drive에 연동한 다음, 해당 Google Drive를 이 Colab에 마운트해야 합니다.
Google Drive에 폴더 연동하기
해당 링크를 통해 누구나 폴더에 액세스할 수 있습니다: https://drive.google.com/drive/folders/1k6FmkVglFsdtJG4MTIK-2dk1Dk9gTPtu?usp=share_link
이 폴더를 본인 Google Drive의 적절한 위치에 연동하려면:
Google Drive에서 "공유 문서함"으로 이동합니다.
액세스하려는 공유 폴더를 찾습니다.
"정리" -> "바로가기 추가"를 선택합니다.
대상 위치로 "내 드라이브"를 선택하고 "추가"를 클릭합니다.
이제 이 폴더는 /content/drive/MyDrive/TwelveLabs-Chroma 경로로 접근이 가능합니다.
드라이브 마운트
여기서 본인의 드라이브를 이 Colab에 마운트합니다.
from google.colab import drive drive.mount('/content/drive')
비디오 경로 설정
그 다음 우리가 작업할 비디오의 경로를 설정합니다. 이 경로는 비디오 폴더를 연동한 위치에 따라 달라질 수 있습니다.
video_folder_path = "/content/drive/MyDrive/TwelveLabs-Chroma/videos/"
비디오 해상도 업스케일링
일부 비디오는 임베딩 엔진에서 사용하기에 해상도가 너무 낮기 때문에, upscale_video 함수를 사용해 해상도를 두 배로 늘려줍니다.
import numpy as np import subprocess import os def upscale_video(input_file, output_path, target_width=854, target_height=480): output_file = os.path.join(output_path, os.path.basename(input_file)) if os.path.exists(output_file): print(f"Skipping {input_file} as {output_file} already exists.") return """ Upscale a video to the target width and height using FFmpeg. Args: input_file (str): Path to the input video file. output_file (str): Path to save the upscaled video. target_width (int): Desired output width. Default is 854. target_height (int): Desired output height. Default is 480. """ # FFmpeg command to upscale the video ffmpeg_command = [ 'ffmpeg', '-i', input_file, # Input file '-vf', f'scale={target_width}:{target_height}', # Scale filter with target dimensions '-c:a', 'copy', # Copy audio stream without re-encoding output_file, # Output file "-y" ] # Run the FFmpeg command subprocess.run(ffmpeg_command) print(f"Upscaled video saved to {output_file}")
먼저, 업스케일링된 비디오를 저장할 경로를 생성합니다.
upscaled_video_dir = video_folder_path + "upscaled_videos/"
그 다음 비디오 해상도를 업스케일링합니다. 이미 업스케일링을 완료하여 폴더에 저장된 비디오는 건너뜁니다.
# Upscale all .mp4 videos # Create output directory if it doesn't exist if not os.path.exists(upscaled_video_dir): os.makedirs(upscaled_video_dir) # Iterate over all files in the raw video directory for filename in os.listdir(video_folder_path): # Check if the file is a video file input_filepath = os.path.join(video_folder_path, filename) if filename.endswith(".mp4"): upscale_video(input_filepath, upscaled_video_dir)
# Output ... Upscaled video saved to ../videos/upscaled_videos/How To Make Birria Tacos [4nIFJFgH99w].mp4 ... Upscaled video saved to ../videos/upscaled_videos/How To Make a McDonald's Cheeseburger [SvOx7tA_Cv8].mp4 ... Upscaled video saved to ../videos/upscaled_videos/How To Make Potato Wedges [eZXbMWPJkKQ]
4 - TwelveLabs Marengo 엔진을 사용한 비디오 임베딩 생성
여기서는 비디오 임베딩을 생성하기 위해 TwelveLabs Marengo 엔진을 사용할 것입니다.
우선 TwelveLabs API 키를 불러오는 것부터 시작하겠습니다. 이 키는 Colab 좌측 패널의
초안을 검토해 주신 Chroma 팀의 Jeff Huber님과 Itai Smith님께 깊은 감사를 드립니다!
비디오 대상 RAG 기반 Q&A를 구현하기 위해 TwelveLabs의 Embed API와 Chroma의 Vector Database를 통합하는 튜토리얼에 오신 것을 환영합니다. 이 가이드에서는 생성형 모델을 사용해 비정형 비디오 데이터베이스에서 텍스트로 된 답변을 추출하는 방법을 배웁니다.
우리는 TwelveLabs의 풍부하고 문맥적인 임베딩을 Chroma의 벡터 데이터베이스와 결합하여 비디오 임베딩을 저장, 인덱싱 및 검색하는 챗 애플리케이션을 만들 것입니다. 이 노트북은 단 몇 줄의 코드만으로 이러한 기술이 구현할 수 있는 실질적인 가능성을 보여줍니다.
비교를 위해, 텍스트 답변 생성에 TwelveLabs의 Generate API를 사용하는 경우와 선도적인 오픈소스 모델인 LLaVA-NeXT-Video를 사용할 때 개발자 경험이 어떻게 다른지도 함께 보여드립니다.
1 - 개요
이 튜토리얼에서는 TwelveLabs Marengo를 사용해 비디오 임베딩을 생성하고, Chroma를 사용하여 이 임베딩을 저장 및 검색해 관련 비디오를 찾은 다음, TwelveLabs Pegasus와 LLaVA-NeXT-Video를 사용해 검색된 비디오와 대화하는 몇 가지 예제를 살펴보겠습니다.
진행 과정은 다음과 같습니다:
TwelveLabs Marengo 엔진을 사용한 비디오 임베딩 생성
Chroma 데이터베이스에 비디오 임베딩 저장
관련 비디오 세그먼트를 찾기 위해 Chroma 데이터베이스의 임베딩 검색
TwelveLabs Pegasus를 사용해 반환된 비디오 세그먼트와 대화하기
오픈소스 모델을 사용해 반환된 비디오 세그먼트와 대화하기
Pegasus와 오픈소스 모델 비교
Chroma 및 TwelveLabs 임베딩을 사용해 여러 비디오 검색
Pegasus를 사용해 전체 비디오와 대화하기
오픈소스 모델을 사용해 전체 비디오와 대화하기
2 - 설정 및 설치
필수 라이브러리 설치
먼저 TwelveLabs 및 Chroma SDK를 설치합니다.
# Install Twelve Labs and Chroma libraries !pip install --upgrade twelvelabs !pip install --upgrade chromadb
다음으로, 오픈소스 모델을 실행하는 데 사용할 라이브러리를 설치합니다.
# Install libraries for use with the open source model !pip install protobuf==3.20.3 !pip install --upgrade -q accelerate bitsandbytes !pip install git+https://github.com/huggingface/transformers.git !pip install av
Colab 이외의 환경에서 이 튜토리얼을 실행하는 경우, 아래 셀의 주석을 해제하여 작업할 비디오 데이터를 확인하는 데 사용되는 라이브러리를 설치하세요.
# Extra Things to install if you're not on colab # !python -m pip install pillow # !python -m pip install sentencepiece # !python -m pip install matplotlib
3 - 비디오 데이터 준비
그 다음, 비디오 데이터를 준비합니다.
비디오 데이터 사용
이 데모는 TwelveLabs Google Drive 폴더에 있는 비디오 데이터를 사용합니다. 이를 사용하려면 해당 폴더를 본인의 Google Drive에 연동한 다음, 해당 Google Drive를 이 Colab에 마운트해야 합니다.
Google Drive에 폴더 연동하기
해당 링크를 통해 누구나 폴더에 액세스할 수 있습니다: https://drive.google.com/drive/folders/1k6FmkVglFsdtJG4MTIK-2dk1Dk9gTPtu?usp=share_link
이 폴더를 본인 Google Drive의 적절한 위치에 연동하려면:
Google Drive에서 "공유 문서함"으로 이동합니다.
액세스하려는 공유 폴더를 찾습니다.
"정리" -> "바로가기 추가"를 선택합니다.
대상 위치로 "내 드라이브"를 선택하고 "추가"를 클릭합니다.
이제 이 폴더는 /content/drive/MyDrive/TwelveLabs-Chroma 경로로 접근이 가능합니다.
드라이브 마운트
여기서 본인의 드라이브를 이 Colab에 마운트합니다.
from google.colab import drive drive.mount('/content/drive')
비디오 경로 설정
그 다음 우리가 작업할 비디오의 경로를 설정합니다. 이 경로는 비디오 폴더를 연동한 위치에 따라 달라질 수 있습니다.
video_folder_path = "/content/drive/MyDrive/TwelveLabs-Chroma/videos/"
비디오 해상도 업스케일링
일부 비디오는 임베딩 엔진에서 사용하기에 해상도가 너무 낮기 때문에, upscale_video 함수를 사용해 해상도를 두 배로 늘려줍니다.
import numpy as np import subprocess import os def upscale_video(input_file, output_path, target_width=854, target_height=480): output_file = os.path.join(output_path, os.path.basename(input_file)) if os.path.exists(output_file): print(f"Skipping {input_file} as {output_file} already exists.") return """ Upscale a video to the target width and height using FFmpeg. Args: input_file (str): Path to the input video file. output_file (str): Path to save the upscaled video. target_width (int): Desired output width. Default is 854. target_height (int): Desired output height. Default is 480. """ # FFmpeg command to upscale the video ffmpeg_command = [ 'ffmpeg', '-i', input_file, # Input file '-vf', f'scale={target_width}:{target_height}', # Scale filter with target dimensions '-c:a', 'copy', # Copy audio stream without re-encoding output_file, # Output file "-y" ] # Run the FFmpeg command subprocess.run(ffmpeg_command) print(f"Upscaled video saved to {output_file}")
먼저, 업스케일링된 비디오를 저장할 경로를 생성합니다.
upscaled_video_dir = video_folder_path + "upscaled_videos/"
그 다음 비디오 해상도를 업스케일링합니다. 이미 업스케일링을 완료하여 폴더에 저장된 비디오는 건너뜁니다.
# Upscale all .mp4 videos # Create output directory if it doesn't exist if not os.path.exists(upscaled_video_dir): os.makedirs(upscaled_video_dir) # Iterate over all files in the raw video directory for filename in os.listdir(video_folder_path): # Check if the file is a video file input_filepath = os.path.join(video_folder_path, filename) if filename.endswith(".mp4"): upscale_video(input_filepath, upscaled_video_dir)
# Output ... Upscaled video saved to ../videos/upscaled_videos/How To Make Birria Tacos [4nIFJFgH99w].mp4 ... Upscaled video saved to ../videos/upscaled_videos/How To Make a McDonald's Cheeseburger [SvOx7tA_Cv8].mp4 ... Upscaled video saved to ../videos/upscaled_videos/How To Make Potato Wedges [eZXbMWPJkKQ]
4 - TwelveLabs Marengo 엔진을 사용한 비디오 임베딩 생성
여기서는 비디오 임베딩을 생성하기 위해 TwelveLabs Marengo 엔진을 사용할 것입니다.
우선 TwelveLabs API 키를 불러오는 것부터 시작하겠습니다. 이 키는 Colab 좌측 패널의




