파트너십

멀티모달 AI 마스터하기: Twelve Labs와 Databricks Mosaic AI를 활용한 고급 비디오 이해

제임스 러

이 가이드는 개발자들이 Twelve Labs의 Embed API를 Databricks Mosaic AI Vector Search와 통합하여 유사성 검색 및 추천 시스템을 포함한 고도화된 비디오 이해 애플리케이션을 구축하는 방법을 안내합니다. 아울러 성능 최적화, 확장성, 그리고 모니터링 시 고려해야 할 사항들도 함께 다룹니다.

이 가이드는 개발자들이 Twelve Labs의 Embed API를 Databricks Mosaic AI Vector Search와 통합하여 유사성 검색 및 추천 시스템을 포함한 고도화된 비디오 이해 애플리케이션을 구축하는 방법을 안내합니다. 아울러 성능 최적화, 확장성, 그리고 모니터링 시 고려해야 할 사항들도 함께 다룹니다.

목차

No headings found on page

뉴스레터 구독하기

뉴스레터 구독하기

영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.

영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.

AI로 영상을 검색하고, 분석하고, 탐색하세요.

2024. 8. 30.

14분

링크 복사하기

요약

Twelve Labs의 Embed API를 사용하면 개발자는 멀티모달 임베딩을 생성하여 시맨틱 비디오 검색, 데이터 큐레이션부터 콘텐츠 추천 및 비디오 RAG 시스템에 이르기까지 고급 비디오 이해 사용 사례를 구현할 수 있습니다.

Twelve Labs를 사용하면 비디오 내의 시각적 표현, 바디 랭귀지, 음성 언어 및 전반적인 맥락 간의 관계를 포착하는 문맥상 벡터 표현을 생성할 수 있습니다. Databricks Mosaic AI Vector Search는 고차원 벡터를 인덱싱하고 쿼리하기 위한 강력하고 확장 가능한 인프라를 제공합니다.

이 블로그 게시물에서는 이러한 상호 보완적인 기술을 활용하여 비디오 AI 애플리케이션의 새로운 가능성을 열어가는 방법을 안내합니다.

이 튜토리얼을 위해 함께 협업해 주신 Databricks의 Nina Williams님, Austin Zaccor님, Fernanda Heredia님, 그리고 Emily Hutson님께 깊은 감사를 드립니다!

왜 Twelve Labs + Databricks Mosaic AI인가요?

Twelve Labs Embed API와 Databricks Mosaic AI Vector Search의 통합은 대규모 비디오 데이터 세트의 효율적인 처리 및 정확한 멀티모달 콘텐츠 표현과 같은 비디오 AI의 핵심 과제를 해결합니다. 이 통합은 고급 비디오 애플리케이션의 개발 시간과 리소스 요구 사항을 줄여주며, 방대한 비디오 라이브러리 전체에서 복잡한 쿼리를 가능하게 하고 전반적인 워크플로우 효율성을 높여줍니다.

멀티모달 데이터를 처리하는 이 통합된 접근 방식은 특히 주목할 만합니다. 텍스트, 이미지, 오디오 분석을 위해 별도의 모델을 번거롭게 다룰 필요 없이, 이제 사용자는 비디오 콘텐츠의 본질을 온전히 포착하는 단일하고 일관된 표현으로 작업할 수 있습니다. 이는 배포 아키텍처를 단순화할 뿐만 아니라 정교한 콘텐츠 추천 시스템부터 고급 비디오 검색 엔진 및 자동 콘텐츠 중재 도구에 이르기까지 더 미묘하고 문맥을 인식하는 애플리케이션을 가능하게 합니다.

또한, 이 통합은 Databricks 에코시스템의 기능을 확장하여 기존 데이터 파이프라인 및 머신러닝 워크플로우에 비디오 이해 기능을 원활하게 통합할 수 있도록 지원합니다. 기업이 실시간 비디오 분석을 개발하든, 대규모 콘텐츠 분류 시스템을 구축하든, 생성형 AI의 새로운 애플리케이션을 탐색하든 이 결합된 솔루션은 강력한 기반을 제공합니다. 이는 비디오 AI의 한계를 넓혀 미디어 및 엔터테인먼트에서 보안, 의료에 이르는 다양한 산업에서 혁신과 문제 해결을 위한 새로운 길을 열어줍니다.

Twelve Labs Embed API 이해하기

Twelve Labs의 Embed API는 비디오 콘텐츠를 위해 특별히 설계된 멀티모달 임베딩 기술의 비약적인 발전을 보여줍니다. 프레임별 분석이나 모달리티별 별도 모델에 의존하는 기존 방식과 달리, 이 API는 비디오 내의 시각적 표현, 바디 랭귀지, 음성 언어 및 전반적인 맥락의 복잡한 상호 작용을 포착하는 문맥상 벡터 표현을 생성합니다. 이는 Twelve Labs의 최첨대 멀티모달 파운데이션 모델인 Marengo-2.6을 기반으로 합니다.



Embed API는 비디오 데이터를 다루는 AI 엔지니어에게 특히 유용한 몇 가지 핵심 기능을 제공합니다. 첫째, 비디오에 존재하는 모든 모달리티에 대한 유연성을 제공하므로 별도의 텍스트 전용 또는 이미지 전용 모델이 필요하지 않습니다. 둘째, 움직임, 동작 및 시간적 정보를 고려하는 비디오 네이티브 접근 방식을 사용하여 비디오 콘텐츠에 대한 보다 정확하고 시간적으로 일관된 해석을 보장합니다. 마지막으로, 모든 모달리티의 임베딩을 통합하는 단일화된 벡터 공간을 생성하여 비디오 콘텐츠에 대한 보다 포괄적인 이해를 돕습니다.

AI 엔지니어에게 Embed API는 비디오 이해 작업에서 새로운 가능성을 열어줍니다. 보다 정교한 콘텐츠 분석, 개선된 시맨틱 검색 기능, 그리고 강화된 추천 시스템을 가능하게 합니다. 시간이 지남에 따라 서로 다른 모달리티 간의 미묘한 신호와 상호 작용을 포착하는 API의 능력을 통해 감정 인식, 맥락 인식 콘텐츠 중재, 고급 비디오 검색 시스템처럼 미묘한 이해가 필요한 애플리케이션에서 특히 유용하게 사용됩니다.

사전 요구 사항

Twelve Labs Embed API를 Databricks Mosaic AI Vector Search와 통합하기 전에 다음 요구 사항을 갖추었는지 확인하세요.

  1. 워크스페이스를 생성하고 관리할 수 있는 권한이 있는 Databricks 계정 (여기에서 무료 평가판에 가입할 수 있습니다: https://databricks.com/try-databricks)

  2. Python 프로그래밍 및 기본적인 데이터 과학 개념에 대한 이해

  3. Twelve Labs API 키 (가입처: playground.twelvelabs.io)

  4. 벡터 임베딩 및 유사도 검색 개념에 대한 기본 이해

  5. (선택 사항) AWS에서 Databricks를 사용하는 경우 AWS 계정. Azure 또는 Google Cloud에서 Databricks를 사용하는 경우에는 필요하지 않습니다.

참고: Embed API는 현재 비공개 베타 버전이지만, 이 신청서를 작성하시면 누구나 액세스를 요청할 수 있습니다. 보통 몇 시간 이내에 Embed API 사용을 시작할 수 있다는 확인 이메일을 받게 됩니다.

1단계: 환경 설정

시작하기 위해 Databricks 환경을 설정하고 필요한 라이브러리를 설치합니다.

1 - 새 Databricks 워크스페이스 생성:

2 - 새 클러스터 생성 또는 기존 클러스터 연결:

거의 모든 ML 클러스터가 이 애플리케이션에서 작동합니다. 아래 설정은 최적의 가격 대비 성능을 원하시는 분들을 위해 제공됩니다.

  • 컴퓨팅(Compute) 탭에서 "컴퓨팅 생성(Create compute)"을 클릭합니다.

  • "단일 노드(Single node)" 및 런타임: 14.3 LTS ML non-GPU를 선택합니다.

    • 클러스터 정책 및 액세스 모드는 기본값으로 유지할 수 있습니다.

  • 노드 유형으로 "r6i.xlarge"를 선택합니다.

    • 이를 통해 메모리 활용도를 극대화하는 동시에, 할인 전 기준으로 AWS에서 시간당 단 $0.252, Databricks에서 시간당 1.02 DBU의 비용만 발생합니다.

    • 테스트 결과 가장 빠른 옵션 중 하나이기도 했습니다.

  • 기타 옵션은 모두 기본값으로 유지할 수 있습니다.

  • 하단의 "컴퓨팅 생성(Create compute)"을 클릭하고 워크스페이스로 돌아갑니다.

3 - Databricks 워크스페이스에 새 노트북 생성:

  • 워크스페이스에서 "만들기"를 클릭하고 "노트북"을 선택합니다.

  • 노트북 이름을 입력합니다 (예: "TwelveLabs_MosaicAI_VectorSearch_Integration").

  • 기본 언어로 Python을 선택합니다.

4 - Twelve Labs 및 Mosaic AI Vector Search SDK 설치:

노트북의 첫 번째 셀에서 다음 명령을 실행합니다.

%pip install twelvelabs databricks-vectorsearch

5 - Twelve Labs 인증 설정:

다음 셀에 아래 코드를 추가합니다.

from twelvelabs import TwelveLabs
import os

# Databricks secrets에서 API 키를 가져옵니다 (권장)
# 먼저 비밀 범위를 설정하고 API 키를 추가해야 합니다
TWELVE_LABS_API_KEY = dbutils.secrets.get(scope="your-scope", key="twelvelabs-api-key")

if TWELVE_LABS_API_KEY is None:
    raise ValueError("TWELVE_LABS_API_KEY environment variable is not set")

# Twelve Labs 클라이언트 초기화
twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)

참고: 보안 강화를 위해 API 키를 코드에 직접 쓰거나 환경 변수를 사용하는 대신 Databricks secrets를 사용하여 저장하는 것이 좋습니다.

2단계: 멀티모달 임베딩 생성

제공된 generate_embedding 함수를 사용하여 Twelve Labs Embed API를 통해 멀티모달 임베딩을 생성합니다. 이 함수는 Databricks에서 Spark DataFrame과 효율적으로 작동하도록 Pandas UDF(사용자 정의 함수)로 설계되었습니다. 임베딩 작업 생성, 진행 상태 모니터링 및 결과 검색 프로세스가 포함되어 있습니다.

그 다음, 비디오 URL을 문자열 입력으로 받아 Twelve Labs Embed API에 래퍼 호출을 호출하고 array<float>을 반환하는 process_url 함수를 생성합니다.

구현 및 사용 방법은 다음과 같습니다.

UDF 정의:

from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import ArrayType, FloatType
from twelvelabs.models.embed import EmbeddingsTask
import pandas as pd

@pandas_udf(ArrayType(FloatType()))
def get_video_embeddings(urls: pd.Series) -> pd.Series:
    def generate_embedding(video_url):
        twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)
        task = twelvelabs_client.embed.task.create(
            engine_name="Marengo-retrieval-2.6",
            video_url=video_url
        )
        task.wait_for_done()
        task_result = twelvelabs_client.embed.task.retrieve(task.id)
        embeddings = []
        for v in task_result.video_embeddings:
            embeddings.append({
                'embedding': v.embedding.float,
                'start_offset_sec': v.start_offset_sec,
                'end_offset_sec': v.end_offset_sec,
                'embedding_scope': v.embedding_scope
            })
        return embeddings

    def process_url(url):
        embeddings = generate_embedding(url)
        return embeddings[0]['embedding'] if embeddings else None

    return urls.apply(process_url)

비디오 URL을 포함한 샘플 DataFrame 생성:

video_urls = [
    "https://example.com/video1.mp4",
    "https://example.com/video2.mp4",
    "https://example.com/video3.mp4"
]
df = spark.createDataFrame([(url,) for url in video_urls], ["video_url"])

임베딩 생성을 위해 UDF 적용:

df_with_embeddings = df.withColumn("embedding", get_video_embeddings(df.video_url))

결과 출력:

df_with_embeddings.show(truncate=False)

이 프로세스는 DataFrame의 각 비디오 URL에 대해 시각, 청각 및 텍스트 정보를 포함하여 비디오 콘텐츠의 멀티모달적 본질을 포착하는 멀티모달 임베딩을 생성합니다.

대규모 비디오 데이터 세트의 임베딩 생성은 리소스 연산량이 크고 시간이 많이 소요될 수 있습니다. 대화형 배포 규모의 애플리케이션의 경우 배치 처리나 분산 처리 전략을 도입하는 것이 좋습니다. 또한 발생할 수 있는 API 오류나 네트워크 문제를 해결할 수 있는 적절한 예외 처리 및 로깅을 구성해야 합니다.

3단계: 비디오 임베딩용 Delta Table 생성

이제 Twelve Labs Embed API에서 생성된 비디오 메타데이터 및 임베딩을 저장할 소스 Delta Table을 생성합니다. 이 테이블은 Databricks Mosaic AI Vector Search에서 Vector Search 인덱스의 기반 역할을 합니다.

먼저 비디오 URL 및 메타데이터를 포함한 소스 DataFrame을 생성합니다.

from pyspark.sql import Row

# Create a list of sample video URLs and metadata
video_data = [
Row(url='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4', title='Elephant Dream'), 

Row(url='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4', title='Sintel'),

Row(url='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4', title='Big Buck Bunny')
]

# Create a DataFrame from the list
source_df = spark.createDataFrame(video_data)
source_df.show()

그 다음, SQL을 사용하여 Delta table 스키마를 선언합니다.

%sql
CREATE TABLE IF NOT EXISTS videos_source_embeddings (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY,
  url STRING,
  title STRING,
  embedding ARRAY<FLOAT>
) TBLPROPERTIES (delta.enableChangeDataFeed = true)

Vector Search 인덱스를 생성하고 유지 관리하는 데 중요한 변경 데이터 피드(Change Data Feed)가 테이블에서 활성화되어 있는지 확인합니다.

이제 전 단계에서 정의한 get_video_embeddings 함수를 사용하여 비디오의 임베딩을 생성합니다.

embeddings_df = source_df.withColumn("embedding", get_video_embeddings("url"))

비디오 개수 및 길이에 따라 이 단계는 다소 시간이 걸릴 수 있습니다.

임베딩이 생성되면 이제 해당 데이터를 Delta Table에 저장할 수 있습니다.

embeddings_df.write.mode("append").saveAsTable("videos_source_embeddings")

마지막으로, 임베딩된 DataFrame을 출력하여 데이터를 확인합니다.

display(embeddings_df)

이 단계는 오프라인에서 Vector Search를 지원하기 위한 견고한 기반을 만듭니다. Delta Table은 Vector Search 인덱스와 자동으로 일치 상태를 유지하므로 비디오 데이터셋에 대한 업데이트나 추가 사항이 항상 검색 결과에 반영됩니다.

유지해 두어야 할 주요 사항:

  • id 열은 자동으로 생성되어 각 비디오의 고유 식별자 역할을 합니다.

  • embedding 열에는 Twelve Labs Embed API를 통해 생성된 각 비디오의 고차원 벡터 표현이 저장됩니다.

  • 변경 데이터 피드(Change Data Feed)를 활성화하면 Databricks가 테이블 변경 사항을 효율적으로 추적할 수 있어 항상 최신 상태의 Vector Search 인덱스를 유지하는 데 매우 중요합니다.

4단계: Mosaic AI Vector Search 설정

이 단계에서는 Databricks Mosaic AI Vector Search가 비디오 임베딩과 원활히 작동하도록 수동으로 구성해 봅니다. 이 구성에는 생성한 videos_source_embeddings Delta 테이블과 지속해서 유기적으로 일치하는 Vector Search 엔드포인트 및 Delta Sync Index 생성이 포함되어 있습니다.

먼저 Vector Search 엔드포인트를 생성합니다.

from databricks.vector_search.client import VectorSearchClient

# Initialize the Vector Search client and name the endpoint
mosaic_client = VectorSearchClient()
endpoint_name = "twelve_labs_video_endpoint"

# Delete the existing endpoint if it exists
try:
    mosaic_client.delete_endpoint(endpoint_name)
    print(f"Deleted existing endpoint: {endpoint_name}")
except Exception:
    pass  # Ignore non-existing endpoints

# Create the new endpoint
endpoint = mosaic_client.create_endpoint(
    name=endpoint_name,
    endpoint_type="STANDARD"
)

이 코드는 새 Vector Search 엔드포인트를 생성하거나 동일한 이름의 기존 엔드포인트를 대체합니다. 이 엔드포인트는 Vector Search 작업의 액세스 포인트 역할을 담당합니다.

다음으로, 소스 Delta 테이블인 videos_source_embeddings와 자동으로 완벽히 동기화 상태를 유지할 Delta Sync Index를 생성합니다.

# Define the source table name and index name
source_table_name = "twelvelabs.default.videos_source_embeddings"
index_name = "twelvelabs.default.video_embeddings_index"

index = mosaic_client.create_delta_sync_index(
    endpoint_name="twelve_labs_video_endpoint",
    source_table_name=source_table_name,
    index_name=index_name,
    primary_key="id",
    embedding_dimension=1024,
    embedding_vector_column="embedding",
    pipeline_type="TRIGGERED"
)

print(f"Created index: {index.name}")

이 코드는 원래의 소스 Delta 테이블에 연결되는 Delta Sync Index를 생성합니다. 소스 테이블에 변경 사항이 있을 때 바로 몇 초 이내에 인덱스가 동적으로 업데이트되도록 하려면(즉, Vector Search 결과가 항상 최신 상태를 유지하게 하려면) pipeline_type="CONTINUOUS"로 설정하세요.

인덱스가 성공적으로 생성되었고 바르게 동기화되고 있는지 검사하려면, 다음 코드를 사용하여 동기화를 강제로 실행해 봅니다.

# Check the status of the index; this may take some time
index_status = mosaic_client.get_index(
    endpoint_name="twelve_labs_video_endpoint",
    index_name="twelvelabs.default.video_embeddings_index"
)
print(f"Index status: {index_status}")

# Manually trigger the index sync
try:
    index.sync()
    print("Index sync triggered successfully.")
except Exception as e:
    print(f"Error triggering index sync: {str(e)}")

이 코드를 통해 인덱스의 상태를 체크하고 필요한 경우 수동 동기화를 실행할 수 있습니다. 상용 환경에서는 변경된 소스 Delta 테이블 사항에 따라 파이프라인이 자동 동기화하도록 구성하는 방식이 더 일반적입니다.

요약해 둘 핵심 사항:

  1. Vector Search 엔드포인트는 Vector Search 작업을 수행할 때 입구 역할을 수행합니다.

  2. Delta Sync Index는 원래 소스 Delta 테이블의 상태를 지속해서 반영하여 항상 최신화된 임베딩 검색 결과를 유지합니다.

  3. embedding_dimension은 Twelve Labs Embed API가 생성한 임베딩 차원수(1024)와 일치해야 합니다.

  4. primary_key는 소스 테이블의 고유 ID 식별자인 "id"로 정의합니다.

  5. embedding_vector_column은 비디오 임베딩 벡터가 저장된 소스 테이블의 실제 열 이름인 "embedding"으로 지정합니다.

5단계: 유사도 검색 구현

다음 단계는 수립된 Mosaic AI Vector Search 인덱스와 Twelve Labs Embed API를 결합하여 임베딩 유사도 검색을 실제로 개발하는 것입니다. 멀티모달 임베딩의 높은 차원 표현력을 사용해 사용자가 준 자연어 문장 텍스트 쿼리와 가장 연관 있는 비디오를 찾습니다.

먼저 Twelve Labs Embed API를 사용해 입력 텍스트 쿼리의 임베딩 벡터를 구하는 임포트용 헬퍼 함수를 선언합니다.

def get_text_embedding(text_query):
    # Twelve Labs Embed API supports text-to-embedding
    text_embedding = twelvelabs_client.embed.create(
      engine_name="Marengo-retrieval-2.6",
      text=text_query,
      text_truncate="start"
    )

    return text_embedding.text_embedding.float

이 함수는 텍스트 쿼리를 입력받고 비디오 임베딩과 연산 호환성이 맞도록 비디오 임베딩에 사용된 것과 일치하는 마렝고(Marengo) 모델로 임베딩을 구성하여 반환합니다.

이어서 실제 유사도 검색을 수행할 메인 코드를 배치합니다.

def similarity_search(query_text, num_results=5):
    # Initialize the Vector Search client and get the query embedding
    mosaic_client = VectorSearchClient()
    query_embedding = get_text_embedding(query_text)

    print(f"Query embedding generated: {len(query_embedding)} dimensions")

    # Perform the similarity search
    results = index.similarity_search(
        query_vector=query_embedding,
        num_results=num_results,
        columns=["id", "url", "title"]
    )
    return results

이 함수는 검색 질의어와 최종적으로 가져올 검색 결과 한도를 매개변수로 사용합니다. 받아온 검색 문맥 벡터를 바탕으로 Mosaic AI Vector Search 인덱스를 조회하여 유사도가 가장 높은 비디오 레코드를 모아 리턴해 줍니다.

원시 검색 출력 결과를 적절한 출력 딕셔너리로 다듬을 파서 도구 함수를 정의합니다.

def parse_search_results(raw_results):
    try:
        data_array = raw_results['result']['data_array']
        columns = [col['name'] for col in raw_results['manifest']['columns']]
        return [dict(zip(columns, row)) for row in data_array]
    except KeyError:
        print("Unexpected result format:", raw_results)
        return []

이제 조각된 로직을 결합해 "A dragon" 검색을 기동시키는 실행 테스트를 돌려 봅니다.

# Example usage
query = "A dragon"
raw_results = similarity_search(query)

# Parse and print the search results
search_results = parse_search_results(raw_results)
if search_results:
    print(f"Top {len(search_results)} videos similar to the query: '{query}'")
    for i, result in enumerate(search_results, 1):
        print(f"{i}. Title: {result.get('title', 'N/A')}, URL: {result.get('url', 'N/A')}, Similarity Score: {result.get('score', 'N/A')}")
else:
    print("No valid search results returned.")

해당 파트는 "A dragon" 쿼리를 유사도 기반으로 해석하여 어울리는 비디오 목록을 탐색하고 이쁘게 포맷 정리하여 콘솔에 뿌리는 작동 방식의 모범 예를 제공합니다.

이 파트에서 주요하게 볼 요인:

  1. get_text_embedding는 비디오용 임베딩 생성 시 활용했던 것과 대칭되는 물리 모델을 채택해 다차원 벡터를 추출해 내어야 무결한 검색 매핑이 일어납니다.

  2. similarity_search는 문장 입력, 그것의 고차원 수치 전환 그리고 연이은 인덱스 검색 단계를 유기적으로 이어 줍니다.

  3. 네트워크 렉이나 제반 API 변동 상황을 감쇠할 예외 로직 구축은 실제 빌드 단계에서 고도로 중요합니다.

  4. parse_search_results는 리턴 포맷 파싱을 간편하게 해 줍니다.

  5. 사용 목적에 맞게 num_results 값을 유동적으로 변경해 검색 바운더리를 설계할 수 있습니다.

이를 통해 사용자는 Twelve Labs의 정밀한 정보 굴착 벡터 위에서 자연어 형식의 조건으로 방대한 전사 비디오 보관소를 의미론적으로 검색(Semantic Search)하는 세련된 서비스를 완성할 수 있습니다.

6단계: 비디오 추천 시스템 제작하기

단순 검색을 넘어, 특정 비디오와 멀티모달 측면에서 깊이 있는 유사점을 공유하는 비디오를 연관 배치하기 위한 추천 엔진을 만들어 봅니다.

비디오 추천의 핵심 구조를 기술해 봅니다.

def get_video_recommendations(video_id, num_recommendations=5):
    # Initialize the Vector Search client
    mosaic_client = VectorSearchClient()

    # First, retrieve the embedding for the given video_id
    source_df = spark.table("videos_source_embeddings")
    video_embedding = source_df.filter(f"id = {video_id}").select("embedding").first()

    if not video_embedding:
        print(f"No video found with id: {video_id}")
        return []

    # Perform similarity search using the video's embedding
    try:
        results = index.similarity_search(
            query_vector=video_embedding["embedding"],
            num_results=num_recommendations + 1,  # +1 to account for the input video
            columns=["id", "url", "title"]
        )
        
        # Parse the results
        recommendations = parse_search_results(results)
        
        # Remove the input video from recommendations if present
        recommendations = [r for r in recommendations if r.get('id') != video_id]
        
        return recommendations[:num_recommendations]
    except Exception as e:
        print(f"Error during recommendation: {e}")
        return []

# Helper function to display recommendations
def display_recommendations(recommendations):
    if recommendations:
        print(f"Top {len(recommendations)} recommended videos:")
        for i, video in enumerate(recommendations, 1):
            print(f"{i}. Title: {video.get('title', 'N/A')}")
            print(f"   URL: {video.get('url', 'N/A')}")
            print(f"   Similarity Score: {video.get('score', 'N/A')}")
            print()
    else:
        print("No recommendations found.")

# Example usage
video_id = 1  # Assuming this is a valid video ID in your dataset
recommendations = get_video_recommendations(video_id)
display_recommendations(recommendations)

이 파트는 아래 단계를 통해 추천 절차를 마칩니다.

  1. get_video_recommendations를 호출하여 타겟 비디오 ID와 반환 제항 개수를 명시합니다.

  2. 지정 타겟 비디오의 생성 완료된 고유 임베딩 정보를 소스 테이블에서 풀링합니다.

  3. 풀링한 대조 모델 임베딩 벡터로 연관도가 가장 상응하는 비디오 리스트를 인덱싱 쿼리합니다.

  4. 대상 오리지널 비디오 자체가 추천 최상위에 표출되는 상황을 로직 필터로 거르고 필터 아웃합니다.

  5. display_recommendations가 반환값의 서식을 정리하여 표시를 출력합니다.

해당 추천을 연동 실행하기에 앞서:

  1. 소스 DB 테이블(videos_source_embeddings) 내부에 실 테스트할 비디오 정보 및 유효 임베딩들이 완전한 상태로 기록 설계되어 있는지 점검합니다.

  2. 특정 대상 비디오 번호를 넣어 추천 함수 get_video_recommendations를 테스트 기동합니다.

  3. 작동이 성공적으로 끝나면 추천된 연관 매칭 리스트를 육안으로 대조 확인할 수 있습니다.

이 기본 추천 시스템은 멀티모달 임베딩을 통해 콘텐츠 기반의 깊이 있는 연관도 추천을 수행해 주며, 향후 다음 방식으로 개량할 수 있습니다.


  • 사용자 성향 및 이전 메인 재생 이력 메트릭을 교차 피팅해 완성 단계의 개인화 추천으로 디벨롭합니다.

  • 과도하게 치우친 콘텐츠 도출을 없앨 수 있도록 필터 및 다각화 메커니즘을 연계 가미합니다.

  • 정적 메타데이터(예: 카테고리, 특정 아티스트, 러닝타임) 하단 필터 장치를 구축합시다.

  • 호출 빈도가 빈번한 항목은 데이터 캐싱 처리 파이프라인을 두어 실행 지연(Latency)을 단축합니다.


기본적으로 추천 마일스톤의 실제 정합도는 전체 라이브러리의 사이즈뿐만 아니라 Twelve Labs Embed API의 분석 능력 설계도와 비례합니다. 신규 비디오 업데이트에 맞추어 점차 추천 성능의 연상 연결성 수준이 더욱 명확히 업그레이드됨을 알 수 있습니다.

통합 인프라를 다음 단계로 확장하기

인덱스 비디오 라이브러리 스마트 동기화 및 갱신관리

시스템의 전체 누적 비디오 보관 볼륨 자체가 확대될수록, 실시간 서치에 기여하는 벡터 인덱스의 지속적 업데이트 주기가 중요도를 더하게 됩니다. Mosaic AI Vector Search는 원본 Delta 테이블 변화에 동기화 처리를 지능적으로 엮어내어 최신 추천 정량도를 상시 보전해 줍니다.

안정적 동기화 구축을 위한 주요 아키텍처 가이드라인:

  1. 증분 데이터 변경 처리(Incremental updates): Delta Lake의 Change Data Feed 옵션을 써서 전체 테이블을 다시 빌드하지 않고 수시로 갱신 또는 추가된 내용량만 알짜로 수집 및 인덱싱합니다.

  2. 스케줄 동기화: Databricks의 스케줄러 오케스트레이션 구동 장치로 정규 가동 부하가 낮은 주기를 설정해 백그라운드에서 주기적으로 정리 배치 동기화를 가동합니다.

  3. 실시간 업데이트 파이프라인: 실시간 추천이 절실한 비즈니스 요건이면, Databricks Mosaic AI의 스트리밍 기술을 도입해 실시간으로 데이터 밀집 작업을 순차 반영시킵니다.

  4. 버전 롤백 관리: Delta Lake 안의 시간 여행(Time-travel) 추적을 활용해 이전 벡터 상태 히스토리를 버전별 백업 보전해 유사시 스냅백 복원을 가능하게 만듭니다.

  5. 동기화 예찰 모니터링: 전체 싱크 주기 로그 수집기를 연계 구축하여 동기 상태 이상 감지 시 신속하게 복구 피드백을 전달할 알림 장치를 가미합니다.

이러한 운영 체계를 바탕으로 구성하면 축적 완료된 Twelve Labs 비디오 임베딩이 실 지체 없이 상시 동적 조율 상태를 뽐내며 강력함을 온전히 발산할 수 있습니다.

스케일 아웃 및 연산 최적화 공정

수백만 단위를 초과하는 대규모 비디오 분석 라이브러리를 가공해야 하는 비즈니스 볼륨에 다다르면 스케일 확장과 지연 시간 방어 최적화 영역이 최고 난제가 됩니다. Databricks가 선사하는 유연한 분산 클러스터 컴퓨팅과 Twelve Labs의 압도적인 초고속 분산 멀티모달 프레임 처리를 가미해 초대형 스케일 인프라를 지탱합니다.

이를 위해 추천 전술:

  1. 분산 파티션 병렬 연산: Databricks Spark 런타임 클러스터 모델 아키텍처하에 대용량 임베딩 생성 명령을 다중 분할 워커 노드별 파티션 덩어리로 조각내어 한 번에 병렬 연산해 줍니다.

  2. 전략적 캐시 정책: 누적 조회 수가 눈에 띄게 두드러지는 최정상 비디오 콘텐츠 임베딩 소스는 빠른 메모리 적재 영역에 할당 캐싱하여 불필요한 API 연산 단계를 크게 차단해 줍니다.

  3. 스마트 배치 세그먼트: 비업무 시간대에 자동 스케줄러로 대용량 변경분 임베딩 마이그레이션 백체 작업을 연대 처리하는 배치 인프라를 조성해 비용 로드를 주도적으로 경감합니다.

  4. 서치 쿼리 옵티마이징: 최적 효율 도출을 하도록 num_results 조절뿐 아니라, 전처리 스키마 필터링(Pre-filtering) 장치를 인가해 매칭 후보군 벡터 매치 모수를 쾌적하게 좁혀 나갑니다.

  5. 인덱스 샤딩/파티셔닝: 거대한 벡터 세그먼트는 내부 기준 키값에 따라 인덱스 파티셔닝 전략을 심어 디스크 탐색 세션을 가속 시켜 줍니다.

  6. 오토스케일링 분산 컴퓨팅: 수량 집중 등 가중 요인이 터질 시에 분산 워커 파워를 지능 단위로 가감하는 클러스터 오토스케일링 요소를 구성합니다.

  7. 엣지(Edge) 지향 하이브리드 연계: 레이턴시 극강 제어가 소모되는 모바일이나 특수 IoT 전단 인터페이스일 경우 엣지단 스마트 분배 전개 구도를 함께 설계합니다.

성공적으로 스케일링 전개 작업을 결합함으로써 인프라 부하 폭주 현상을 억제하며 늘어나는 대용량 요청을 미끄러지듯 유연하게 소화하는 견인력을 가꾸게 됩니다.

모니터링 체계와 데이터 애널리틱스

운영 중인 멀티모달 비디오 지능 분류 가치 체인이 정밀히 서빙되고 있는지 장기 점검을 보장하려면 지속적 모니터링 모듈과 통계 파이프라인 정착이 필수입니다. Databricks는 전반적 시스템 추이, 사용자 질의 행동 패턴, 검색 가치 도달율 등을 종합 감시할 일체형 측정 대시보드 뷰를 지원합니다.

집중 관리해야 할 감사 관점들:

  1. 하드웨어/인프라 성능 지표: 질의 처리 완료 지연 속도(latency), 원스톱 임베딩 파이싱 실행 소요 타임, 그리고 매일의 싱크 소요 경향 곡선 데이터를 트래킹합니다.

  2. 검색 사용자 인텔리전스: 질의 사용자가 보낸 실제 문구 패턴의 빈출 키워드 특징, 중점 도달 추천 레코드 세션에 대한 유저 수용 추세를 로깅해 인사이트를 건져 냅니다.

  3. 검색 추천 정합성 측정: 클릭 스루율(CTR) 등을 감안하는 정밀 피드백 밸브 계측 수단을 정착 시켜 벡터 검색 세트가 체감상 현실적인 품질을 수렴하고 있는지 수치 품질 계측(Metrics evaluation)을 시행합니다.

  4. 서버 리소스 활용비 모니터링: 전체 클라우드 사용량과 Twelve Labs API 연성 연산 통신 회수 요율 트래디셔널 곡선을 보며 서비스가 효율적 노선 비중으로 지출되고 있는지 점사합니다.

  5. 자동 에러 파서 얼럿: 미싱 필드나 호출 예외 등으로 인한 통합 연결 크래시 조짐 포착 시 인프라 담당자에 직접 소통 수단을 태깅할 무중단 관제 트리거를 설계합니다.

  6. 동적 A/B 테스팅 수행: Databricks의 풍부한 테스트 기능들로 마렝고(Marengo) 등 타겟 임베딩 모델의 에디션 변형 시나리오 변경 대조 실험 작업을 스위칭해 가며 가장 완벽한 유저 피팅 해법을 발굴합니다.

  7. 기대 비즈니스 지표 대조: 세련된 비디오 이해 기능 배치가 순수 서비스 체류 타임이나 유저 리텐션 증대 수치, 최종 도달성 등에 어떻게 연동 성과를 견인 중인지 비즈니스 가치 증빙(Impact metrics)을 엮어 봅니다.

  8. 개인보호 및 규제 컴플라이언스: 원본 파싱 파이프라인에서 민감 정보를 지우거나 보안적 프라이버시 조항이 누수되지 않도록 데이터 유통 필터를 모니터링에 함께 정비해 줍니다.

이로써 비디오 콘텐츠 이해 시스템이 실제로 발휘해 내는 시스템적 가치 지표와 업무 임팩트를 눈으로 입증할 지표 투명성이 확보됩니다. 이러한 데이터 중심 접근은 Twelve Labs의 압도적인 최신 비디오 임베딩 자산과 Databricks 데이터 인텔리전스 플랫폼의 파워가 일으키는 통합 비즈니스 레버리지를 증명하고 솔루션을 지속 개량할 영양분이 되어 줍니다.

결론

Twelve Labs와 Databricks Mosaic AI의 동맹은 방대하고 복잡한 비디오 콘텐츠 데이터 세트에서 무궁무진한 고해상도 인사이트를 분석 및 추론할 혁신적 마스터 돌파구를 선사합니다. 이 기술 통합은 세부 멀티모달적 미학까지 짚어내는 임베딩 능력과 압도적으로 쾌적하고 신속한 Vector Search의 결합을 바탕으로, 비디오 중심의 시맨틱 검색, 추천 시스템을 더 높은 차원으로 리드해 줍니다.

본 가이드는 첫 단추인 작업 도구 인프라 배치부터 임베딩 확보, 인덱스 동기 유지 및 실 구현체로서의 유사 검색 시스템 구축에 걸쳐 실제 프로덕션 단계의 스케일 확장론까지 일목요연하게 다루었습니다.

더 정교하고 방대해지는 디지털 미디어 파이프라인 속에서 핵심 유저 기호를 통찰하고 실 비디오 내용 속성 정보를 의미 수준으로 파악해 내는 기법은 그야말로 강력한 경쟁력을 뜻합니다. 이 통합 시스템을 활용해 귀사 고유의 비즈니스 지평에 맞추어 독창적인 인공지능 비디오 가치 시스템을 펼쳐 보시기 바랍니다. 지속해서 성장하는 개방형 비디오 AI 엔지니어 생태계에서 고차원의 기여와 함께 혁신의 주역으로 발돋움해 보시기를 진심으로 격려합니다.

추가 리소스

본 통합 아키텍처에 깊이를 늘려 줄 풍부한 외부 가이드를 아래에 첨부해 둡니다.

  1. Twelve Labs 공식 문서 가이드

  2. Databricks Vector Search 상세 공식 설명서

  3. Databricks 커뮤니티 토론 포럼

  4. Twelve Labs 디스코드 글로벌 개발자 커뮤니티

이 유용한 지식 자원들과 소통 네트워크를 바탕으로 매주 달라지는 초연결 비디오 AI 기술 진화의 최전선에서 Twelve Labs와 Databricks의 능력을 온전히 누려 보세요.

요약

Twelve Labs의 Embed API를 사용하면 개발자는 멀티모달 임베딩을 생성하여 시맨틱 비디오 검색, 데이터 큐레이션부터 콘텐츠 추천 및 비디오 RAG 시스템에 이르기까지 고급 비디오 이해 사용 사례를 구현할 수 있습니다.

Twelve Labs를 사용하면 비디오 내의 시각적 표현, 바디 랭귀지, 음성 언어 및 전반적인 맥락 간의 관계를 포착하는 문맥상 벡터 표현을 생성할 수 있습니다. Databricks Mosaic AI Vector Search는 고차원 벡터를 인덱싱하고 쿼리하기 위한 강력하고 확장 가능한 인프라를 제공합니다.

이 블로그 게시물에서는 이러한 상호 보완적인 기술을 활용하여 비디오 AI 애플리케이션의 새로운 가능성을 열어가는 방법을 안내합니다.

이 튜토리얼을 위해 함께 협업해 주신 Databricks의 Nina Williams님, Austin Zaccor님, Fernanda Heredia님, 그리고 Emily Hutson님께 깊은 감사를 드립니다!

왜 Twelve Labs + Databricks Mosaic AI인가요?

Twelve Labs Embed API와 Databricks Mosaic AI Vector Search의 통합은 대규모 비디오 데이터 세트의 효율적인 처리 및 정확한 멀티모달 콘텐츠 표현과 같은 비디오 AI의 핵심 과제를 해결합니다. 이 통합은 고급 비디오 애플리케이션의 개발 시간과 리소스 요구 사항을 줄여주며, 방대한 비디오 라이브러리 전체에서 복잡한 쿼리를 가능하게 하고 전반적인 워크플로우 효율성을 높여줍니다.

멀티모달 데이터를 처리하는 이 통합된 접근 방식은 특히 주목할 만합니다. 텍스트, 이미지, 오디오 분석을 위해 별도의 모델을 번거롭게 다룰 필요 없이, 이제 사용자는 비디오 콘텐츠의 본질을 온전히 포착하는 단일하고 일관된 표현으로 작업할 수 있습니다. 이는 배포 아키텍처를 단순화할 뿐만 아니라 정교한 콘텐츠 추천 시스템부터 고급 비디오 검색 엔진 및 자동 콘텐츠 중재 도구에 이르기까지 더 미묘하고 문맥을 인식하는 애플리케이션을 가능하게 합니다.

또한, 이 통합은 Databricks 에코시스템의 기능을 확장하여 기존 데이터 파이프라인 및 머신러닝 워크플로우에 비디오 이해 기능을 원활하게 통합할 수 있도록 지원합니다. 기업이 실시간 비디오 분석을 개발하든, 대규모 콘텐츠 분류 시스템을 구축하든, 생성형 AI의 새로운 애플리케이션을 탐색하든 이 결합된 솔루션은 강력한 기반을 제공합니다. 이는 비디오 AI의 한계를 넓혀 미디어 및 엔터테인먼트에서 보안, 의료에 이르는 다양한 산업에서 혁신과 문제 해결을 위한 새로운 길을 열어줍니다.

Twelve Labs Embed API 이해하기

Twelve Labs의 Embed API는 비디오 콘텐츠를 위해 특별히 설계된 멀티모달 임베딩 기술의 비약적인 발전을 보여줍니다. 프레임별 분석이나 모달리티별 별도 모델에 의존하는 기존 방식과 달리, 이 API는 비디오 내의 시각적 표현, 바디 랭귀지, 음성 언어 및 전반적인 맥락의 복잡한 상호 작용을 포착하는 문맥상 벡터 표현을 생성합니다. 이는 Twelve Labs의 최첨대 멀티모달 파운데이션 모델인 Marengo-2.6을 기반으로 합니다.



Embed API는 비디오 데이터를 다루는 AI 엔지니어에게 특히 유용한 몇 가지 핵심 기능을 제공합니다. 첫째, 비디오에 존재하는 모든 모달리티에 대한 유연성을 제공하므로 별도의 텍스트 전용 또는 이미지 전용 모델이 필요하지 않습니다. 둘째, 움직임, 동작 및 시간적 정보를 고려하는 비디오 네이티브 접근 방식을 사용하여 비디오 콘텐츠에 대한 보다 정확하고 시간적으로 일관된 해석을 보장합니다. 마지막으로, 모든 모달리티의 임베딩을 통합하는 단일화된 벡터 공간을 생성하여 비디오 콘텐츠에 대한 보다 포괄적인 이해를 돕습니다.

AI 엔지니어에게 Embed API는 비디오 이해 작업에서 새로운 가능성을 열어줍니다. 보다 정교한 콘텐츠 분석, 개선된 시맨틱 검색 기능, 그리고 강화된 추천 시스템을 가능하게 합니다. 시간이 지남에 따라 서로 다른 모달리티 간의 미묘한 신호와 상호 작용을 포착하는 API의 능력을 통해 감정 인식, 맥락 인식 콘텐츠 중재, 고급 비디오 검색 시스템처럼 미묘한 이해가 필요한 애플리케이션에서 특히 유용하게 사용됩니다.

사전 요구 사항

Twelve Labs Embed API를 Databricks Mosaic AI Vector Search와 통합하기 전에 다음 요구 사항을 갖추었는지 확인하세요.

  1. 워크스페이스를 생성하고 관리할 수 있는 권한이 있는 Databricks 계정 (여기에서 무료 평가판에 가입할 수 있습니다: https://databricks.com/try-databricks)

  2. Python 프로그래밍 및 기본적인 데이터 과학 개념에 대한 이해

  3. Twelve Labs API 키 (가입처: playground.twelvelabs.io)

  4. 벡터 임베딩 및 유사도 검색 개념에 대한 기본 이해

  5. (선택 사항) AWS에서 Databricks를 사용하는 경우 AWS 계정. Azure 또는 Google Cloud에서 Databricks를 사용하는 경우에는 필요하지 않습니다.

참고: Embed API는 현재 비공개 베타 버전이지만, 이 신청서를 작성하시면 누구나 액세스를 요청할 수 있습니다. 보통 몇 시간 이내에 Embed API 사용을 시작할 수 있다는 확인 이메일을 받게 됩니다.

1단계: 환경 설정

시작하기 위해 Databricks 환경을 설정하고 필요한 라이브러리를 설치합니다.

1 - 새 Databricks 워크스페이스 생성:

2 - 새 클러스터 생성 또는 기존 클러스터 연결:

거의 모든 ML 클러스터가 이 애플리케이션에서 작동합니다. 아래 설정은 최적의 가격 대비 성능을 원하시는 분들을 위해 제공됩니다.

  • 컴퓨팅(Compute) 탭에서 "컴퓨팅 생성(Create compute)"을 클릭합니다.

  • "단일 노드(Single node)" 및 런타임: 14.3 LTS ML non-GPU를 선택합니다.

    • 클러스터 정책 및 액세스 모드는 기본값으로 유지할 수 있습니다.

  • 노드 유형으로 "r6i.xlarge"를 선택합니다.

    • 이를 통해 메모리 활용도를 극대화하는 동시에, 할인 전 기준으로 AWS에서 시간당 단 $0.252, Databricks에서 시간당 1.02 DBU의 비용만 발생합니다.

    • 테스트 결과 가장 빠른 옵션 중 하나이기도 했습니다.

  • 기타 옵션은 모두 기본값으로 유지할 수 있습니다.

  • 하단의 "컴퓨팅 생성(Create compute)"을 클릭하고 워크스페이스로 돌아갑니다.

3 - Databricks 워크스페이스에 새 노트북 생성:

  • 워크스페이스에서 "만들기"를 클릭하고 "노트북"을 선택합니다.

  • 노트북 이름을 입력합니다 (예: "TwelveLabs_MosaicAI_VectorSearch_Integration").

  • 기본 언어로 Python을 선택합니다.

4 - Twelve Labs 및 Mosaic AI Vector Search SDK 설치:

노트북의 첫 번째 셀에서 다음 명령을 실행합니다.

%pip install twelvelabs databricks-vectorsearch

5 - Twelve Labs 인증 설정:

다음 셀에 아래 코드를 추가합니다.

from twelvelabs import TwelveLabs
import os

# Databricks secrets에서 API 키를 가져옵니다 (권장)
# 먼저 비밀 범위를 설정하고 API 키를 추가해야 합니다
TWELVE_LABS_API_KEY = dbutils.secrets.get(scope="your-scope", key="twelvelabs-api-key")

if TWELVE_LABS_API_KEY is None:
    raise ValueError("TWELVE_LABS_API_KEY environment variable is not set")

# Twelve Labs 클라이언트 초기화
twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)

참고: 보안 강화를 위해 API 키를 코드에 직접 쓰거나 환경 변수를 사용하는 대신 Databricks secrets를 사용하여 저장하는 것이 좋습니다.

2단계: 멀티모달 임베딩 생성

제공된 generate_embedding 함수를 사용하여 Twelve Labs Embed API를 통해 멀티모달 임베딩을 생성합니다. 이 함수는 Databricks에서 Spark DataFrame과 효율적으로 작동하도록 Pandas UDF(사용자 정의 함수)로 설계되었습니다. 임베딩 작업 생성, 진행 상태 모니터링 및 결과 검색 프로세스가 포함되어 있습니다.

그 다음, 비디오 URL을 문자열 입력으로 받아 Twelve Labs Embed API에 래퍼 호출을 호출하고 array<float>을 반환하는 process_url 함수를 생성합니다.

구현 및 사용 방법은 다음과 같습니다.

UDF 정의:

from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import ArrayType, FloatType
from twelvelabs.models.embed import EmbeddingsTask
import pandas as pd

@pandas_udf(ArrayType(FloatType()))
def get_video_embeddings(urls: pd.Series) -> pd.Series:
    def generate_embedding(video_url):
        twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)
        task = twelvelabs_client.embed.task.create(
            engine_name="Marengo-retrieval-2.6",
            video_url=video_url
        )
        task.wait_for_done()
        task_result = twelvelabs_client.embed.task.retrieve(task.id)
        embeddings = []
        for v in task_result.video_embeddings:
            embeddings.append({
                'embedding': v.embedding.float,
                'start_offset_sec': v.start_offset_sec,
                'end_offset_sec': v.end_offset_sec,
                'embedding_scope': v.embedding_scope
            })
        return embeddings

    def process_url(url):
        embeddings = generate_embedding(url)
        return embeddings[0]['embedding'] if embeddings else None

    return urls.apply(process_url)

비디오 URL을 포함한 샘플 DataFrame 생성:

video_urls = [
    "https://example.com/video1.mp4",
    "https://example.com/video2.mp4",
    "https://example.com/video3.mp4"
]
df = spark.createDataFrame([(url,) for url in video_urls], ["video_url"])

임베딩 생성을 위해 UDF 적용:

df_with_embeddings = df.withColumn("embedding", get_video_embeddings(df.video_url))

결과 출력:

df_with_embeddings.show(truncate=False)

이 프로세스는 DataFrame의 각 비디오 URL에 대해 시각, 청각 및 텍스트 정보를 포함하여 비디오 콘텐츠의 멀티모달적 본질을 포착하는 멀티모달 임베딩을 생성합니다.

대규모 비디오 데이터 세트의 임베딩 생성은 리소스 연산량이 크고 시간이 많이 소요될 수 있습니다. 대화형 배포 규모의 애플리케이션의 경우 배치 처리나 분산 처리 전략을 도입하는 것이 좋습니다. 또한 발생할 수 있는 API 오류나 네트워크 문제를 해결할 수 있는 적절한 예외 처리 및 로깅을 구성해야 합니다.

3단계: 비디오 임베딩용 Delta Table 생성

이제 Twelve Labs Embed API에서 생성된 비디오 메타데이터 및 임베딩을 저장할 소스 Delta Table을 생성합니다. 이 테이블은 Databricks Mosaic AI Vector Search에서 Vector Search 인덱스의 기반 역할을 합니다.

먼저 비디오 URL 및 메타데이터를 포함한 소스 DataFrame을 생성합니다.

from pyspark.sql import Row

# Create a list of sample video URLs and metadata
video_data = [
Row(url='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4', title='Elephant Dream'), 

Row(url='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4', title='Sintel'),

Row(url='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4', title='Big Buck Bunny')
]

# Create a DataFrame from the list
source_df = spark.createDataFrame(video_data)
source_df.show()

그 다음, SQL을 사용하여 Delta table 스키마를 선언합니다.

%sql
CREATE TABLE IF NOT EXISTS videos_source_embeddings (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY,
  url STRING,
  title STRING,
  embedding ARRAY<FLOAT>
) TBLPROPERTIES (delta.enableChangeDataFeed = true)

Vector Search 인덱스를 생성하고 유지 관리하는 데 중요한 변경 데이터 피드(Change Data Feed)가 테이블에서 활성화되어 있는지 확인합니다.

이제 전 단계에서 정의한 get_video_embeddings 함수를 사용하여 비디오의 임베딩을 생성합니다.

embeddings_df = source_df.withColumn("embedding", get_video_embeddings("url"))

비디오 개수 및 길이에 따라 이 단계는 다소 시간이 걸릴 수 있습니다.

임베딩이 생성되면 이제 해당 데이터를 Delta Table에 저장할 수 있습니다.

embeddings_df.write.mode("append").saveAsTable("videos_source_embeddings")

마지막으로, 임베딩된 DataFrame을 출력하여 데이터를 확인합니다.

display(embeddings_df)

이 단계는 오프라인에서 Vector Search를 지원하기 위한 견고한 기반을 만듭니다. Delta Table은 Vector Search 인덱스와 자동으로 일치 상태를 유지하므로 비디오 데이터셋에 대한 업데이트나 추가 사항이 항상 검색 결과에 반영됩니다.

유지해 두어야 할 주요 사항:

  • id 열은 자동으로 생성되어 각 비디오의 고유 식별자 역할을 합니다.

  • embedding 열에는 Twelve Labs Embed API를 통해 생성된 각 비디오의 고차원 벡터 표현이 저장됩니다.

  • 변경 데이터 피드(Change Data Feed)를 활성화하면 Databricks가 테이블 변경 사항을 효율적으로 추적할 수 있어 항상 최신 상태의 Vector Search 인덱스를 유지하는 데 매우 중요합니다.

4단계: Mosaic AI Vector Search 설정

이 단계에서는 Databricks Mosaic AI Vector Search가 비디오 임베딩과 원활히 작동하도록 수동으로 구성해 봅니다. 이 구성에는 생성한 videos_source_embeddings Delta 테이블과 지속해서 유기적으로 일치하는 Vector Search 엔드포인트 및 Delta Sync Index 생성이 포함되어 있습니다.

먼저 Vector Search 엔드포인트를 생성합니다.

from databricks.vector_search.client import VectorSearchClient

# Initialize the Vector Search client and name the endpoint
mosaic_client = VectorSearchClient()
endpoint_name = "twelve_labs_video_endpoint"

# Delete the existing endpoint if it exists
try:
    mosaic_client.delete_endpoint(endpoint_name)
    print(f"Deleted existing endpoint: {endpoint_name}")
except Exception:
    pass  # Ignore non-existing endpoints

# Create the new endpoint
endpoint = mosaic_client.create_endpoint(
    name=endpoint_name,
    endpoint_type="STANDARD"
)

이 코드는 새 Vector Search 엔드포인트를 생성하거나 동일한 이름의 기존 엔드포인트를 대체합니다. 이 엔드포인트는 Vector Search 작업의 액세스 포인트 역할을 담당합니다.

다음으로, 소스 Delta 테이블인 videos_source_embeddings와 자동으로 완벽히 동기화 상태를 유지할 Delta Sync Index를 생성합니다.

# Define the source table name and index name
source_table_name = "twelvelabs.default.videos_source_embeddings"
index_name = "twelvelabs.default.video_embeddings_index"

index = mosaic_client.create_delta_sync_index(
    endpoint_name="twelve_labs_video_endpoint",
    source_table_name=source_table_name,
    index_name=index_name,
    primary_key="id",
    embedding_dimension=1024,
    embedding_vector_column="embedding",
    pipeline_type="TRIGGERED"
)

print(f"Created index: {index.name}")

이 코드는 원래의 소스 Delta 테이블에 연결되는 Delta Sync Index를 생성합니다. 소스 테이블에 변경 사항이 있을 때 바로 몇 초 이내에 인덱스가 동적으로 업데이트되도록 하려면(즉, Vector Search 결과가 항상 최신 상태를 유지하게 하려면) pipeline_type="CONTINUOUS"로 설정하세요.

인덱스가 성공적으로 생성되었고 바르게 동기화되고 있는지 검사하려면, 다음 코드를 사용하여 동기화를 강제로 실행해 봅니다.

# Check the status of the index; this may take some time
index_status = mosaic_client.get_index(
    endpoint_name="twelve_labs_video_endpoint",
    index_name="twelvelabs.default.video_embeddings_index"
)
print(f"Index status: {index_status}")

# Manually trigger the index sync
try:
    index.sync()
    print("Index sync triggered successfully.")
except Exception as e:
    print(f"Error triggering index sync: {str(e)}")

이 코드를 통해 인덱스의 상태를 체크하고 필요한 경우 수동 동기화를 실행할 수 있습니다. 상용 환경에서는 변경된 소스 Delta 테이블 사항에 따라 파이프라인이 자동 동기화하도록 구성하는 방식이 더 일반적입니다.

요약해 둘 핵심 사항:

  1. Vector Search 엔드포인트는 Vector Search 작업을 수행할 때 입구 역할을 수행합니다.

  2. Delta Sync Index는 원래 소스 Delta 테이블의 상태를 지속해서 반영하여 항상 최신화된 임베딩 검색 결과를 유지합니다.

  3. embedding_dimension은 Twelve Labs Embed API가 생성한 임베딩 차원수(1024)와 일치해야 합니다.

  4. primary_key는 소스 테이블의 고유 ID 식별자인 "id"로 정의합니다.

  5. embedding_vector_column은 비디오 임베딩 벡터가 저장된 소스 테이블의 실제 열 이름인 "embedding"으로 지정합니다.

5단계: 유사도 검색 구현

다음 단계는 수립된 Mosaic AI Vector Search 인덱스와 Twelve Labs Embed API를 결합하여 임베딩 유사도 검색을 실제로 개발하는 것입니다. 멀티모달 임베딩의 높은 차원 표현력을 사용해 사용자가 준 자연어 문장 텍스트 쿼리와 가장 연관 있는 비디오를 찾습니다.

먼저 Twelve Labs Embed API를 사용해 입력 텍스트 쿼리의 임베딩 벡터를 구하는 임포트용 헬퍼 함수를 선언합니다.

def get_text_embedding(text_query):
    # Twelve Labs Embed API supports text-to-embedding
    text_embedding = twelvelabs_client.embed.create(
      engine_name="Marengo-retrieval-2.6",
      text=text_query,
      text_truncate="start"
    )

    return text_embedding.text_embedding.float

이 함수는 텍스트 쿼리를 입력받고 비디오 임베딩과 연산 호환성이 맞도록 비디오 임베딩에 사용된 것과 일치하는 마렝고(Marengo) 모델로 임베딩을 구성하여 반환합니다.

이어서 실제 유사도 검색을 수행할 메인 코드를 배치합니다.

def similarity_search(query_text, num_results=5):
    # Initialize the Vector Search client and get the query embedding
    mosaic_client = VectorSearchClient()
    query_embedding = get_text_embedding(query_text)

    print(f"Query embedding generated: {len(query_embedding)} dimensions")

    # Perform the similarity search
    results = index.similarity_search(
        query_vector=query_embedding,
        num_results=num_results,
        columns=["id", "url", "title"]
    )
    return results

이 함수는 검색 질의어와 최종적으로 가져올 검색 결과 한도를 매개변수로 사용합니다. 받아온 검색 문맥 벡터를 바탕으로 Mosaic AI Vector Search 인덱스를 조회하여 유사도가 가장 높은 비디오 레코드를 모아 리턴해 줍니다.

원시 검색 출력 결과를 적절한 출력 딕셔너리로 다듬을 파서 도구 함수를 정의합니다.

def parse_search_results(raw_results):
    try:
        data_array = raw_results['result']['data_array']
        columns = [col['name'] for col in raw_results['manifest']['columns']]
        return [dict(zip(columns, row)) for row in data_array]
    except KeyError:
        print("Unexpected result format:", raw_results)
        return []

이제 조각된 로직을 결합해 "A dragon" 검색을 기동시키는 실행 테스트를 돌려 봅니다.

# Example usage
query = "A dragon"
raw_results = similarity_search(query)

# Parse and print the search results
search_results = parse_search_results(raw_results)
if search_results:
    print(f"Top {len(search_results)} videos similar to the query: '{query}'")
    for i, result in enumerate(search_results, 1):
        print(f"{i}. Title: {result.get('title', 'N/A')}, URL: {result.get('url', 'N/A')}, Similarity Score: {result.get('score', 'N/A')}")
else:
    print("No valid search results returned.")

해당 파트는 "A dragon" 쿼리를 유사도 기반으로 해석하여 어울리는 비디오 목록을 탐색하고 이쁘게 포맷 정리하여 콘솔에 뿌리는 작동 방식의 모범 예를 제공합니다.

이 파트에서 주요하게 볼 요인:

  1. get_text_embedding는 비디오용 임베딩 생성 시 활용했던 것과 대칭되는 물리 모델을 채택해 다차원 벡터를 추출해 내어야 무결한 검색 매핑이 일어납니다.

  2. similarity_search는 문장 입력, 그것의 고차원 수치 전환 그리고 연이은 인덱스 검색 단계를 유기적으로 이어 줍니다.

  3. 네트워크 렉이나 제반 API 변동 상황을 감쇠할 예외 로직 구축은 실제 빌드 단계에서 고도로 중요합니다.

  4. parse_search_results는 리턴 포맷 파싱을 간편하게 해 줍니다.

  5. 사용 목적에 맞게 num_results 값을 유동적으로 변경해 검색 바운더리를 설계할 수 있습니다.

이를 통해 사용자는 Twelve Labs의 정밀한 정보 굴착 벡터 위에서 자연어 형식의 조건으로 방대한 전사 비디오 보관소를 의미론적으로 검색(Semantic Search)하는 세련된 서비스를 완성할 수 있습니다.

6단계: 비디오 추천 시스템 제작하기

단순 검색을 넘어, 특정 비디오와 멀티모달 측면에서 깊이 있는 유사점을 공유하는 비디오를 연관 배치하기 위한 추천 엔진을 만들어 봅니다.

비디오 추천의 핵심 구조를 기술해 봅니다.

def get_video_recommendations(video_id, num_recommendations=5):
    # Initialize the Vector Search client
    mosaic_client = VectorSearchClient()

    # First, retrieve the embedding for the given video_id
    source_df = spark.table("videos_source_embeddings")
    video_embedding = source_df.filter(f"id = {video_id}").select("embedding").first()

    if not video_embedding:
        print(f"No video found with id: {video_id}")
        return []

    # Perform similarity search using the video's embedding
    try:
        results = index.similarity_search(
            query_vector=video_embedding["embedding"],
            num_results=num_recommendations + 1,  # +1 to account for the input video
            columns=["id", "url", "title"]
        )
        
        # Parse the results
        recommendations = parse_search_results(results)
        
        # Remove the input video from recommendations if present
        recommendations = [r for r in recommendations if r.get('id') != video_id]
        
        return recommendations[:num_recommendations]
    except Exception as e:
        print(f"Error during recommendation: {e}")
        return []

# Helper function to display recommendations
def display_recommendations(recommendations):
    if recommendations:
        print(f"Top {len(recommendations)} recommended videos:")
        for i, video in enumerate(recommendations, 1):
            print(f"{i}. Title: {video.get('title', 'N/A')}")
            print(f"   URL: {video.get('url', 'N/A')}")
            print(f"   Similarity Score: {video.get('score', 'N/A')}")
            print()
    else:
        print("No recommendations found.")

# Example usage
video_id = 1  # Assuming this is a valid video ID in your dataset
recommendations = get_video_recommendations(video_id)
display_recommendations(recommendations)

이 파트는 아래 단계를 통해 추천 절차를 마칩니다.

  1. get_video_recommendations를 호출하여 타겟 비디오 ID와 반환 제항 개수를 명시합니다.

  2. 지정 타겟 비디오의 생성 완료된 고유 임베딩 정보를 소스 테이블에서 풀링합니다.

  3. 풀링한 대조 모델 임베딩 벡터로 연관도가 가장 상응하는 비디오 리스트를 인덱싱 쿼리합니다.

  4. 대상 오리지널 비디오 자체가 추천 최상위에 표출되는 상황을 로직 필터로 거르고 필터 아웃합니다.

  5. display_recommendations가 반환값의 서식을 정리하여 표시를 출력합니다.

해당 추천을 연동 실행하기에 앞서:

  1. 소스 DB 테이블(videos_source_embeddings) 내부에 실 테스트할 비디오 정보 및 유효 임베딩들이 완전한 상태로 기록 설계되어 있는지 점검합니다.

  2. 특정 대상 비디오 번호를 넣어 추천 함수 get_video_recommendations를 테스트 기동합니다.

  3. 작동이 성공적으로 끝나면 추천된 연관 매칭 리스트를 육안으로 대조 확인할 수 있습니다.

이 기본 추천 시스템은 멀티모달 임베딩을 통해 콘텐츠 기반의 깊이 있는 연관도 추천을 수행해 주며, 향후 다음 방식으로 개량할 수 있습니다.


  • 사용자 성향 및 이전 메인 재생 이력 메트릭을 교차 피팅해 완성 단계의 개인화 추천으로 디벨롭합니다.

  • 과도하게 치우친 콘텐츠 도출을 없앨 수 있도록 필터 및 다각화 메커니즘을 연계 가미합니다.

  • 정적 메타데이터(예: 카테고리, 특정 아티스트, 러닝타임) 하단 필터 장치를 구축합시다.

  • 호출 빈도가 빈번한 항목은 데이터 캐싱 처리 파이프라인을 두어 실행 지연(Latency)을 단축합니다.


기본적으로 추천 마일스톤의 실제 정합도는 전체 라이브러리의 사이즈뿐만 아니라 Twelve Labs Embed API의 분석 능력 설계도와 비례합니다. 신규 비디오 업데이트에 맞추어 점차 추천 성능의 연상 연결성 수준이 더욱 명확히 업그레이드됨을 알 수 있습니다.

통합 인프라를 다음 단계로 확장하기

인덱스 비디오 라이브러리 스마트 동기화 및 갱신관리

시스템의 전체 누적 비디오 보관 볼륨 자체가 확대될수록, 실시간 서치에 기여하는 벡터 인덱스의 지속적 업데이트 주기가 중요도를 더하게 됩니다. Mosaic AI Vector Search는 원본 Delta 테이블 변화에 동기화 처리를 지능적으로 엮어내어 최신 추천 정량도를 상시 보전해 줍니다.

안정적 동기화 구축을 위한 주요 아키텍처 가이드라인:

  1. 증분 데이터 변경 처리(Incremental updates): Delta Lake의 Change Data Feed 옵션을 써서 전체 테이블을 다시 빌드하지 않고 수시로 갱신 또는 추가된 내용량만 알짜로 수집 및 인덱싱합니다.

  2. 스케줄 동기화: Databricks의 스케줄러 오케스트레이션 구동 장치로 정규 가동 부하가 낮은 주기를 설정해 백그라운드에서 주기적으로 정리 배치 동기화를 가동합니다.

  3. 실시간 업데이트 파이프라인: 실시간 추천이 절실한 비즈니스 요건이면, Databricks Mosaic AI의 스트리밍 기술을 도입해 실시간으로 데이터 밀집 작업을 순차 반영시킵니다.

  4. 버전 롤백 관리: Delta Lake 안의 시간 여행(Time-travel) 추적을 활용해 이전 벡터 상태 히스토리를 버전별 백업 보전해 유사시 스냅백 복원을 가능하게 만듭니다.

  5. 동기화 예찰 모니터링: 전체 싱크 주기 로그 수집기를 연계 구축하여 동기 상태 이상 감지 시 신속하게 복구 피드백을 전달할 알림 장치를 가미합니다.

이러한 운영 체계를 바탕으로 구성하면 축적 완료된 Twelve Labs 비디오 임베딩이 실 지체 없이 상시 동적 조율 상태를 뽐내며 강력함을 온전히 발산할 수 있습니다.

스케일 아웃 및 연산 최적화 공정

수백만 단위를 초과하는 대규모 비디오 분석 라이브러리를 가공해야 하는 비즈니스 볼륨에 다다르면 스케일 확장과 지연 시간 방어 최적화 영역이 최고 난제가 됩니다. Databricks가 선사하는 유연한 분산 클러스터 컴퓨팅과 Twelve Labs의 압도적인 초고속 분산 멀티모달 프레임 처리를 가미해 초대형 스케일 인프라를 지탱합니다.

이를 위해 추천 전술:

  1. 분산 파티션 병렬 연산: Databricks Spark 런타임 클러스터 모델 아키텍처하에 대용량 임베딩 생성 명령을 다중 분할 워커 노드별 파티션 덩어리로 조각내어 한 번에 병렬 연산해 줍니다.

  2. 전략적 캐시 정책: 누적 조회 수가 눈에 띄게 두드러지는 최정상 비디오 콘텐츠 임베딩 소스는 빠른 메모리 적재 영역에 할당 캐싱하여 불필요한 API 연산 단계를 크게 차단해 줍니다.

  3. 스마트 배치 세그먼트: 비업무 시간대에 자동 스케줄러로 대용량 변경분 임베딩 마이그레이션 백체 작업을 연대 처리하는 배치 인프라를 조성해 비용 로드를 주도적으로 경감합니다.

  4. 서치 쿼리 옵티마이징: 최적 효율 도출을 하도록 num_results 조절뿐 아니라, 전처리 스키마 필터링(Pre-filtering) 장치를 인가해 매칭 후보군 벡터 매치 모수를 쾌적하게 좁혀 나갑니다.

  5. 인덱스 샤딩/파티셔닝: 거대한 벡터 세그먼트는 내부 기준 키값에 따라 인덱스 파티셔닝 전략을 심어 디스크 탐색 세션을 가속 시켜 줍니다.

  6. 오토스케일링 분산 컴퓨팅: 수량 집중 등 가중 요인이 터질 시에 분산 워커 파워를 지능 단위로 가감하는 클러스터 오토스케일링 요소를 구성합니다.

  7. 엣지(Edge) 지향 하이브리드 연계: 레이턴시 극강 제어가 소모되는 모바일이나 특수 IoT 전단 인터페이스일 경우 엣지단 스마트 분배 전개 구도를 함께 설계합니다.

성공적으로 스케일링 전개 작업을 결합함으로써 인프라 부하 폭주 현상을 억제하며 늘어나는 대용량 요청을 미끄러지듯 유연하게 소화하는 견인력을 가꾸게 됩니다.

모니터링 체계와 데이터 애널리틱스

운영 중인 멀티모달 비디오 지능 분류 가치 체인이 정밀히 서빙되고 있는지 장기 점검을 보장하려면 지속적 모니터링 모듈과 통계 파이프라인 정착이 필수입니다. Databricks는 전반적 시스템 추이, 사용자 질의 행동 패턴, 검색 가치 도달율 등을 종합 감시할 일체형 측정 대시보드 뷰를 지원합니다.

집중 관리해야 할 감사 관점들:

  1. 하드웨어/인프라 성능 지표: 질의 처리 완료 지연 속도(latency), 원스톱 임베딩 파이싱 실행 소요 타임, 그리고 매일의 싱크 소요 경향 곡선 데이터를 트래킹합니다.

  2. 검색 사용자 인텔리전스: 질의 사용자가 보낸 실제 문구 패턴의 빈출 키워드 특징, 중점 도달 추천 레코드 세션에 대한 유저 수용 추세를 로깅해 인사이트를 건져 냅니다.

  3. 검색 추천 정합성 측정: 클릭 스루율(CTR) 등을 감안하는 정밀 피드백 밸브 계측 수단을 정착 시켜 벡터 검색 세트가 체감상 현실적인 품질을 수렴하고 있는지 수치 품질 계측(Metrics evaluation)을 시행합니다.

  4. 서버 리소스 활용비 모니터링: 전체 클라우드 사용량과 Twelve Labs API 연성 연산 통신 회수 요율 트래디셔널 곡선을 보며 서비스가 효율적 노선 비중으로 지출되고 있는지 점사합니다.

  5. 자동 에러 파서 얼럿: 미싱 필드나 호출 예외 등으로 인한 통합 연결 크래시 조짐 포착 시 인프라 담당자에 직접 소통 수단을 태깅할 무중단 관제 트리거를 설계합니다.

  6. 동적 A/B 테스팅 수행: Databricks의 풍부한 테스트 기능들로 마렝고(Marengo) 등 타겟 임베딩 모델의 에디션 변형 시나리오 변경 대조 실험 작업을 스위칭해 가며 가장 완벽한 유저 피팅 해법을 발굴합니다.

  7. 기대 비즈니스 지표 대조: 세련된 비디오 이해 기능 배치가 순수 서비스 체류 타임이나 유저 리텐션 증대 수치, 최종 도달성 등에 어떻게 연동 성과를 견인 중인지 비즈니스 가치 증빙(Impact metrics)을 엮어 봅니다.

  8. 개인보호 및 규제 컴플라이언스: 원본 파싱 파이프라인에서 민감 정보를 지우거나 보안적 프라이버시 조항이 누수되지 않도록 데이터 유통 필터를 모니터링에 함께 정비해 줍니다.

이로써 비디오 콘텐츠 이해 시스템이 실제로 발휘해 내는 시스템적 가치 지표와 업무 임팩트를 눈으로 입증할 지표 투명성이 확보됩니다. 이러한 데이터 중심 접근은 Twelve Labs의 압도적인 최신 비디오 임베딩 자산과 Databricks 데이터 인텔리전스 플랫폼의 파워가 일으키는 통합 비즈니스 레버리지를 증명하고 솔루션을 지속 개량할 영양분이 되어 줍니다.

결론

Twelve Labs와 Databricks Mosaic AI의 동맹은 방대하고 복잡한 비디오 콘텐츠 데이터 세트에서 무궁무진한 고해상도 인사이트를 분석 및 추론할 혁신적 마스터 돌파구를 선사합니다. 이 기술 통합은 세부 멀티모달적 미학까지 짚어내는 임베딩 능력과 압도적으로 쾌적하고 신속한 Vector Search의 결합을 바탕으로, 비디오 중심의 시맨틱 검색, 추천 시스템을 더 높은 차원으로 리드해 줍니다.

본 가이드는 첫 단추인 작업 도구 인프라 배치부터 임베딩 확보, 인덱스 동기 유지 및 실 구현체로서의 유사 검색 시스템 구축에 걸쳐 실제 프로덕션 단계의 스케일 확장론까지 일목요연하게 다루었습니다.

더 정교하고 방대해지는 디지털 미디어 파이프라인 속에서 핵심 유저 기호를 통찰하고 실 비디오 내용 속성 정보를 의미 수준으로 파악해 내는 기법은 그야말로 강력한 경쟁력을 뜻합니다. 이 통합 시스템을 활용해 귀사 고유의 비즈니스 지평에 맞추어 독창적인 인공지능 비디오 가치 시스템을 펼쳐 보시기 바랍니다. 지속해서 성장하는 개방형 비디오 AI 엔지니어 생태계에서 고차원의 기여와 함께 혁신의 주역으로 발돋움해 보시기를 진심으로 격려합니다.

추가 리소스

본 통합 아키텍처에 깊이를 늘려 줄 풍부한 외부 가이드를 아래에 첨부해 둡니다.

  1. Twelve Labs 공식 문서 가이드

  2. Databricks Vector Search 상세 공식 설명서

  3. Databricks 커뮤니티 토론 포럼

  4. Twelve Labs 디스코드 글로벌 개발자 커뮤니티

이 유용한 지식 자원들과 소통 네트워크를 바탕으로 매주 달라지는 초연결 비디오 AI 기술 진화의 최전선에서 Twelve Labs와 Databricks의 능력을 온전히 누려 보세요.

요약

Twelve Labs의 Embed API를 사용하면 개발자는 멀티모달 임베딩을 생성하여 시맨틱 비디오 검색, 데이터 큐레이션부터 콘텐츠 추천 및 비디오 RAG 시스템에 이르기까지 고급 비디오 이해 사용 사례를 구현할 수 있습니다.

Twelve Labs를 사용하면 비디오 내의 시각적 표현, 바디 랭귀지, 음성 언어 및 전반적인 맥락 간의 관계를 포착하는 문맥상 벡터 표현을 생성할 수 있습니다. Databricks Mosaic AI Vector Search는 고차원 벡터를 인덱싱하고 쿼리하기 위한 강력하고 확장 가능한 인프라를 제공합니다.

이 블로그 게시물에서는 이러한 상호 보완적인 기술을 활용하여 비디오 AI 애플리케이션의 새로운 가능성을 열어가는 방법을 안내합니다.

이 튜토리얼을 위해 함께 협업해 주신 Databricks의 Nina Williams님, Austin Zaccor님, Fernanda Heredia님, 그리고 Emily Hutson님께 깊은 감사를 드립니다!

왜 Twelve Labs + Databricks Mosaic AI인가요?

Twelve Labs Embed API와 Databricks Mosaic AI Vector Search의 통합은 대규모 비디오 데이터 세트의 효율적인 처리 및 정확한 멀티모달 콘텐츠 표현과 같은 비디오 AI의 핵심 과제를 해결합니다. 이 통합은 고급 비디오 애플리케이션의 개발 시간과 리소스 요구 사항을 줄여주며, 방대한 비디오 라이브러리 전체에서 복잡한 쿼리를 가능하게 하고 전반적인 워크플로우 효율성을 높여줍니다.

멀티모달 데이터를 처리하는 이 통합된 접근 방식은 특히 주목할 만합니다. 텍스트, 이미지, 오디오 분석을 위해 별도의 모델을 번거롭게 다룰 필요 없이, 이제 사용자는 비디오 콘텐츠의 본질을 온전히 포착하는 단일하고 일관된 표현으로 작업할 수 있습니다. 이는 배포 아키텍처를 단순화할 뿐만 아니라 정교한 콘텐츠 추천 시스템부터 고급 비디오 검색 엔진 및 자동 콘텐츠 중재 도구에 이르기까지 더 미묘하고 문맥을 인식하는 애플리케이션을 가능하게 합니다.

또한, 이 통합은 Databricks 에코시스템의 기능을 확장하여 기존 데이터 파이프라인 및 머신러닝 워크플로우에 비디오 이해 기능을 원활하게 통합할 수 있도록 지원합니다. 기업이 실시간 비디오 분석을 개발하든, 대규모 콘텐츠 분류 시스템을 구축하든, 생성형 AI의 새로운 애플리케이션을 탐색하든 이 결합된 솔루션은 강력한 기반을 제공합니다. 이는 비디오 AI의 한계를 넓혀 미디어 및 엔터테인먼트에서 보안, 의료에 이르는 다양한 산업에서 혁신과 문제 해결을 위한 새로운 길을 열어줍니다.

Twelve Labs Embed API 이해하기

Twelve Labs의 Embed API는 비디오 콘텐츠를 위해 특별히 설계된 멀티모달 임베딩 기술의 비약적인 발전을 보여줍니다. 프레임별 분석이나 모달리티별 별도 모델에 의존하는 기존 방식과 달리, 이 API는 비디오 내의 시각적 표현, 바디 랭귀지, 음성 언어 및 전반적인 맥락의 복잡한 상호 작용을 포착하는 문맥상 벡터 표현을 생성합니다. 이는 Twelve Labs의 최첨대 멀티모달 파운데이션 모델인 Marengo-2.6을 기반으로 합니다.



Embed API는 비디오 데이터를 다루는 AI 엔지니어에게 특히 유용한 몇 가지 핵심 기능을 제공합니다. 첫째, 비디오에 존재하는 모든 모달리티에 대한 유연성을 제공하므로 별도의 텍스트 전용 또는 이미지 전용 모델이 필요하지 않습니다. 둘째, 움직임, 동작 및 시간적 정보를 고려하는 비디오 네이티브 접근 방식을 사용하여 비디오 콘텐츠에 대한 보다 정확하고 시간적으로 일관된 해석을 보장합니다. 마지막으로, 모든 모달리티의 임베딩을 통합하는 단일화된 벡터 공간을 생성하여 비디오 콘텐츠에 대한 보다 포괄적인 이해를 돕습니다.

AI 엔지니어에게 Embed API는 비디오 이해 작업에서 새로운 가능성을 열어줍니다. 보다 정교한 콘텐츠 분석, 개선된 시맨틱 검색 기능, 그리고 강화된 추천 시스템을 가능하게 합니다. 시간이 지남에 따라 서로 다른 모달리티 간의 미묘한 신호와 상호 작용을 포착하는 API의 능력을 통해 감정 인식, 맥락 인식 콘텐츠 중재, 고급 비디오 검색 시스템처럼 미묘한 이해가 필요한 애플리케이션에서 특히 유용하게 사용됩니다.

사전 요구 사항

Twelve Labs Embed API를 Databricks Mosaic AI Vector Search와 통합하기 전에 다음 요구 사항을 갖추었는지 확인하세요.

  1. 워크스페이스를 생성하고 관리할 수 있는 권한이 있는 Databricks 계정 (여기에서 무료 평가판에 가입할 수 있습니다: https://databricks.com/try-databricks)

  2. Python 프로그래밍 및 기본적인 데이터 과학 개념에 대한 이해

  3. Twelve Labs API 키 (가입처: playground.twelvelabs.io)

  4. 벡터 임베딩 및 유사도 검색 개념에 대한 기본 이해

  5. (선택 사항) AWS에서 Databricks를 사용하는 경우 AWS 계정. Azure 또는 Google Cloud에서 Databricks를 사용하는 경우에는 필요하지 않습니다.

참고: Embed API는 현재 비공개 베타 버전이지만, 이 신청서를 작성하시면 누구나 액세스를 요청할 수 있습니다. 보통 몇 시간 이내에 Embed API 사용을 시작할 수 있다는 확인 이메일을 받게 됩니다.

1단계: 환경 설정

시작하기 위해 Databricks 환경을 설정하고 필요한 라이브러리를 설치합니다.

1 - 새 Databricks 워크스페이스 생성:

2 - 새 클러스터 생성 또는 기존 클러스터 연결:

거의 모든 ML 클러스터가 이 애플리케이션에서 작동합니다. 아래 설정은 최적의 가격 대비 성능을 원하시는 분들을 위해 제공됩니다.

  • 컴퓨팅(Compute) 탭에서 "컴퓨팅 생성(Create compute)"을 클릭합니다.

  • "단일 노드(Single node)" 및 런타임: 14.3 LTS ML non-GPU를 선택합니다.

    • 클러스터 정책 및 액세스 모드는 기본값으로 유지할 수 있습니다.

  • 노드 유형으로 "r6i.xlarge"를 선택합니다.

    • 이를 통해 메모리 활용도를 극대화하는 동시에, 할인 전 기준으로 AWS에서 시간당 단 $0.252, Databricks에서 시간당 1.02 DBU의 비용만 발생합니다.

    • 테스트 결과 가장 빠른 옵션 중 하나이기도 했습니다.

  • 기타 옵션은 모두 기본값으로 유지할 수 있습니다.

  • 하단의 "컴퓨팅 생성(Create compute)"을 클릭하고 워크스페이스로 돌아갑니다.

3 - Databricks 워크스페이스에 새 노트북 생성:

  • 워크스페이스에서 "만들기"를 클릭하고 "노트북"을 선택합니다.

  • 노트북 이름을 입력합니다 (예: "TwelveLabs_MosaicAI_VectorSearch_Integration").

  • 기본 언어로 Python을 선택합니다.

4 - Twelve Labs 및 Mosaic AI Vector Search SDK 설치:

노트북의 첫 번째 셀에서 다음 명령을 실행합니다.

%pip install twelvelabs databricks-vectorsearch

5 - Twelve Labs 인증 설정:

다음 셀에 아래 코드를 추가합니다.

from twelvelabs import TwelveLabs
import os

# Databricks secrets에서 API 키를 가져옵니다 (권장)
# 먼저 비밀 범위를 설정하고 API 키를 추가해야 합니다
TWELVE_LABS_API_KEY = dbutils.secrets.get(scope="your-scope", key="twelvelabs-api-key")

if TWELVE_LABS_API_KEY is None:
    raise ValueError("TWELVE_LABS_API_KEY environment variable is not set")

# Twelve Labs 클라이언트 초기화
twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)

참고: 보안 강화를 위해 API 키를 코드에 직접 쓰거나 환경 변수를 사용하는 대신 Databricks secrets를 사용하여 저장하는 것이 좋습니다.

2단계: 멀티모달 임베딩 생성

제공된 generate_embedding 함수를 사용하여 Twelve Labs Embed API를 통해 멀티모달 임베딩을 생성합니다. 이 함수는 Databricks에서 Spark DataFrame과 효율적으로 작동하도록 Pandas UDF(사용자 정의 함수)로 설계되었습니다. 임베딩 작업 생성, 진행 상태 모니터링 및 결과 검색 프로세스가 포함되어 있습니다.

그 다음, 비디오 URL을 문자열 입력으로 받아 Twelve Labs Embed API에 래퍼 호출을 호출하고 array<float>을 반환하는 process_url 함수를 생성합니다.

구현 및 사용 방법은 다음과 같습니다.

UDF 정의:

from pyspark.sql.functions import pandas_udf
from pyspark.sql.types import ArrayType, FloatType
from twelvelabs.models.embed import EmbeddingsTask
import pandas as pd

@pandas_udf(ArrayType(FloatType()))
def get_video_embeddings(urls: pd.Series) -> pd.Series:
    def generate_embedding(video_url):
        twelvelabs_client = TwelveLabs(api_key=TWELVE_LABS_API_KEY)
        task = twelvelabs_client.embed.task.create(
            engine_name="Marengo-retrieval-2.6",
            video_url=video_url
        )
        task.wait_for_done()
        task_result = twelvelabs_client.embed.task.retrieve(task.id)
        embeddings = []
        for v in task_result.video_embeddings:
            embeddings.append({
                'embedding': v.embedding.float,
                'start_offset_sec': v.start_offset_sec,
                'end_offset_sec': v.end_offset_sec,
                'embedding_scope': v.embedding_scope
            })
        return embeddings

    def process_url(url):
        embeddings = generate_embedding(url)
        return embeddings[0]['embedding'] if embeddings else None

    return urls.apply(process_url)

비디오 URL을 포함한 샘플 DataFrame 생성:

video_urls = [
    "https://example.com/video1.mp4",
    "https://example.com/video2.mp4",
    "https://example.com/video3.mp4"
]
df = spark.createDataFrame([(url,) for url in video_urls], ["video_url"])

임베딩 생성을 위해 UDF 적용:

df_with_embeddings = df.withColumn("embedding", get_video_embeddings(df.video_url))

결과 출력:

df_with_embeddings.show(truncate=False)

이 프로세스는 DataFrame의 각 비디오 URL에 대해 시각, 청각 및 텍스트 정보를 포함하여 비디오 콘텐츠의 멀티모달적 본질을 포착하는 멀티모달 임베딩을 생성합니다.

대규모 비디오 데이터 세트의 임베딩 생성은 리소스 연산량이 크고 시간이 많이 소요될 수 있습니다. 대화형 배포 규모의 애플리케이션의 경우 배치 처리나 분산 처리 전략을 도입하는 것이 좋습니다. 또한 발생할 수 있는 API 오류나 네트워크 문제를 해결할 수 있는 적절한 예외 처리 및 로깅을 구성해야 합니다.

3단계: 비디오 임베딩용 Delta Table 생성

이제 Twelve Labs Embed API에서 생성된 비디오 메타데이터 및 임베딩을 저장할 소스 Delta Table을 생성합니다. 이 테이블은 Databricks Mosaic AI Vector Search에서 Vector Search 인덱스의 기반 역할을 합니다.

먼저 비디오 URL 및 메타데이터를 포함한 소스 DataFrame을 생성합니다.

from pyspark.sql import Row

# Create a list of sample video URLs and metadata
video_data = [
Row(url='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4', title='Elephant Dream'), 

Row(url='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4', title='Sintel'),

Row(url='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4', title='Big Buck Bunny')
]

# Create a DataFrame from the list
source_df = spark.createDataFrame(video_data)
source_df.show()

그 다음, SQL을 사용하여 Delta table 스키마를 선언합니다.

%sql
CREATE TABLE IF NOT EXISTS videos_source_embeddings (
  id BIGINT GENERATED BY DEFAULT AS IDENTITY,
  url STRING,
  title STRING,
  embedding ARRAY<FLOAT>
) TBLPROPERTIES (delta.enableChangeDataFeed = true)

Vector Search 인덱스를 생성하고 유지 관리하는 데 중요한 변경 데이터 피드(Change Data Feed)가 테이블에서 활성화되어 있는지 확인합니다.

이제 전 단계에서 정의한 get_video_embeddings 함수를 사용하여 비디오의 임베딩을 생성합니다.

embeddings_df = source_df.withColumn("embedding", get_video_embeddings("url"))

비디오 개수 및 길이에 따라 이 단계는 다소 시간이 걸릴 수 있습니다.

임베딩이 생성되면 이제 해당 데이터를 Delta Table에 저장할 수 있습니다.

embeddings_df.write.mode("append").saveAsTable("videos_source_embeddings")

마지막으로, 임베딩된 DataFrame을 출력하여 데이터를 확인합니다.

display(embeddings_df)

이 단계는 오프라인에서 Vector Search를 지원하기 위한 견고한 기반을 만듭니다. Delta Table은 Vector Search 인덱스와 자동으로 일치 상태를 유지하므로 비디오 데이터셋에 대한 업데이트나 추가 사항이 항상 검색 결과에 반영됩니다.

유지해 두어야 할 주요 사항:

  • id 열은 자동으로 생성되어 각 비디오의 고유 식별자 역할을 합니다.

  • embedding 열에는 Twelve Labs Embed API를 통해 생성된 각 비디오의 고차원 벡터 표현이 저장됩니다.

  • 변경 데이터 피드(Change Data Feed)를 활성화하면 Databricks가 테이블 변경 사항을 효율적으로 추적할 수 있어 항상 최신 상태의 Vector Search 인덱스를 유지하는 데 매우 중요합니다.

4단계: Mosaic AI Vector Search 설정

이 단계에서는 Databricks Mosaic AI Vector Search가 비디오 임베딩과 원활히 작동하도록 수동으로 구성해 봅니다. 이 구성에는 생성한 videos_source_embeddings Delta 테이블과 지속해서 유기적으로 일치하는 Vector Search 엔드포인트 및 Delta Sync Index 생성이 포함되어 있습니다.

먼저 Vector Search 엔드포인트를 생성합니다.

from databricks.vector_search.client import VectorSearchClient

# Initialize the Vector Search client and name the endpoint
mosaic_client = VectorSearchClient()
endpoint_name = "twelve_labs_video_endpoint"

# Delete the existing endpoint if it exists
try:
    mosaic_client.delete_endpoint(endpoint_name)
    print(f"Deleted existing endpoint: {endpoint_name}")
except Exception:
    pass  # Ignore non-existing endpoints

# Create the new endpoint
endpoint = mosaic_client.create_endpoint(
    name=endpoint_name,
    endpoint_type="STANDARD"
)

이 코드는 새 Vector Search 엔드포인트를 생성하거나 동일한 이름의 기존 엔드포인트를 대체합니다. 이 엔드포인트는 Vector Search 작업의 액세스 포인트 역할을 담당합니다.

다음으로, 소스 Delta 테이블인 videos_source_embeddings와 자동으로 완벽히 동기화 상태를 유지할 Delta Sync Index를 생성합니다.

# Define the source table name and index name
source_table_name = "twelvelabs.default.videos_source_embeddings"
index_name = "twelvelabs.default.video_embeddings_index"

index = mosaic_client.create_delta_sync_index(
    endpoint_name="twelve_labs_video_endpoint",
    source_table_name=source_table_name,
    index_name=index_name,
    primary_key="id",
    embedding_dimension=1024,
    embedding_vector_column="embedding",
    pipeline_type="TRIGGERED"
)

print(f"Created index: {index.name}")

이 코드는 원래의 소스 Delta 테이블에 연결되는 Delta Sync Index를 생성합니다. 소스 테이블에 변경 사항이 있을 때 바로 몇 초 이내에 인덱스가 동적으로 업데이트되도록 하려면(즉, Vector Search 결과가 항상 최신 상태를 유지하게 하려면) pipeline_type="CONTINUOUS"로 설정하세요.

인덱스가 성공적으로 생성되었고 바르게 동기화되고 있는지 검사하려면, 다음 코드를 사용하여 동기화를 강제로 실행해 봅니다.

# Check the status of the index; this may take some time
index_status = mosaic_client.get_index(
    endpoint_name="twelve_labs_video_endpoint",
    index_name="twelvelabs.default.video_embeddings_index"
)
print(f"Index status: {index_status}")

# Manually trigger the index sync
try:
    index.sync()
    print("Index sync triggered successfully.")
except Exception as e:
    print(f"Error triggering index sync: {str(e)}")

이 코드를 통해 인덱스의 상태를 체크하고 필요한 경우 수동 동기화를 실행할 수 있습니다. 상용 환경에서는 변경된 소스 Delta 테이블 사항에 따라 파이프라인이 자동 동기화하도록 구성하는 방식이 더 일반적입니다.

요약해 둘 핵심 사항:

  1. Vector Search 엔드포인트는 Vector Search 작업을 수행할 때 입구 역할을 수행합니다.

  2. Delta Sync Index는 원래 소스 Delta 테이블의 상태를 지속해서 반영하여 항상 최신화된 임베딩 검색 결과를 유지합니다.

  3. embedding_dimension은 Twelve Labs Embed API가 생성한 임베딩 차원수(1024)와 일치해야 합니다.

  4. primary_key는 소스 테이블의 고유 ID 식별자인 "id"로 정의합니다.

  5. embedding_vector_column은 비디오 임베딩 벡터가 저장된 소스 테이블의 실제 열 이름인 "embedding"으로 지정합니다.

5단계: 유사도 검색 구현

다음 단계는 수립된 Mosaic AI Vector Search 인덱스와 Twelve Labs Embed API를 결합하여 임베딩 유사도 검색을 실제로 개발하는 것입니다. 멀티모달 임베딩의 높은 차원 표현력을 사용해 사용자가 준 자연어 문장 텍스트 쿼리와 가장 연관 있는 비디오를 찾습니다.

먼저 Twelve Labs Embed API를 사용해 입력 텍스트 쿼리의 임베딩 벡터를 구하는 임포트용 헬퍼 함수를 선언합니다.

def get_text_embedding(text_query):
    # Twelve Labs Embed API supports text-to-embedding
    text_embedding = twelvelabs_client.embed.create(
      engine_name="Marengo-retrieval-2.6",
      text=text_query,
      text_truncate="start"
    )

    return text_embedding.text_embedding.float

이 함수는 텍스트 쿼리를 입력받고 비디오 임베딩과 연산 호환성이 맞도록 비디오 임베딩에 사용된 것과 일치하는 마렝고(Marengo) 모델로 임베딩을 구성하여 반환합니다.

이어서 실제 유사도 검색을 수행할 메인 코드를 배치합니다.

def similarity_search(query_text, num_results=5):
    # Initialize the Vector Search client and get the query embedding
    mosaic_client = VectorSearchClient()
    query_embedding = get_text_embedding(query_text)

    print(f"Query embedding generated: {len(query_embedding)} dimensions")

    # Perform the similarity search
    results = index.similarity_search(
        query_vector=query_embedding,
        num_results=num_results,
        columns=["id", "url", "title"]
    )
    return results

이 함수는 검색 질의어와 최종적으로 가져올 검색 결과 한도를 매개변수로 사용합니다. 받아온 검색 문맥 벡터를 바탕으로 Mosaic AI Vector Search 인덱스를 조회하여 유사도가 가장 높은 비디오 레코드를 모아 리턴해 줍니다.

원시 검색 출력 결과를 적절한 출력 딕셔너리로 다듬을 파서 도구 함수를 정의합니다.

def parse_search_results(raw_results):
    try:
        data_array = raw_results['result']['data_array']
        columns = [col['name'] for col in raw_results['manifest']['columns']]
        return [dict(zip(columns, row)) for row in data_array]
    except KeyError:
        print("Unexpected result format:", raw_results)
        return []

이제 조각된 로직을 결합해 "A dragon" 검색을 기동시키는 실행 테스트를 돌려 봅니다.

# Example usage
query = "A dragon"
raw_results = similarity_search(query)

# Parse and print the search results
search_results = parse_search_results(raw_results)
if search_results:
    print(f"Top {len(search_results)} videos similar to the query: '{query}'")
    for i, result in enumerate(search_results, 1):
        print(f"{i}. Title: {result.get('title', 'N/A')}, URL: {result.get('url', 'N/A')}, Similarity Score: {result.get('score', 'N/A')}")
else:
    print("No valid search results returned.")

해당 파트는 "A dragon" 쿼리를 유사도 기반으로 해석하여 어울리는 비디오 목록을 탐색하고 이쁘게 포맷 정리하여 콘솔에 뿌리는 작동 방식의 모범 예를 제공합니다.

이 파트에서 주요하게 볼 요인:

  1. get_text_embedding는 비디오용 임베딩 생성 시 활용했던 것과 대칭되는 물리 모델을 채택해 다차원 벡터를 추출해 내어야 무결한 검색 매핑이 일어납니다.

  2. similarity_search는 문장 입력, 그것의 고차원 수치 전환 그리고 연이은 인덱스 검색 단계를 유기적으로 이어 줍니다.

  3. 네트워크 렉이나 제반 API 변동 상황을 감쇠할 예외 로직 구축은 실제 빌드 단계에서 고도로 중요합니다.

  4. parse_search_results는 리턴 포맷 파싱을 간편하게 해 줍니다.

  5. 사용 목적에 맞게 num_results 값을 유동적으로 변경해 검색 바운더리를 설계할 수 있습니다.

이를 통해 사용자는 Twelve Labs의 정밀한 정보 굴착 벡터 위에서 자연어 형식의 조건으로 방대한 전사 비디오 보관소를 의미론적으로 검색(Semantic Search)하는 세련된 서비스를 완성할 수 있습니다.

6단계: 비디오 추천 시스템 제작하기

단순 검색을 넘어, 특정 비디오와 멀티모달 측면에서 깊이 있는 유사점을 공유하는 비디오를 연관 배치하기 위한 추천 엔진을 만들어 봅니다.

비디오 추천의 핵심 구조를 기술해 봅니다.

def get_video_recommendations(video_id, num_recommendations=5):
    # Initialize the Vector Search client
    mosaic_client = VectorSearchClient()

    # First, retrieve the embedding for the given video_id
    source_df = spark.table("videos_source_embeddings")
    video_embedding = source_df.filter(f"id = {video_id}").select("embedding").first()

    if not video_embedding:
        print(f"No video found with id: {video_id}")
        return []

    # Perform similarity search using the video's embedding
    try:
        results = index.similarity_search(
            query_vector=video_embedding["embedding"],
            num_results=num_recommendations + 1,  # +1 to account for the input video
            columns=["id", "url", "title"]
        )
        
        # Parse the results
        recommendations = parse_search_results(results)
        
        # Remove the input video from recommendations if present
        recommendations = [r for r in recommendations if r.get('id') != video_id]
        
        return recommendations[:num_recommendations]
    except Exception as e:
        print(f"Error during recommendation: {e}")
        return []

# Helper function to display recommendations
def display_recommendations(recommendations):
    if recommendations:
        print(f"Top {len(recommendations)} recommended videos:")
        for i, video in enumerate(recommendations, 1):
            print(f"{i}. Title: {video.get('title', 'N/A')}")
            print(f"   URL: {video.get('url', 'N/A')}")
            print(f"   Similarity Score: {video.get('score', 'N/A')}")
            print()
    else:
        print("No recommendations found.")

# Example usage
video_id = 1  # Assuming this is a valid video ID in your dataset
recommendations = get_video_recommendations(video_id)
display_recommendations(recommendations)

이 파트는 아래 단계를 통해 추천 절차를 마칩니다.

  1. get_video_recommendations를 호출하여 타겟 비디오 ID와 반환 제항 개수를 명시합니다.

  2. 지정 타겟 비디오의 생성 완료된 고유 임베딩 정보를 소스 테이블에서 풀링합니다.

  3. 풀링한 대조 모델 임베딩 벡터로 연관도가 가장 상응하는 비디오 리스트를 인덱싱 쿼리합니다.

  4. 대상 오리지널 비디오 자체가 추천 최상위에 표출되는 상황을 로직 필터로 거르고 필터 아웃합니다.

  5. display_recommendations가 반환값의 서식을 정리하여 표시를 출력합니다.

해당 추천을 연동 실행하기에 앞서:

  1. 소스 DB 테이블(videos_source_embeddings) 내부에 실 테스트할 비디오 정보 및 유효 임베딩들이 완전한 상태로 기록 설계되어 있는지 점검합니다.

  2. 특정 대상 비디오 번호를 넣어 추천 함수 get_video_recommendations를 테스트 기동합니다.

  3. 작동이 성공적으로 끝나면 추천된 연관 매칭 리스트를 육안으로 대조 확인할 수 있습니다.

이 기본 추천 시스템은 멀티모달 임베딩을 통해 콘텐츠 기반의 깊이 있는 연관도 추천을 수행해 주며, 향후 다음 방식으로 개량할 수 있습니다.


  • 사용자 성향 및 이전 메인 재생 이력 메트릭을 교차 피팅해 완성 단계의 개인화 추천으로 디벨롭합니다.

  • 과도하게 치우친 콘텐츠 도출을 없앨 수 있도록 필터 및 다각화 메커니즘을 연계 가미합니다.

  • 정적 메타데이터(예: 카테고리, 특정 아티스트, 러닝타임) 하단 필터 장치를 구축합시다.

  • 호출 빈도가 빈번한 항목은 데이터 캐싱 처리 파이프라인을 두어 실행 지연(Latency)을 단축합니다.


기본적으로 추천 마일스톤의 실제 정합도는 전체 라이브러리의 사이즈뿐만 아니라 Twelve Labs Embed API의 분석 능력 설계도와 비례합니다. 신규 비디오 업데이트에 맞추어 점차 추천 성능의 연상 연결성 수준이 더욱 명확히 업그레이드됨을 알 수 있습니다.

통합 인프라를 다음 단계로 확장하기

인덱스 비디오 라이브러리 스마트 동기화 및 갱신관리

시스템의 전체 누적 비디오 보관 볼륨 자체가 확대될수록, 실시간 서치에 기여하는 벡터 인덱스의 지속적 업데이트 주기가 중요도를 더하게 됩니다. Mosaic AI Vector Search는 원본 Delta 테이블 변화에 동기화 처리를 지능적으로 엮어내어 최신 추천 정량도를 상시 보전해 줍니다.

안정적 동기화 구축을 위한 주요 아키텍처 가이드라인:

  1. 증분 데이터 변경 처리(Incremental updates): Delta Lake의 Change Data Feed 옵션을 써서 전체 테이블을 다시 빌드하지 않고 수시로 갱신 또는 추가된 내용량만 알짜로 수집 및 인덱싱합니다.

  2. 스케줄 동기화: Databricks의 스케줄러 오케스트레이션 구동 장치로 정규 가동 부하가 낮은 주기를 설정해 백그라운드에서 주기적으로 정리 배치 동기화를 가동합니다.

  3. 실시간 업데이트 파이프라인: 실시간 추천이 절실한 비즈니스 요건이면, Databricks Mosaic AI의 스트리밍 기술을 도입해 실시간으로 데이터 밀집 작업을 순차 반영시킵니다.

  4. 버전 롤백 관리: Delta Lake 안의 시간 여행(Time-travel) 추적을 활용해 이전 벡터 상태 히스토리를 버전별 백업 보전해 유사시 스냅백 복원을 가능하게 만듭니다.

  5. 동기화 예찰 모니터링: 전체 싱크 주기 로그 수집기를 연계 구축하여 동기 상태 이상 감지 시 신속하게 복구 피드백을 전달할 알림 장치를 가미합니다.

이러한 운영 체계를 바탕으로 구성하면 축적 완료된 Twelve Labs 비디오 임베딩이 실 지체 없이 상시 동적 조율 상태를 뽐내며 강력함을 온전히 발산할 수 있습니다.

스케일 아웃 및 연산 최적화 공정

수백만 단위를 초과하는 대규모 비디오 분석 라이브러리를 가공해야 하는 비즈니스 볼륨에 다다르면 스케일 확장과 지연 시간 방어 최적화 영역이 최고 난제가 됩니다. Databricks가 선사하는 유연한 분산 클러스터 컴퓨팅과 Twelve Labs의 압도적인 초고속 분산 멀티모달 프레임 처리를 가미해 초대형 스케일 인프라를 지탱합니다.

이를 위해 추천 전술:

  1. 분산 파티션 병렬 연산: Databricks Spark 런타임 클러스터 모델 아키텍처하에 대용량 임베딩 생성 명령을 다중 분할 워커 노드별 파티션 덩어리로 조각내어 한 번에 병렬 연산해 줍니다.

  2. 전략적 캐시 정책: 누적 조회 수가 눈에 띄게 두드러지는 최정상 비디오 콘텐츠 임베딩 소스는 빠른 메모리 적재 영역에 할당 캐싱하여 불필요한 API 연산 단계를 크게 차단해 줍니다.

  3. 스마트 배치 세그먼트: 비업무 시간대에 자동 스케줄러로 대용량 변경분 임베딩 마이그레이션 백체 작업을 연대 처리하는 배치 인프라를 조성해 비용 로드를 주도적으로 경감합니다.

  4. 서치 쿼리 옵티마이징: 최적 효율 도출을 하도록 num_results 조절뿐 아니라, 전처리 스키마 필터링(Pre-filtering) 장치를 인가해 매칭 후보군 벡터 매치 모수를 쾌적하게 좁혀 나갑니다.

  5. 인덱스 샤딩/파티셔닝: 거대한 벡터 세그먼트는 내부 기준 키값에 따라 인덱스 파티셔닝 전략을 심어 디스크 탐색 세션을 가속 시켜 줍니다.

  6. 오토스케일링 분산 컴퓨팅: 수량 집중 등 가중 요인이 터질 시에 분산 워커 파워를 지능 단위로 가감하는 클러스터 오토스케일링 요소를 구성합니다.

  7. 엣지(Edge) 지향 하이브리드 연계: 레이턴시 극강 제어가 소모되는 모바일이나 특수 IoT 전단 인터페이스일 경우 엣지단 스마트 분배 전개 구도를 함께 설계합니다.

성공적으로 스케일링 전개 작업을 결합함으로써 인프라 부하 폭주 현상을 억제하며 늘어나는 대용량 요청을 미끄러지듯 유연하게 소화하는 견인력을 가꾸게 됩니다.

모니터링 체계와 데이터 애널리틱스

운영 중인 멀티모달 비디오 지능 분류 가치 체인이 정밀히 서빙되고 있는지 장기 점검을 보장하려면 지속적 모니터링 모듈과 통계 파이프라인 정착이 필수입니다. Databricks는 전반적 시스템 추이, 사용자 질의 행동 패턴, 검색 가치 도달율 등을 종합 감시할 일체형 측정 대시보드 뷰를 지원합니다.

집중 관리해야 할 감사 관점들:

  1. 하드웨어/인프라 성능 지표: 질의 처리 완료 지연 속도(latency), 원스톱 임베딩 파이싱 실행 소요 타임, 그리고 매일의 싱크 소요 경향 곡선 데이터를 트래킹합니다.

  2. 검색 사용자 인텔리전스: 질의 사용자가 보낸 실제 문구 패턴의 빈출 키워드 특징, 중점 도달 추천 레코드 세션에 대한 유저 수용 추세를 로깅해 인사이트를 건져 냅니다.

  3. 검색 추천 정합성 측정: 클릭 스루율(CTR) 등을 감안하는 정밀 피드백 밸브 계측 수단을 정착 시켜 벡터 검색 세트가 체감상 현실적인 품질을 수렴하고 있는지 수치 품질 계측(Metrics evaluation)을 시행합니다.

  4. 서버 리소스 활용비 모니터링: 전체 클라우드 사용량과 Twelve Labs API 연성 연산 통신 회수 요율 트래디셔널 곡선을 보며 서비스가 효율적 노선 비중으로 지출되고 있는지 점사합니다.

  5. 자동 에러 파서 얼럿: 미싱 필드나 호출 예외 등으로 인한 통합 연결 크래시 조짐 포착 시 인프라 담당자에 직접 소통 수단을 태깅할 무중단 관제 트리거를 설계합니다.

  6. 동적 A/B 테스팅 수행: Databricks의 풍부한 테스트 기능들로 마렝고(Marengo) 등 타겟 임베딩 모델의 에디션 변형 시나리오 변경 대조 실험 작업을 스위칭해 가며 가장 완벽한 유저 피팅 해법을 발굴합니다.

  7. 기대 비즈니스 지표 대조: 세련된 비디오 이해 기능 배치가 순수 서비스 체류 타임이나 유저 리텐션 증대 수치, 최종 도달성 등에 어떻게 연동 성과를 견인 중인지 비즈니스 가치 증빙(Impact metrics)을 엮어 봅니다.

  8. 개인보호 및 규제 컴플라이언스: 원본 파싱 파이프라인에서 민감 정보를 지우거나 보안적 프라이버시 조항이 누수되지 않도록 데이터 유통 필터를 모니터링에 함께 정비해 줍니다.

이로써 비디오 콘텐츠 이해 시스템이 실제로 발휘해 내는 시스템적 가치 지표와 업무 임팩트를 눈으로 입증할 지표 투명성이 확보됩니다. 이러한 데이터 중심 접근은 Twelve Labs의 압도적인 최신 비디오 임베딩 자산과 Databricks 데이터 인텔리전스 플랫폼의 파워가 일으키는 통합 비즈니스 레버리지를 증명하고 솔루션을 지속 개량할 영양분이 되어 줍니다.

결론

Twelve Labs와 Databricks Mosaic AI의 동맹은 방대하고 복잡한 비디오 콘텐츠 데이터 세트에서 무궁무진한 고해상도 인사이트를 분석 및 추론할 혁신적 마스터 돌파구를 선사합니다. 이 기술 통합은 세부 멀티모달적 미학까지 짚어내는 임베딩 능력과 압도적으로 쾌적하고 신속한 Vector Search의 결합을 바탕으로, 비디오 중심의 시맨틱 검색, 추천 시스템을 더 높은 차원으로 리드해 줍니다.

본 가이드는 첫 단추인 작업 도구 인프라 배치부터 임베딩 확보, 인덱스 동기 유지 및 실 구현체로서의 유사 검색 시스템 구축에 걸쳐 실제 프로덕션 단계의 스케일 확장론까지 일목요연하게 다루었습니다.

더 정교하고 방대해지는 디지털 미디어 파이프라인 속에서 핵심 유저 기호를 통찰하고 실 비디오 내용 속성 정보를 의미 수준으로 파악해 내는 기법은 그야말로 강력한 경쟁력을 뜻합니다. 이 통합 시스템을 활용해 귀사 고유의 비즈니스 지평에 맞추어 독창적인 인공지능 비디오 가치 시스템을 펼쳐 보시기 바랍니다. 지속해서 성장하는 개방형 비디오 AI 엔지니어 생태계에서 고차원의 기여와 함께 혁신의 주역으로 발돋움해 보시기를 진심으로 격려합니다.

추가 리소스

본 통합 아키텍처에 깊이를 늘려 줄 풍부한 외부 가이드를 아래에 첨부해 둡니다.

  1. Twelve Labs 공식 문서 가이드

  2. Databricks Vector Search 상세 공식 설명서

  3. Databricks 커뮤니티 토론 포럼

  4. Twelve Labs 디스코드 글로벌 개발자 커뮤니티

이 유용한 지식 자원들과 소통 네트워크를 바탕으로 매주 달라지는 초연결 비디오 AI 기술 진화의 최전선에서 Twelve Labs와 Databricks의 능력을 온전히 누려 보세요.