파트너십
비디오 인텔리전스의 실현: TwelveLabs 멀티모달 임베딩 API와 오라클 데이터베이스 23ai 결합 튜토리얼
제임스 러, 매니쉬 마헤슈와리, 대니 니콜로풀로스, 알렉스 오웬, 윌 브레넌
개발자는 Twelve Labs Embed API를 Oracle Database 23ai와 통합하여 시각 및 오디오 정보를 모두 담은 멀티모달 비디오 임베딩을 Oracle 고유의 벡터 검색 인프라에 직접 저장할 수 있으며, 별도의 벡터 데이터베이스 없이 자연어로 이를 쿼리하는 의미론적 비디오 검색 애플리케이션을 빌드할 수 있습니다.
개발자는 Twelve Labs Embed API를 Oracle Database 23ai와 통합하여 시각 및 오디오 정보를 모두 담은 멀티모달 비디오 임베딩을 Oracle 고유의 벡터 검색 인프라에 직접 저장할 수 있으며, 별도의 벡터 데이터베이스 없이 자연어로 이를 쿼리하는 의미론적 비디오 검색 애플리케이션을 빌드할 수 있습니다.

목차
뉴스레터 구독하기
뉴스레터 구독하기
영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.
영상 이해 분야의 최신 기술 업데이트, 튜토리얼 및 인사이트를 받아보세요.
AI로 영상을 검색하고, 분석하고, 탐색하세요.
2025. 4. 3.
15분
링크 복사하기
통합 및 블로그 게시물 작업을 저희와 긴밀히 협력해 주신 Oracle 팀의 Maxwell Bauman, Douglas Hood, Sean Stacey, Malu Castellanos를 비롯한 여러 팀원분들께 깊은 감사를 드립니다!
멀티모달 비디오 이해와 엔터프라이즈급 벡터 검색 기능의 결합은 생성형 AI 애플리케이션의 상당한 진보를 의미합니다. 이 튜토리얼에서는 TwelveLabs의 최첨단 Embed API와 Oracle Database 23ai의 AI Vector Search를 통합하는 방법을 살펴봅니다. 이를 통해 개발자는 의미론적 이해(semantic understanding)를 바탕으로 비디오 콘텐츠를 저장, 분석 및 검색할 수 있는 강력한 솔루션을 구축할 수 있습니다.
본 가이드를 따라가며 이 두 가지 보완적 기술을 활용함으로써, 시각, 오디오 및 맥락적 요소의 풍부함을 고스란히 담아내는 동시에 견고한 데이터베이스 인프라의 이점까지 누릴 수 있는 정교한 비디오 검색 및 분석 애플리케이션의 구축 방법을 배우게 됩니다.
1 - 소개
TwelveLabs Embed API

TwelveLabs의 Embed API는 비디오 데이터를 고도로 정교한 벡터 표현(즉, 임베딩)으로 변환하여 비디오 이해의 패러다임을 바꿉니다. 단일 모달리티에 집중하는 기존 방식과 달리, TwelveLabs의 멀티모달 임베딩 기술은 시각적 표현, 음성 언어, 보디랭귀지 및 맥락적 관계를 매끄럽게 포착합니다. 저희는 비디오를 단순한 프레임별 처리 단계를 넘어 시간적 역동성을 지닌 고유한 매체로 다룹니다.
TwelveLabs의 통합 벡터 공간 기술은 여러 모달리티를 응집력 있는 하나의 표현으로 통합하여 음성, 시각적 요소, 맥락 사이의 풍부한 상호작용을 보존합니다. 이를 통해 미세한 차이까지 잡아내는 정교한 검색이 가능해지며, 대규모 비디오 라이브러리의 처리 시간은 획기적으로 줄어듭니다.
또한 유연한 비디오 분할 옵션을 제공하므로, 서로 다른 비디오 세그먼트로부터 여러 임베딩을 생성하거나 전체 비디오에 대해 단일 임베딩을 생성할 수 있습니다. 이를 통해 비디오 내의 특정 순간을 정밀하게 찾아낼 수 있습니다.
Oracle 23ai Vector Search 기능

TwelveLabs의 파트너인 Oracle은 융합 데이터베이스 전략의 핵심 기능으로서 AI Vector Search를 Oracle Database 23ai에 기본 탑재하였습니다. Oracle의 방식은 특화된 인덱스와 SQL 함수를 사용하여 고유한 벡터 저장 및 유사도 검색을 제공합니다. 사일로를 만드는 독립형 벡터 데이터베이스와 달리, Oracle은 벡터 기능을 관계형 데이터베이스에 직접 통합하여 구조화된 데이터와 비구조화된 데이터 전체를 아우르는 원활한 쿼리를 지원합니다.
이 시스템은 다양한 거리 측정 방식(코사인, 유클리드, 유클리드 제곱, 내적, 맨해튼, 해밍, 자카드)을 지원하여 사용 사례의 요구 사항에 맞춰 유사도를 정의할 수 있는 유연성을 제공합니다. 대규모 환경에 최적화되어 있어 수백만 개의 레코드가 있는 상황에서도 벡터 검색이 효율적으로 유지되므로 즉시 프로덕션 단계에 적용할 수 있습니다.
Oracle의 입증된 기존 인프라 내에 벡터를 통합함으로써, 개발자는 익숙한 SQL 구문과 기존 보안 모델을 그대로 사용하면서 동시에 최첨단 AI 기능을 활용할 수 있습니다. 이로 인해 별도의 특화된 시스템이 필요하지 않으므로 전반적인 데이터 아키텍처의 복잡성이 줄어듭니다.
통합의 비즈니스 가치
Oracle Database 23ai와의 통합은 벡터 임베딩과 관계형 데이터 저장을 일원화하여 아키텍처를 단순화함으로써 상당한 비즈니스 가치를 제공합니다. 이를 통해 서로 다른 시스템 간의 동기화 과정이 생략되므로 데이터 불일치 문제와 유지보수 비용을 줄일 수 있습니다. 또한 관계형 DB와 벡터 저장소에 개별 쿼리를 보낸 후 결과를 합쳐야 하는 복잡성이 사라져 쿼리가 단순해지고 대기 시간이 단축되어 더 빠른 결과를 제공합니다.
이 솔루션은 사용자가 키워드가 아닌 의미를 바탕으로 콘텐츠를 찾는 의미론적 비디오 검색을 가능하게 하여 검색 정확도를 높이고 텍스트나 시각적 콘텐츠를 활용한 크로스 모달 쿼리를 지원합니다.
Oracle의 엔터프라이즈급 신뢰성, 보안성 및 확장성을 활용하여 프로덕션 배포를 위한 탄탄한 기반을 제공합니다. 기업은 미션 크리티컬 워크로드용으로 설계된 Oracle Database 기술을 활용하여 안심하고 비디오 이해 기술을 도입할 수 있으며, 데이터 볼륨이 증가하더라도 벡터 연산의 효율성은 그대로 유지됩니다.
또한 이번 통합을 통해 비디오 콘텐츠를 대상으로 하는 고급 분석이 가능하므로, 수동 검토나 기존의 처리 방식으로는 감지할 수 없었던 패턴과 인사이트를 기업이 발굴할 수 있도록 지원합니다.
이 튜토리얼은 인프라 설정부터 정교한 비디오 검색 애플리케이션 구축에 이르기까지 실무적인 구현 방법을 다루며, 실제 비즈니스 가치를 창출하는 지능형 비디오 애플리케이션을 개발하는 데 필요한 포괄적인 지식을 제공합니다.
2 - Oracle Autonomous Database 생성
Oracle Cloud 설정
https://www.oracle.com/cloud/free/에서 Oracle Cloud 프리 티어 계정에 가입하세요. 30일 동안 사용할 수 있는 $300의 무료 크레딧과 상시 무료(Always Free) 서비스가 제공됩니다. 신용카드는 본인 인증용으로만 사용됩니다.
데이터베이스 생성
https://cloud.oracle.com/db/adb에 로그인합니다.
Oracle Database → Autonomous Data Warehouse로 이동합니다.
"Autonomous Database 생성(Create Autonomous Database)"을 클릭합니다.
설정 구성
표시 이름(Display name): "VideoEmbeddingsDB" (최대 14자)
워크로드 유형(Workload type): 데이터 웨어하우스(Data Warehouse)
배포 유형(Deployment): 서버리스(Serverless)
필수 구성 사항
데이터베이스 버전: 벡터 기능을 올바르게 사용하려면 "23ai"를 선택하세요.
"상시 무료(Always Free)" 옵션을 선택합니다 (2 OCPU, 20GB 스토리지 제공).
참고: 데이터베이스는 7일 동안 사용하지 않으면 자동으로 중지되지만, 30일 이내에 계속해서 사용하는 한 영구적으로 무료로 유지됩니다.
관리자 비밀번호 설정
ADMIN 사용자를 위한 강력한 비밀번호(12~30자, 대문자, 소문자, 숫자, 특수문자 포함)를 생성합니다.
네트워크 액세스
개발 목적 설정: "어디서나 보안 액세스 허용(Allow secure access from everywhere)"을 선택합니다.
데이터베이스 생성
"Autonomous Database 생성"을 클릭합니다. 프로비저닝에는 2~5분이 소요됩니다. 상태가 "사용 가능(Available)"으로 바뀔 때까지 기다립니다.
연결 월렛(Wallet) 다운로드
데이터베이스 상세 페이지로 이동합니다.
"데이터베이스 접속(Database Connection)" → "월렛 다운로드(Download Wallet)"를 클릭합니다.
월렛 비밀번호를 설정합니다.
다운로드한 월렛 ZIP 파일을 안전하게 저장합니다.
애플리케이션에서 ORACLE_DB_WALLET_PATH 변수에 이 월렛 경로를 제공하여 사용합니다.
이제 데이터베이스가 Twelve Labs Embed API와 통합할 준비를 마쳤습니다. 다음 단계에서는 필요한 환경 변수를 설정하겠습니다.
3 - 사전 요구 사항 및 환경 변수 설정
TwelveLabs Embed API를 Oracle Database 23ai와 통합하기 전에 필수 도구와 인증 정보가 준비되었는지 확인하세요. 이 섹션에서는 필요한 소프트웨어 설치와 환경 구성 방법을 다룹니다.
필수 소프트웨어 설치
이 튜토리얼을 성공적으로 완료하려면 다음이 필요합니다.
AI Vector Search 기능이 탑재된 Oracle Database 23.4 이상 버전
개발 장비에 설치된 Python 3.8 이상 버전
데이터베이스 연결을 위한 Oracle Client 라이브러리
Embed API 액세스를 위한 TwelveLabs API 키
필요한 Python 패키지를 설치합니다.
oracledb 패키지는 Python과 Oracle Database 간의 연결을 제공하며, twelvelabs 패키지는 Twelve Labs API 서비스에 빌드할 수 있는 편리한 인터페이스를 제공합니다.
환경 구성
연결 인증 정보를 안전하게 보관할 수 있도록 다음 환경 변수를 설정하세요.
export ORACLE_DB_USERNAME=your_username export ORACLE_DB_PASSWORD=your_password export ORACLE_DB_CONNECT_STRING=your_connect_string export ORACLE_DB_WALLET_PATH=/path/to/wallet export TWELVE_LABS_API_KEY
자리 표시자 값들을 실제 인증 정보로 변경하세요.
your_username: 데이터베이스 사용자 이름 (신규 Autonomous Database의 경우 보통 ADMIN)
your_password: 데이터베이스 프로비저닝 시 생성한 비밀번호
your_connect_string: 다운로드한 월렛 내 tnsnames.ora 파일에 정의된 서비스 이름
/path/to/wallet: Oracle 월렛 압축 파일을 해제한 디렉터리 경로
your_api_key: 개발자 포털에서 발급받은 TwelveLabs API 키
4 - 데이터베이스 스키마 설정
이 구문에서는 TwelveLabs를 통해 생성되는 비디오 임베딩을 저장하고 쿼리하는 데 필요한 데이터베이스 스키마를 생성하겠습니다. 연결을 수립하고 알맞은 벡터 인덱스를 명시한 테이블 구조를 생성하는 Python 스크립트를 구현 및 실행합니다.
Oracle Database 연결
create_schema_video_embeddings.py 스크립트는 이전 섹션에서 설정한 환경 변수를 바탕으로 Oracle Database 인스턴스와의 연결을 제어합니다. 이 스크립트의 핵심 구성 요소를 살펴보겠습니다.
import oracledb # Connect to Oracle Database 23.7 with oracledb.connect( user=db_username, password=db_password, dsn=db_connect_string, config_dir=db_wallet_path, wallet_location=db_wallet_path, wallet_password=db_password ) as connection: # Script operations will go here
비디오 임베딩 저장을 위한 테이블 생성
스크립트는 다음과 같은 구조를 가진 video_embeddings 테이블을 생성합니다.
CREATE TABLE video_embeddings ( id VARCHAR2(100) PRIMARY KEY, video_file VARCHAR2(1000), start_time NUMBER, end_time NUMBER, embedding_vector VECTOR(1024, float64) )
이 테이블에 포함되는 열은 다음과 같습니다.
id: 각 임베딩의 고유 식별자video_file: 원본 비디오 파일명 또는 경로start_time및end_time: 비디오 세그먼트의 시작 및 종료 타임스탬프 정보embedding_vector: Twelve Labs 임베딩을 저장하기 위한 float64 정밀도의 1024차원 벡터
벡터 인덱스 설정
테이블 생성 작업이 끝나면 create_vector_index를 호출하여 유사도 검색 효율을 높여줄 벡터 인덱스를 만듭니다. 여기서는 95%의 목표 정확도와 코사인 유사도(DISTANCE COSINE)를 활용합니다.
def create_vector_index(cursor): cursor.execute(""" CREATE VECTOR INDEX video_embeddings_idx ON video_embeddings(embedding_vector) ORGANIZATION NEIGHBOR PARTITIONS DISTANCE COSINE WITH TARGET ACCURACY 95 """)
스키마 생성 스크립트 실행
스키마 생성 스크립트를 실행합니다.
이 스크립트는 다음 작업을 순차적으로 수행합니다.
Oracle 데이터베이스 인스턴스에 접속합니다.
기존 테이블이 존재할 경우 이를 삭제(Drop)합니다.
새로운
video_embeddings테이블을 생성합니다.정의해 둔 벡터 인덱스를 생성합니다.
정상적으로 생성이 완료되었음을 콘솔 출력으로 확인합니다.
스키마 설정이 완료됨으로써, TwelveLabs 비디오 임베딩을 Oracle Database 23ai 인스턴스에 저장하고 쿼리할 수 있는 기반이 마련되었습니다.
5 - 비디오 임베딩 저장
데이터베이스 스키마 설정을 마쳤다면, 다음으로 비디오를 TwelveLabs Embed API로 처리하여 생성된 임베딩을 Oracle Database에 저장해야 합니다. store_video_embeddings.py 스크립트는 임베딩 생성과 데이터베이스 저장을 모두 유기적으로 관리하며 이 전 과정을 완벽히 처리합니다.
스크립트 워크플로에 대한 이해
이 스크립트는 다음과 같은 핵심 태스크를 실행합니다.
환경 변수 정보를 통해 Oracle Database에 연결합니다.
API 키를 사용하여 TwelveLabs 클라이언트를 초기화합니다.
TwelveLabs의 Marengo 모델을 활용해 비디오의 임베딩을 생성합니다.
생성된 임베딩을 준비된 데이터베이스 테이블에 저장합니다.
중복 작업을 방지하기 위해 이미 처리된 비디오 기록을 파일로 유지 관리합니다.
h2 id="179">
핵심 함수
임베딩 생성하기
def create_video_embeddings(client, video_file): """Create embeddings for a video file using Twelve Labs Marengo""" task = client.embed.task.create( model_name=EMBEDDING_MODEL, video_file=video_file, video_clip_length=SEGMENT_DURATION ) print(f"Created task: id={task.id} model_name={EMBEDDING_MODEL} status={task.status}") status = task.wait_for_done( sleep_interval=2, callback=on_task_update ) print(f"Embedding done: {status}") return task.id
이 함수는 비디오 파일을 TwelveLabs에 업로드하며, 플랫폼은 Marengo 2.7 모델을 구성하여 비디오를 가공하기 시작합니다. 비디오는 6초 길이의 구간 클립 단위로 분할되며(SEGMENT_DURATION 상수로 커스텀 설정 가능), 각 세그먼트마다 별도의 임베딩 벡터가 추출됩니다. 작업 처리가 종료되면 함수는 추출된 임베딩 결과물을 받아오는 데 사용되는 task ID 값을 반환합니다.
임베딩 저장하기
def store_embeddings_in_db(connection, task_id, video_file): """Store video embeddings in Oracle DB""" # Get embeddings from the task task = twelvelabs_client.embed.task.retrieve(task_id) # Get embeddings from the task if not task.video_embedding or not task.video_embedding.segments: print("No embeddings found") return insert_sql = """ INSERT INTO video_embeddings ( id, video_file, start_time, end_time, embedding_vector ) VALUES ( :1, :2, :3, :4, :5 )""" BATCH_SIZE = 1000 data_batch = [] # Process in batches of 1000 for efficiency with connection.cursor() as cursor: for idx, segment in enumerate(task.video_embedding.segments): id = f"{task_id}_{idx}" vector = array.array("f", segment.embeddings_float) data_batch.append([ id, video_file, segment.start_offset_sec, segment.end_offset_sec, vector ]) # Execute and commit every BATCH_SIZE rows if len(data_batch) >= BATCH_SIZE: print("insert data") cursor.executemany(insert_sql, data_batch) connection.commit() data_batch = [] # Insert any remaining rows if data_batch: print("insert data final") cursor.executemany(insert_sql, data_batch) connection.commit() print(f"Stored {len(task.video_embedding.segments)} embeddings in database")
이 함수는 TwelveLabs가 추출 완료한 임베딩을 내려받아 Oracle Database에 입력합니다. 각 개별 임베딩 레코드는 다음 메타데이터를 함께 저장합니다.
작업 ID와 세그먼트 시퀀스가 조합된 유니크 ID
원본 소스 비디오 파일의 이름
해당 세그먼트의 시작 및 종료 지점을 알리는 타임스탬프 정보
1024차원의 정밀한 임베딩 벡터 데이터 자체
데이터베이스 인서트를 최적화된 성능으로 다루기 위해, 1,000개 단위의 배치 배치 데이터로 묶어 처리하게 됩니다.
Task ID 파일 수명 관리
def load_task_ids(): """Load existing task IDs from JSON file""" try: with open('video_task_ids.json', 'r') as f: return json.load(f) except FileNotFoundError: return {}
스크립트는 로컬 디렉터리에 비디오의 처리 경로와 TwelveLabs 작업 ID 매핑 정보를 보관하는 video_task_ids.json 백업 파일을 생성하고 읽기 작업을 진행합니다. 이를 통해 이미 임베딩 완료된 비디오의 불필요한 이중 분석 연산을 스킵하여 실행 소요 시간과 불필요한 API 파이프라인 호출 비용을 절약합니다. 만약 특정 비디오를 다시 가공해 임베딩을 새로 넣고 싶다면, JSON 맵 대응 항목을 삭제하거나 해당 캐시 파일을 지우면 됩니다.
코드 스크립트 실행하기
이 모듈은 두 가지 방식으로 구동할 수 있습니다.
단일 비디오 처리 모드:
디렉터리 내 전체 비디오 스캔 모드:
디렉터리 모드로 작동 시, 스크립트는 내부적인 화이트리스트 확장자 필터링(.mp4, .avi, .mov, .mkv, .webm)을 가동하여 부합하는 모든 대상 파일을 감지하고 프로세스 파이프라인에 주입합니다.
진행 상황 모니터링
수행하는 동안 터미널 콘솔 로그에 다음 실시간 정보가 지속 업데이트됩니다.
Oracle Database 연결 상태 및 확인 로그
TwelveLabs API를 통한 작업 등록 및 라이브 테일링 처리 상황
배치 적재 커밋 수량을 포함한 DB 임베딩 저장 경과
모든 데이터의 저장이 완료되었음을 알리는 요약 세부 요약 피드백
완료 신호가 뜨면, 이제 비디오 임베딩이 video_embeddings 스키마에 입체적으로 세팅되어 언제든 의미 검색을 시작할 준비를 끝내게 됩니다. 다음 장에서는 이 임베딩 저장소를 쿼리하는 방법을 알아보겠습니다.
6 - 비디오 임베딩 쿼리하기
임베딩 구조를 Oracle Database 23ai로 셋업하고 난 후 발휘되는 진정한 강점은 바로 자연어로 전체 컬렉션을 자유롭게 서칭할 수 있다는 점입니다. query_video_embeddings.py 파이썬 코드는 단순 텍스트 키워드 매칭을 극복하여 문장의 참뜻과 미디어 맥락에 적합한 최적의 순간들을 인지하고 결과를 전달해 줍니다.
기본 세만틱 유사도 검색
검색의 중추 역할을 수행하는 핵심 쿼리 구문은 아래 코드 부분에 녹아 있습니다.
SELECT video_file, start_time, end_time FROM video_embeddings ORDER BY vector_distance(embedding_vector, :1, COSINE) FETCH FIRST :2 ROWS ONLY
이 검색 질의문은 오라클이 네이티브하게 최적화 지원하는 vector_distance 구문과 COSINE 비교 평가 로직을 적용한 뒤, 파라미터로 입력된 문장의 인코딩 벡터를 DB 내 모든 컬렉션과 계산 매칭합니다. 정렬 방식을 통해 가깝고 점수가 높은 유사 값 우선순위 상위 2개의 목록을 응답합니다.
주요 핵심 로직 설명
이 스크립트는 보다 원활하고 정확하게 정보를 탐색할 수 있도록 보조하는 몇 개의 기능 모듈로 나뉩니다.
텍스트 구문의 임베딩 실시간 생성
def similarity_search(connection, query_text): # Create embedding for query embedding = twelvelabs_client.embed.create( model_name=EMBEDDING_MODEL, text=query_text, text_truncate="start", ) if len(embedding.text_embedding.segments) > 1: print(f"Warning: Query generated {len(embedding.text_embedding.segments)} segments. Using only the first segment.") query_vector = array.array("d", embedding.text_embedding.segments[0].embeddings_float) # Search query search_sql = """ SELECT video_file, start_time, end_time FROM video_embeddings ORDER BY vector_distance(embedding_vector, :1, COSINE) FETCH FIRST :2 ROWS ONLY """ results = [] cursor = connection.cursor() cursor.execute(search_sql, [query_vector, TOP_K]) for row in cursor: results.append({ 'video_file': row[0], 'start_time': row[1], 'end_time': row[2] }) cursor.close() return results
입력된 질문 문자열을 Twelve Labs API로 실시간 보내어 어휘 맥락의 수치적 매트릭스 정보를 반환받습니다. 길이가 긴 질의어 텍스트 문장의 경우에는 시스템이 문장의 앞단 우선으로 의미를 효과적으로 조율해 나가는 절단 전처리 기법(text_truncate="start")이 동작하므로 매끄러운 쿼리가 가능해집니다.
멀티 쿼리 병렬 배치 처리 기법
def similarity_search_multiple(connection, query_texts, batch_size=1000): """Perform multiple similarity searches using a list of query texts in batches""" results_by_query = {} # Process queries in batches for i in range(0, len(query_texts), batch_size): batch_queries = query_texts[i:i + batch_size] print(f"\nProcessing batch {i//batch_size + 1} ({len(batch_queries)} queries)") # Create embeddings for batch queries embeddings = [] for query_text in batch_queries: embedding = twelvelabs_client.embed.create( model_name=EMBEDDING_MODEL, text=query_text, text_truncate="start", ) if len(embedding.text_embedding.segments) > 1: print(f"Warning: Query '{query_text}' generated {len(embedding.text_embedding.segments)} segments. Using only the first segment.") query_vector = array.array("d", embedding.text_embedding.segments[0].embeddings_float) embeddings.append(query_vector) # Search query search_sql = """ SELECT video_file, start_time, end_time FROM video_embeddings ORDER BY vector_distance(embedding_vector, :1, COSINE) FETCH FIRST :2 ROWS ONLY """ with connection.cursor() as cursor: for query_text, query_vector in zip(batch_queries, embeddings): results = [] for row in cursor.execute(search_sql, [query_vector, TOP_K]): results.append({ 'video_file': row[0], 'start_time': row[1], 'end_time': row[2] }) results_by_query[query_text] = results return results_by_query
동시다발적인 멀티플 검색 질의가 일어나는 상황 하에서 최고의 운용을 보여주는 함수로, 커넥션 풀 경유 횟수와 트래픽 부하를 상당량 감소시켜 줍니다. 구조화된 맵 구조 딕셔너리에 쿼리와 아웃풋을 고유 키로 격리 보관하므로 쉽게 원하는 레코드를 모니터링할 수 있습니다.
관계형 DB 접속 세션 관리
def query_video_embeddings(query_text): connection = oracledb.connect( user=db_username, password=db_password, dsn=db_connect_string, config_dir=db_wallet_path, wallet_location=db_wallet_path, wallet_password=db_password ) # Verify DB version db_version = tuple(int(s) for s in connection.version.split("."))[:2] if db_version < (23, 7): sys.exit("This example requires Oracle Database 23.7 or later") print("Connected to Oracle Database") print("\nSearching for relevant video segments...") results = similarity_search(connection, query_text) print("\nResults:") print("========") for r in results: print(f"Video: {r['video_file']}") print(f"Segment: {r['start_time']:.1f}s to {r['end_time']:.1f}s\n")
이 모듈은 이전에 선언해 둔 환경 변수 리스트를 바탕으로 보안 인증과 안정적인 연결 유지를 지탱해 줍니다.
코드로 텍스트 검색 실행해 보기
전체 동영상 데이터베이스에서 탐색해 보고 싶은 명사나 형용사 구문을 나열해 실행 인자로 전달합니다.
python3 query_video_embeddings.py "people dancing at a party" "someone explaining AI concepts"
개수 제한 없이 다수의 질문 입력이 가능하며, 엔진은 다음 단계를 백그라운드에서 신속하게 전개해 나갑니다.
Twelve Labs Marengo-2.7 최첨단 연산 모델을 타고 텍스트 정보를 벡터 임베딩 수치 배열로 실시간 변조합니다.
기초 테이블 내 모든 세그먼트 벡터값들과 코사인 연산을 수행해 유사 점수를 산출합니다.
이 중 매칭 감도가 극대화된 최고 매칭 2점을 걸러내어 정리해 줍니다.
결과 시각화 확인하기
해당 결과를 보기 편한 기본 리포트 포맷 형태로 정렬해 단말에 뿌려 줍니다.
Connected to Oracle Database Searching for relevant video segments... Results: ======== Query: 'people dancing at a party' ---------------------------------- Video: birthday_celebration.mp4 Segment: 15.0s to 21.0s Video: summer_festival.mp4 Segment: 45.5s to 51.5s Query: 'someone explaining AI concepts' -------------------------------------- Video: tech_lecture.mp4 Segment: 120.0s to 126.0s Video: developer_conference.mp4 Segment: 75.5s to 81
제공된 문장 마다 완벽 매칭된 동영상 클립 구간의 타임스탬프 스탬프 정보가 표기되므로, 작업자는 기나긴 클립에서 원하는 위치를 바로 재생해 확인할 수 있습니다.
코사인 정밀 벡터 기술이 유감없이 기여하는 원리 덕분에, 단순 자막 음성이나 영상 프레임 캡션에 본인이 넣은 문자 어휘가 활자로 직접 들어가 있지 않은 간접 묘사일지라도 행동 연출 형태나 상황을 꿰뚫어 가장 올바른 정답 타겟 지점 구간을 훌륭하게 반환해 줍니다.
7 - 결론
TwelveLabs Embed API와 Oracle Database 23ai의 결합은 비디오 인지와 검색 기능 전반에 걸친 큰 이정표입니다. 당사의 고도화된 멀티모달 프레임워크에 오라클의 완성도 높은 하드웨어 통합 벡터 시스템을 얹음으로써, 인력 감상 관점에 가장 가까운 지식 이해도를 구현한 명품 서비스 소프트웨어를 단숨에 시장에 내놓을 수 있게 되었습니다.
독보적인 비즈니스 효용
이 합작 통합 모델은 글로벌 비즈니스 기업에 막강한 장점을 제공합니다.
비교 불허의 비디오 검색: 단순한 자구 검색을 비웃듯, 자연어 본뜻 중심의 극적인 의미론적 비디오 검색 가치를 선사하며 고객 인게이지먼트를 자극하고 새로운 아카이브 발견의 장을 엽니다.
통합의 인프라 극대화: 오라클이 주도하는 단일 원 팀 플랫폼 콘셉트 하에, 별개의 하이브리드 엔진 아키텍처 다수를 겹겹이 두를 필요를 원칙적으로 끊어내어 복잡 요소는 누르고 유연한 확장과 강력한 보안 가치를 영위합니다.
혁신의 주도권 선점: 최선두의 동영상 AI 기술력을 인프라에 녹여내어 비즈니스 경쟁 기업 대비 완벽한 상품 및 기술 리더십 격차를 견고하게 벌릴 기회를 소유하게 됩니다.
기술적 어드밴티지
제품 개발 개발팀에 제공하는 기회는 다음과 같습니다.
물 흐르듯 명쾌해지는 개발 루틴: 단 하나의 백엔드 콘셉트 스택을 사용하므로, 복잡하고 귀찮던 쿼리 제어 단계가 극적으로 한눈에 줄어들어 개발 연동 및 워크플로 효율이 배가 됩니다.
초고성능 비디오 서칭 처리 속도: TwelveLabs의 시그니처 정밀 임베딩 배열이 오라클 고유의 벡터 로직을 만나, 테라바이트급 라이브러리 전체 데이터 속에서도 눈 깜짝할 사이에 정답 행들을 뽑아내 줍니다.
신뢰받는 스케일업 파워: Oracle Cloud Infrastructure(OCI) 환경에서 단련하고 검증을 끝낸 당사의 비디오 파운데이션 모델들을 이용하므로 상시 고품질 수준의 프로덕션 안전성을 장담합니다.
완벽한 협업 연합 가치
TwelveLabs와 오라클은 보이지 않는 저변에서부터 강력하게 묶여 있습니다. 당사는 차세대 미디어 시장을 뒤바꿀 파운데이션 인공지능 모델 훈련 연산 기틀로 검증된 OCI 기술 인프라를 채택했습니다. 이는 사람이 보고 이해하는 직관을 한 차원 뛰어넘은 독창적인 모델의 고속 탄생을 가능하게 했습니다. TwelveLabs의 Embed API와 Oracle Database 23ai의 우수성을 융합함으로써 혁신적 기술이 어떻게 완벽한 사업 기회를 만드는지 온전히 시장에 증명해 보였습니다.
결론적으로, 이번 연동 개발은 기존 미디어 디지털 아카이브 자산의 참된 활용 가치를 200% 끌어올리고자 준비하는 현명한 제품 설계자 및 소프트웨어 기업에 엄청난 돌파구를 선사합니다. 양사의 강력한 시너지가 선도하는 차세대 비디오 인사이트 비즈니스의 미래를 직접 현장에서 검증해 보십시오.
참고 자료 리스트
전체 실행 코드가 담긴 GitHub 레포지토리: https://github.com/twelvelabs-io/twelvelabs-developer-experience/tree/main/integrations/Oracle
TwelveLabs Embed API 기술 상세 명세 가이드: https://docs.twelvelabs.io/v1.3/docs/guides/create-embeddings/video
Oracle AI Vector Search 심층 유저 공식 매뉴얼: https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/overview-node.html
통합 및 블로그 게시물 작업을 저희와 긴밀히 협력해 주신 Oracle 팀의 Maxwell Bauman, Douglas Hood, Sean Stacey, Malu Castellanos를 비롯한 여러 팀원분들께 깊은 감사를 드립니다!
멀티모달 비디오 이해와 엔터프라이즈급 벡터 검색 기능의 결합은 생성형 AI 애플리케이션의 상당한 진보를 의미합니다. 이 튜토리얼에서는 TwelveLabs의 최첨단 Embed API와 Oracle Database 23ai의 AI Vector Search를 통합하는 방법을 살펴봅니다. 이를 통해 개발자는 의미론적 이해(semantic understanding)를 바탕으로 비디오 콘텐츠를 저장, 분석 및 검색할 수 있는 강력한 솔루션을 구축할 수 있습니다.
본 가이드를 따라가며 이 두 가지 보완적 기술을 활용함으로써, 시각, 오디오 및 맥락적 요소의 풍부함을 고스란히 담아내는 동시에 견고한 데이터베이스 인프라의 이점까지 누릴 수 있는 정교한 비디오 검색 및 분석 애플리케이션의 구축 방법을 배우게 됩니다.
1 - 소개
TwelveLabs Embed API

TwelveLabs의 Embed API는 비디오 데이터를 고도로 정교한 벡터 표현(즉, 임베딩)으로 변환하여 비디오 이해의 패러다임을 바꿉니다. 단일 모달리티에 집중하는 기존 방식과 달리, TwelveLabs의 멀티모달 임베딩 기술은 시각적 표현, 음성 언어, 보디랭귀지 및 맥락적 관계를 매끄럽게 포착합니다. 저희는 비디오를 단순한 프레임별 처리 단계를 넘어 시간적 역동성을 지닌 고유한 매체로 다룹니다.
TwelveLabs의 통합 벡터 공간 기술은 여러 모달리티를 응집력 있는 하나의 표현으로 통합하여 음성, 시각적 요소, 맥락 사이의 풍부한 상호작용을 보존합니다. 이를 통해 미세한 차이까지 잡아내는 정교한 검색이 가능해지며, 대규모 비디오 라이브러리의 처리 시간은 획기적으로 줄어듭니다.
또한 유연한 비디오 분할 옵션을 제공하므로, 서로 다른 비디오 세그먼트로부터 여러 임베딩을 생성하거나 전체 비디오에 대해 단일 임베딩을 생성할 수 있습니다. 이를 통해 비디오 내의 특정 순간을 정밀하게 찾아낼 수 있습니다.
Oracle 23ai Vector Search 기능

TwelveLabs의 파트너인 Oracle은 융합 데이터베이스 전략의 핵심 기능으로서 AI Vector Search를 Oracle Database 23ai에 기본 탑재하였습니다. Oracle의 방식은 특화된 인덱스와 SQL 함수를 사용하여 고유한 벡터 저장 및 유사도 검색을 제공합니다. 사일로를 만드는 독립형 벡터 데이터베이스와 달리, Oracle은 벡터 기능을 관계형 데이터베이스에 직접 통합하여 구조화된 데이터와 비구조화된 데이터 전체를 아우르는 원활한 쿼리를 지원합니다.
이 시스템은 다양한 거리 측정 방식(코사인, 유클리드, 유클리드 제곱, 내적, 맨해튼, 해밍, 자카드)을 지원하여 사용 사례의 요구 사항에 맞춰 유사도를 정의할 수 있는 유연성을 제공합니다. 대규모 환경에 최적화되어 있어 수백만 개의 레코드가 있는 상황에서도 벡터 검색이 효율적으로 유지되므로 즉시 프로덕션 단계에 적용할 수 있습니다.
Oracle의 입증된 기존 인프라 내에 벡터를 통합함으로써, 개발자는 익숙한 SQL 구문과 기존 보안 모델을 그대로 사용하면서 동시에 최첨단 AI 기능을 활용할 수 있습니다. 이로 인해 별도의 특화된 시스템이 필요하지 않으므로 전반적인 데이터 아키텍처의 복잡성이 줄어듭니다.
통합의 비즈니스 가치
Oracle Database 23ai와의 통합은 벡터 임베딩과 관계형 데이터 저장을 일원화하여 아키텍처를 단순화함으로써 상당한 비즈니스 가치를 제공합니다. 이를 통해 서로 다른 시스템 간의 동기화 과정이 생략되므로 데이터 불일치 문제와 유지보수 비용을 줄일 수 있습니다. 또한 관계형 DB와 벡터 저장소에 개별 쿼리를 보낸 후 결과를 합쳐야 하는 복잡성이 사라져 쿼리가 단순해지고 대기 시간이 단축되어 더 빠른 결과를 제공합니다.
이 솔루션은 사용자가 키워드가 아닌 의미를 바탕으로 콘텐츠를 찾는 의미론적 비디오 검색을 가능하게 하여 검색 정확도를 높이고 텍스트나 시각적 콘텐츠를 활용한 크로스 모달 쿼리를 지원합니다.
Oracle의 엔터프라이즈급 신뢰성, 보안성 및 확장성을 활용하여 프로덕션 배포를 위한 탄탄한 기반을 제공합니다. 기업은 미션 크리티컬 워크로드용으로 설계된 Oracle Database 기술을 활용하여 안심하고 비디오 이해 기술을 도입할 수 있으며, 데이터 볼륨이 증가하더라도 벡터 연산의 효율성은 그대로 유지됩니다.
또한 이번 통합을 통해 비디오 콘텐츠를 대상으로 하는 고급 분석이 가능하므로, 수동 검토나 기존의 처리 방식으로는 감지할 수 없었던 패턴과 인사이트를 기업이 발굴할 수 있도록 지원합니다.
이 튜토리얼은 인프라 설정부터 정교한 비디오 검색 애플리케이션 구축에 이르기까지 실무적인 구현 방법을 다루며, 실제 비즈니스 가치를 창출하는 지능형 비디오 애플리케이션을 개발하는 데 필요한 포괄적인 지식을 제공합니다.
2 - Oracle Autonomous Database 생성
Oracle Cloud 설정
https://www.oracle.com/cloud/free/에서 Oracle Cloud 프리 티어 계정에 가입하세요. 30일 동안 사용할 수 있는 $300의 무료 크레딧과 상시 무료(Always Free) 서비스가 제공됩니다. 신용카드는 본인 인증용으로만 사용됩니다.
데이터베이스 생성
https://cloud.oracle.com/db/adb에 로그인합니다.
Oracle Database → Autonomous Data Warehouse로 이동합니다.
"Autonomous Database 생성(Create Autonomous Database)"을 클릭합니다.
설정 구성
표시 이름(Display name): "VideoEmbeddingsDB" (최대 14자)
워크로드 유형(Workload type): 데이터 웨어하우스(Data Warehouse)
배포 유형(Deployment): 서버리스(Serverless)
필수 구성 사항
데이터베이스 버전: 벡터 기능을 올바르게 사용하려면 "23ai"를 선택하세요.
"상시 무료(Always Free)" 옵션을 선택합니다 (2 OCPU, 20GB 스토리지 제공).
참고: 데이터베이스는 7일 동안 사용하지 않으면 자동으로 중지되지만, 30일 이내에 계속해서 사용하는 한 영구적으로 무료로 유지됩니다.
관리자 비밀번호 설정
ADMIN 사용자를 위한 강력한 비밀번호(12~30자, 대문자, 소문자, 숫자, 특수문자 포함)를 생성합니다.
네트워크 액세스
개발 목적 설정: "어디서나 보안 액세스 허용(Allow secure access from everywhere)"을 선택합니다.
데이터베이스 생성
"Autonomous Database 생성"을 클릭합니다. 프로비저닝에는 2~5분이 소요됩니다. 상태가 "사용 가능(Available)"으로 바뀔 때까지 기다립니다.
연결 월렛(Wallet) 다운로드
데이터베이스 상세 페이지로 이동합니다.
"데이터베이스 접속(Database Connection)" → "월렛 다운로드(Download Wallet)"를 클릭합니다.
월렛 비밀번호를 설정합니다.
다운로드한 월렛 ZIP 파일을 안전하게 저장합니다.
애플리케이션에서 ORACLE_DB_WALLET_PATH 변수에 이 월렛 경로를 제공하여 사용합니다.
이제 데이터베이스가 Twelve Labs Embed API와 통합할 준비를 마쳤습니다. 다음 단계에서는 필요한 환경 변수를 설정하겠습니다.
3 - 사전 요구 사항 및 환경 변수 설정
TwelveLabs Embed API를 Oracle Database 23ai와 통합하기 전에 필수 도구와 인증 정보가 준비되었는지 확인하세요. 이 섹션에서는 필요한 소프트웨어 설치와 환경 구성 방법을 다룹니다.
필수 소프트웨어 설치
이 튜토리얼을 성공적으로 완료하려면 다음이 필요합니다.
AI Vector Search 기능이 탑재된 Oracle Database 23.4 이상 버전
개발 장비에 설치된 Python 3.8 이상 버전
데이터베이스 연결을 위한 Oracle Client 라이브러리
Embed API 액세스를 위한 TwelveLabs API 키
필요한 Python 패키지를 설치합니다.
oracledb 패키지는 Python과 Oracle Database 간의 연결을 제공하며, twelvelabs 패키지는 Twelve Labs API 서비스에 빌드할 수 있는 편리한 인터페이스를 제공합니다.
환경 구성
연결 인증 정보를 안전하게 보관할 수 있도록 다음 환경 변수를 설정하세요.
export ORACLE_DB_USERNAME=your_username export ORACLE_DB_PASSWORD=your_password export ORACLE_DB_CONNECT_STRING=your_connect_string export ORACLE_DB_WALLET_PATH=/path/to/wallet export TWELVE_LABS_API_KEY
자리 표시자 값들을 실제 인증 정보로 변경하세요.
your_username: 데이터베이스 사용자 이름 (신규 Autonomous Database의 경우 보통 ADMIN)
your_password: 데이터베이스 프로비저닝 시 생성한 비밀번호
your_connect_string: 다운로드한 월렛 내 tnsnames.ora 파일에 정의된 서비스 이름
/path/to/wallet: Oracle 월렛 압축 파일을 해제한 디렉터리 경로
your_api_key: 개발자 포털에서 발급받은 TwelveLabs API 키
4 - 데이터베이스 스키마 설정
이 구문에서는 TwelveLabs를 통해 생성되는 비디오 임베딩을 저장하고 쿼리하는 데 필요한 데이터베이스 스키마를 생성하겠습니다. 연결을 수립하고 알맞은 벡터 인덱스를 명시한 테이블 구조를 생성하는 Python 스크립트를 구현 및 실행합니다.
Oracle Database 연결
create_schema_video_embeddings.py 스크립트는 이전 섹션에서 설정한 환경 변수를 바탕으로 Oracle Database 인스턴스와의 연결을 제어합니다. 이 스크립트의 핵심 구성 요소를 살펴보겠습니다.
import oracledb # Connect to Oracle Database 23.7 with oracledb.connect( user=db_username, password=db_password, dsn=db_connect_string, config_dir=db_wallet_path, wallet_location=db_wallet_path, wallet_password=db_password ) as connection: # Script operations will go here
비디오 임베딩 저장을 위한 테이블 생성
스크립트는 다음과 같은 구조를 가진 video_embeddings 테이블을 생성합니다.
CREATE TABLE video_embeddings ( id VARCHAR2(100) PRIMARY KEY, video_file VARCHAR2(1000), start_time NUMBER, end_time NUMBER, embedding_vector VECTOR(1024, float64) )
이 테이블에 포함되는 열은 다음과 같습니다.
id: 각 임베딩의 고유 식별자video_file: 원본 비디오 파일명 또는 경로start_time및end_time: 비디오 세그먼트의 시작 및 종료 타임스탬프 정보embedding_vector: Twelve Labs 임베딩을 저장하기 위한 float64 정밀도의 1024차원 벡터
벡터 인덱스 설정
테이블 생성 작업이 끝나면 create_vector_index를 호출하여 유사도 검색 효율을 높여줄 벡터 인덱스를 만듭니다. 여기서는 95%의 목표 정확도와 코사인 유사도(DISTANCE COSINE)를 활용합니다.
def create_vector_index(cursor): cursor.execute(""" CREATE VECTOR INDEX video_embeddings_idx ON video_embeddings(embedding_vector) ORGANIZATION NEIGHBOR PARTITIONS DISTANCE COSINE WITH TARGET ACCURACY 95 """)
스키마 생성 스크립트 실행
스키마 생성 스크립트를 실행합니다.
이 스크립트는 다음 작업을 순차적으로 수행합니다.
Oracle 데이터베이스 인스턴스에 접속합니다.
기존 테이블이 존재할 경우 이를 삭제(Drop)합니다.
새로운
video_embeddings테이블을 생성합니다.정의해 둔 벡터 인덱스를 생성합니다.
정상적으로 생성이 완료되었음을 콘솔 출력으로 확인합니다.
스키마 설정이 완료됨으로써, TwelveLabs 비디오 임베딩을 Oracle Database 23ai 인스턴스에 저장하고 쿼리할 수 있는 기반이 마련되었습니다.
5 - 비디오 임베딩 저장
데이터베이스 스키마 설정을 마쳤다면, 다음으로 비디오를 TwelveLabs Embed API로 처리하여 생성된 임베딩을 Oracle Database에 저장해야 합니다. store_video_embeddings.py 스크립트는 임베딩 생성과 데이터베이스 저장을 모두 유기적으로 관리하며 이 전 과정을 완벽히 처리합니다.
스크립트 워크플로에 대한 이해
이 스크립트는 다음과 같은 핵심 태스크를 실행합니다.
환경 변수 정보를 통해 Oracle Database에 연결합니다.
API 키를 사용하여 TwelveLabs 클라이언트를 초기화합니다.
TwelveLabs의 Marengo 모델을 활용해 비디오의 임베딩을 생성합니다.
생성된 임베딩을 준비된 데이터베이스 테이블에 저장합니다.
중복 작업을 방지하기 위해 이미 처리된 비디오 기록을 파일로 유지 관리합니다.
h2 id="179">
핵심 함수
임베딩 생성하기
def create_video_embeddings(client, video_file): """Create embeddings for a video file using Twelve Labs Marengo""" task = client.embed.task.create( model_name=EMBEDDING_MODEL, video_file=video_file, video_clip_length=SEGMENT_DURATION ) print(f"Created task: id={task.id} model_name={EMBEDDING_MODEL} status={task.status}") status = task.wait_for_done( sleep_interval=2, callback=on_task_update ) print(f"Embedding done: {status}") return task.id
이 함수는 비디오 파일을 TwelveLabs에 업로드하며, 플랫폼은 Marengo 2.7 모델을 구성하여 비디오를 가공하기 시작합니다. 비디오는 6초 길이의 구간 클립 단위로 분할되며(SEGMENT_DURATION 상수로 커스텀 설정 가능), 각 세그먼트마다 별도의 임베딩 벡터가 추출됩니다. 작업 처리가 종료되면 함수는 추출된 임베딩 결과물을 받아오는 데 사용되는 task ID 값을 반환합니다.
임베딩 저장하기
def store_embeddings_in_db(connection, task_id, video_file): """Store video embeddings in Oracle DB""" # Get embeddings from the task task = twelvelabs_client.embed.task.retrieve(task_id) # Get embeddings from the task if not task.video_embedding or not task.video_embedding.segments: print("No embeddings found") return insert_sql = """ INSERT INTO video_embeddings ( id, video_file, start_time, end_time, embedding_vector ) VALUES ( :1, :2, :3, :4, :5 )""" BATCH_SIZE = 1000 data_batch = [] # Process in batches of 1000 for efficiency with connection.cursor() as cursor: for idx, segment in enumerate(task.video_embedding.segments): id = f"{task_id}_{idx}" vector = array.array("f", segment.embeddings_float) data_batch.append([ id, video_file, segment.start_offset_sec, segment.end_offset_sec, vector ]) # Execute and commit every BATCH_SIZE rows if len(data_batch) >= BATCH_SIZE: print("insert data") cursor.executemany(insert_sql, data_batch) connection.commit() data_batch = [] # Insert any remaining rows if data_batch: print("insert data final") cursor.executemany(insert_sql, data_batch) connection.commit() print(f"Stored {len(task.video_embedding.segments)} embeddings in database")
이 함수는 TwelveLabs가 추출 완료한 임베딩을 내려받아 Oracle Database에 입력합니다. 각 개별 임베딩 레코드는 다음 메타데이터를 함께 저장합니다.
작업 ID와 세그먼트 시퀀스가 조합된 유니크 ID
원본 소스 비디오 파일의 이름
해당 세그먼트의 시작 및 종료 지점을 알리는 타임스탬프 정보
1024차원의 정밀한 임베딩 벡터 데이터 자체
데이터베이스 인서트를 최적화된 성능으로 다루기 위해, 1,000개 단위의 배치 배치 데이터로 묶어 처리하게 됩니다.
Task ID 파일 수명 관리
def load_task_ids(): """Load existing task IDs from JSON file""" try: with open('video_task_ids.json', 'r') as f: return json.load(f) except FileNotFoundError: return {}
스크립트는 로컬 디렉터리에 비디오의 처리 경로와 TwelveLabs 작업 ID 매핑 정보를 보관하는 video_task_ids.json 백업 파일을 생성하고 읽기 작업을 진행합니다. 이를 통해 이미 임베딩 완료된 비디오의 불필요한 이중 분석 연산을 스킵하여 실행 소요 시간과 불필요한 API 파이프라인 호출 비용을 절약합니다. 만약 특정 비디오를 다시 가공해 임베딩을 새로 넣고 싶다면, JSON 맵 대응 항목을 삭제하거나 해당 캐시 파일을 지우면 됩니다.
코드 스크립트 실행하기
이 모듈은 두 가지 방식으로 구동할 수 있습니다.
단일 비디오 처리 모드:
디렉터리 내 전체 비디오 스캔 모드:
디렉터리 모드로 작동 시, 스크립트는 내부적인 화이트리스트 확장자 필터링(.mp4, .avi, .mov, .mkv, .webm)을 가동하여 부합하는 모든 대상 파일을 감지하고 프로세스 파이프라인에 주입합니다.
진행 상황 모니터링
수행하는 동안 터미널 콘솔 로그에 다음 실시간 정보가 지속 업데이트됩니다.
Oracle Database 연결 상태 및 확인 로그
TwelveLabs API를 통한 작업 등록 및 라이브 테일링 처리 상황
배치 적재 커밋 수량을 포함한 DB 임베딩 저장 경과
모든 데이터의 저장이 완료되었음을 알리는 요약 세부 요약 피드백
완료 신호가 뜨면, 이제 비디오 임베딩이 video_embeddings 스키마에 입체적으로 세팅되어 언제든 의미 검색을 시작할 준비를 끝내게 됩니다. 다음 장에서는 이 임베딩 저장소를 쿼리하는 방법을 알아보겠습니다.
6 - 비디오 임베딩 쿼리하기
임베딩 구조를 Oracle Database 23ai로 셋업하고 난 후 발휘되는 진정한 강점은 바로 자연어로 전체 컬렉션을 자유롭게 서칭할 수 있다는 점입니다. query_video_embeddings.py 파이썬 코드는 단순 텍스트 키워드 매칭을 극복하여 문장의 참뜻과 미디어 맥락에 적합한 최적의 순간들을 인지하고 결과를 전달해 줍니다.
기본 세만틱 유사도 검색
검색의 중추 역할을 수행하는 핵심 쿼리 구문은 아래 코드 부분에 녹아 있습니다.
SELECT video_file, start_time, end_time FROM video_embeddings ORDER BY vector_distance(embedding_vector, :1, COSINE) FETCH FIRST :2 ROWS ONLY
이 검색 질의문은 오라클이 네이티브하게 최적화 지원하는 vector_distance 구문과 COSINE 비교 평가 로직을 적용한 뒤, 파라미터로 입력된 문장의 인코딩 벡터를 DB 내 모든 컬렉션과 계산 매칭합니다. 정렬 방식을 통해 가깝고 점수가 높은 유사 값 우선순위 상위 2개의 목록을 응답합니다.
주요 핵심 로직 설명
이 스크립트는 보다 원활하고 정확하게 정보를 탐색할 수 있도록 보조하는 몇 개의 기능 모듈로 나뉩니다.
텍스트 구문의 임베딩 실시간 생성
def similarity_search(connection, query_text): # Create embedding for query embedding = twelvelabs_client.embed.create( model_name=EMBEDDING_MODEL, text=query_text, text_truncate="start", ) if len(embedding.text_embedding.segments) > 1: print(f"Warning: Query generated {len(embedding.text_embedding.segments)} segments. Using only the first segment.") query_vector = array.array("d", embedding.text_embedding.segments[0].embeddings_float) # Search query search_sql = """ SELECT video_file, start_time, end_time FROM video_embeddings ORDER BY vector_distance(embedding_vector, :1, COSINE) FETCH FIRST :2 ROWS ONLY """ results = [] cursor = connection.cursor() cursor.execute(search_sql, [query_vector, TOP_K]) for row in cursor: results.append({ 'video_file': row[0], 'start_time': row[1], 'end_time': row[2] }) cursor.close() return results
입력된 질문 문자열을 Twelve Labs API로 실시간 보내어 어휘 맥락의 수치적 매트릭스 정보를 반환받습니다. 길이가 긴 질의어 텍스트 문장의 경우에는 시스템이 문장의 앞단 우선으로 의미를 효과적으로 조율해 나가는 절단 전처리 기법(text_truncate="start")이 동작하므로 매끄러운 쿼리가 가능해집니다.
멀티 쿼리 병렬 배치 처리 기법
def similarity_search_multiple(connection, query_texts, batch_size=1000): """Perform multiple similarity searches using a list of query texts in batches""" results_by_query = {} # Process queries in batches for i in range(0, len(query_texts), batch_size): batch_queries = query_texts[i:i + batch_size] print(f"\nProcessing batch {i//batch_size + 1} ({len(batch_queries)} queries)") # Create embeddings for batch queries embeddings = [] for query_text in batch_queries: embedding = twelvelabs_client.embed.create( model_name=EMBEDDING_MODEL, text=query_text, text_truncate="start", ) if len(embedding.text_embedding.segments) > 1: print(f"Warning: Query '{query_text}' generated {len(embedding.text_embedding.segments)} segments. Using only the first segment.") query_vector = array.array("d", embedding.text_embedding.segments[0].embeddings_float) embeddings.append(query_vector) # Search query search_sql = """ SELECT video_file, start_time, end_time FROM video_embeddings ORDER BY vector_distance(embedding_vector, :1, COSINE) FETCH FIRST :2 ROWS ONLY """ with connection.cursor() as cursor: for query_text, query_vector in zip(batch_queries, embeddings): results = [] for row in cursor.execute(search_sql, [query_vector, TOP_K]): results.append({ 'video_file': row[0], 'start_time': row[1], 'end_time': row[2] }) results_by_query[query_text] = results return results_by_query
동시다발적인 멀티플 검색 질의가 일어나는 상황 하에서 최고의 운용을 보여주는 함수로, 커넥션 풀 경유 횟수와 트래픽 부하를 상당량 감소시켜 줍니다. 구조화된 맵 구조 딕셔너리에 쿼리와 아웃풋을 고유 키로 격리 보관하므로 쉽게 원하는 레코드를 모니터링할 수 있습니다.
관계형 DB 접속 세션 관리
def query_video_embeddings(query_text): connection = oracledb.connect( user=db_username, password=db_password, dsn=db_connect_string, config_dir=db_wallet_path, wallet_location=db_wallet_path, wallet_password=db_password ) # Verify DB version db_version = tuple(int(s) for s in connection.version.split("."))[:2] if db_version < (23, 7): sys.exit("This example requires Oracle Database 23.7 or later") print("Connected to Oracle Database") print("\nSearching for relevant video segments...") results = similarity_search(connection, query_text) print("\nResults:") print("========") for r in results: print(f"Video: {r['video_file']}") print(f"Segment: {r['start_time']:.1f}s to {r['end_time']:.1f}s\n")
이 모듈은 이전에 선언해 둔 환경 변수 리스트를 바탕으로 보안 인증과 안정적인 연결 유지를 지탱해 줍니다.
코드로 텍스트 검색 실행해 보기
전체 동영상 데이터베이스에서 탐색해 보고 싶은 명사나 형용사 구문을 나열해 실행 인자로 전달합니다.
python3 query_video_embeddings.py "people dancing at a party" "someone explaining AI concepts"
개수 제한 없이 다수의 질문 입력이 가능하며, 엔진은 다음 단계를 백그라운드에서 신속하게 전개해 나갑니다.
Twelve Labs Marengo-2.7 최첨단 연산 모델을 타고 텍스트 정보를 벡터 임베딩 수치 배열로 실시간 변조합니다.
기초 테이블 내 모든 세그먼트 벡터값들과 코사인 연산을 수행해 유사 점수를 산출합니다.
이 중 매칭 감도가 극대화된 최고 매칭 2점을 걸러내어 정리해 줍니다.
결과 시각화 확인하기
해당 결과를 보기 편한 기본 리포트 포맷 형태로 정렬해 단말에 뿌려 줍니다.
Connected to Oracle Database Searching for relevant video segments... Results: ======== Query: 'people dancing at a party' ---------------------------------- Video: birthday_celebration.mp4 Segment: 15.0s to 21.0s Video: summer_festival.mp4 Segment: 45.5s to 51.5s Query: 'someone explaining AI concepts' -------------------------------------- Video: tech_lecture.mp4 Segment: 120.0s to 126.0s Video: developer_conference.mp4 Segment: 75.5s to 81
제공된 문장 마다 완벽 매칭된 동영상 클립 구간의 타임스탬프 스탬프 정보가 표기되므로, 작업자는 기나긴 클립에서 원하는 위치를 바로 재생해 확인할 수 있습니다.
코사인 정밀 벡터 기술이 유감없이 기여하는 원리 덕분에, 단순 자막 음성이나 영상 프레임 캡션에 본인이 넣은 문자 어휘가 활자로 직접 들어가 있지 않은 간접 묘사일지라도 행동 연출 형태나 상황을 꿰뚫어 가장 올바른 정답 타겟 지점 구간을 훌륭하게 반환해 줍니다.
7 - 결론
TwelveLabs Embed API와 Oracle Database 23ai의 결합은 비디오 인지와 검색 기능 전반에 걸친 큰 이정표입니다. 당사의 고도화된 멀티모달 프레임워크에 오라클의 완성도 높은 하드웨어 통합 벡터 시스템을 얹음으로써, 인력 감상 관점에 가장 가까운 지식 이해도를 구현한 명품 서비스 소프트웨어를 단숨에 시장에 내놓을 수 있게 되었습니다.
독보적인 비즈니스 효용
이 합작 통합 모델은 글로벌 비즈니스 기업에 막강한 장점을 제공합니다.
비교 불허의 비디오 검색: 단순한 자구 검색을 비웃듯, 자연어 본뜻 중심의 극적인 의미론적 비디오 검색 가치를 선사하며 고객 인게이지먼트를 자극하고 새로운 아카이브 발견의 장을 엽니다.
통합의 인프라 극대화: 오라클이 주도하는 단일 원 팀 플랫폼 콘셉트 하에, 별개의 하이브리드 엔진 아키텍처 다수를 겹겹이 두를 필요를 원칙적으로 끊어내어 복잡 요소는 누르고 유연한 확장과 강력한 보안 가치를 영위합니다.
혁신의 주도권 선점: 최선두의 동영상 AI 기술력을 인프라에 녹여내어 비즈니스 경쟁 기업 대비 완벽한 상품 및 기술 리더십 격차를 견고하게 벌릴 기회를 소유하게 됩니다.
기술적 어드밴티지
제품 개발 개발팀에 제공하는 기회는 다음과 같습니다.
물 흐르듯 명쾌해지는 개발 루틴: 단 하나의 백엔드 콘셉트 스택을 사용하므로, 복잡하고 귀찮던 쿼리 제어 단계가 극적으로 한눈에 줄어들어 개발 연동 및 워크플로 효율이 배가 됩니다.
초고성능 비디오 서칭 처리 속도: TwelveLabs의 시그니처 정밀 임베딩 배열이 오라클 고유의 벡터 로직을 만나, 테라바이트급 라이브러리 전체 데이터 속에서도 눈 깜짝할 사이에 정답 행들을 뽑아내 줍니다.
신뢰받는 스케일업 파워: Oracle Cloud Infrastructure(OCI) 환경에서 단련하고 검증을 끝낸 당사의 비디오 파운데이션 모델들을 이용하므로 상시 고품질 수준의 프로덕션 안전성을 장담합니다.
완벽한 협업 연합 가치
TwelveLabs와 오라클은 보이지 않는 저변에서부터 강력하게 묶여 있습니다. 당사는 차세대 미디어 시장을 뒤바꿀 파운데이션 인공지능 모델 훈련 연산 기틀로 검증된 OCI 기술 인프라를 채택했습니다. 이는 사람이 보고 이해하는 직관을 한 차원 뛰어넘은 독창적인 모델의 고속 탄생을 가능하게 했습니다. TwelveLabs의 Embed API와 Oracle Database 23ai의 우수성을 융합함으로써 혁신적 기술이 어떻게 완벽한 사업 기회를 만드는지 온전히 시장에 증명해 보였습니다.
결론적으로, 이번 연동 개발은 기존 미디어 디지털 아카이브 자산의 참된 활용 가치를 200% 끌어올리고자 준비하는 현명한 제품 설계자 및 소프트웨어 기업에 엄청난 돌파구를 선사합니다. 양사의 강력한 시너지가 선도하는 차세대 비디오 인사이트 비즈니스의 미래를 직접 현장에서 검증해 보십시오.
참고 자료 리스트
전체 실행 코드가 담긴 GitHub 레포지토리: https://github.com/twelvelabs-io/twelvelabs-developer-experience/tree/main/integrations/Oracle
TwelveLabs Embed API 기술 상세 명세 가이드: https://docs.twelvelabs.io/v1.3/docs/guides/create-embeddings/video
Oracle AI Vector Search 심층 유저 공식 매뉴얼: https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/overview-node.html
통합 및 블로그 게시물 작업을 저희와 긴밀히 협력해 주신 Oracle 팀의 Maxwell Bauman, Douglas Hood, Sean Stacey, Malu Castellanos를 비롯한 여러 팀원분들께 깊은 감사를 드립니다!
멀티모달 비디오 이해와 엔터프라이즈급 벡터 검색 기능의 결합은 생성형 AI 애플리케이션의 상당한 진보를 의미합니다. 이 튜토리얼에서는 TwelveLabs의 최첨단 Embed API와 Oracle Database 23ai의 AI Vector Search를 통합하는 방법을 살펴봅니다. 이를 통해 개발자는 의미론적 이해(semantic understanding)를 바탕으로 비디오 콘텐츠를 저장, 분석 및 검색할 수 있는 강력한 솔루션을 구축할 수 있습니다.
본 가이드를 따라가며 이 두 가지 보완적 기술을 활용함으로써, 시각, 오디오 및 맥락적 요소의 풍부함을 고스란히 담아내는 동시에 견고한 데이터베이스 인프라의 이점까지 누릴 수 있는 정교한 비디오 검색 및 분석 애플리케이션의 구축 방법을 배우게 됩니다.
1 - 소개
TwelveLabs Embed API

TwelveLabs의 Embed API는 비디오 데이터를 고도로 정교한 벡터 표현(즉, 임베딩)으로 변환하여 비디오 이해의 패러다임을 바꿉니다. 단일 모달리티에 집중하는 기존 방식과 달리, TwelveLabs의 멀티모달 임베딩 기술은 시각적 표현, 음성 언어, 보디랭귀지 및 맥락적 관계를 매끄럽게 포착합니다. 저희는 비디오를 단순한 프레임별 처리 단계를 넘어 시간적 역동성을 지닌 고유한 매체로 다룹니다.
TwelveLabs의 통합 벡터 공간 기술은 여러 모달리티를 응집력 있는 하나의 표현으로 통합하여 음성, 시각적 요소, 맥락 사이의 풍부한 상호작용을 보존합니다. 이를 통해 미세한 차이까지 잡아내는 정교한 검색이 가능해지며, 대규모 비디오 라이브러리의 처리 시간은 획기적으로 줄어듭니다.
또한 유연한 비디오 분할 옵션을 제공하므로, 서로 다른 비디오 세그먼트로부터 여러 임베딩을 생성하거나 전체 비디오에 대해 단일 임베딩을 생성할 수 있습니다. 이를 통해 비디오 내의 특정 순간을 정밀하게 찾아낼 수 있습니다.
Oracle 23ai Vector Search 기능

TwelveLabs의 파트너인 Oracle은 융합 데이터베이스 전략의 핵심 기능으로서 AI Vector Search를 Oracle Database 23ai에 기본 탑재하였습니다. Oracle의 방식은 특화된 인덱스와 SQL 함수를 사용하여 고유한 벡터 저장 및 유사도 검색을 제공합니다. 사일로를 만드는 독립형 벡터 데이터베이스와 달리, Oracle은 벡터 기능을 관계형 데이터베이스에 직접 통합하여 구조화된 데이터와 비구조화된 데이터 전체를 아우르는 원활한 쿼리를 지원합니다.
이 시스템은 다양한 거리 측정 방식(코사인, 유클리드, 유클리드 제곱, 내적, 맨해튼, 해밍, 자카드)을 지원하여 사용 사례의 요구 사항에 맞춰 유사도를 정의할 수 있는 유연성을 제공합니다. 대규모 환경에 최적화되어 있어 수백만 개의 레코드가 있는 상황에서도 벡터 검색이 효율적으로 유지되므로 즉시 프로덕션 단계에 적용할 수 있습니다.
Oracle의 입증된 기존 인프라 내에 벡터를 통합함으로써, 개발자는 익숙한 SQL 구문과 기존 보안 모델을 그대로 사용하면서 동시에 최첨단 AI 기능을 활용할 수 있습니다. 이로 인해 별도의 특화된 시스템이 필요하지 않으므로 전반적인 데이터 아키텍처의 복잡성이 줄어듭니다.
통합의 비즈니스 가치
Oracle Database 23ai와의 통합은 벡터 임베딩과 관계형 데이터 저장을 일원화하여 아키텍처를 단순화함으로써 상당한 비즈니스 가치를 제공합니다. 이를 통해 서로 다른 시스템 간의 동기화 과정이 생략되므로 데이터 불일치 문제와 유지보수 비용을 줄일 수 있습니다. 또한 관계형 DB와 벡터 저장소에 개별 쿼리를 보낸 후 결과를 합쳐야 하는 복잡성이 사라져 쿼리가 단순해지고 대기 시간이 단축되어 더 빠른 결과를 제공합니다.
이 솔루션은 사용자가 키워드가 아닌 의미를 바탕으로 콘텐츠를 찾는 의미론적 비디오 검색을 가능하게 하여 검색 정확도를 높이고 텍스트나 시각적 콘텐츠를 활용한 크로스 모달 쿼리를 지원합니다.
Oracle의 엔터프라이즈급 신뢰성, 보안성 및 확장성을 활용하여 프로덕션 배포를 위한 탄탄한 기반을 제공합니다. 기업은 미션 크리티컬 워크로드용으로 설계된 Oracle Database 기술을 활용하여 안심하고 비디오 이해 기술을 도입할 수 있으며, 데이터 볼륨이 증가하더라도 벡터 연산의 효율성은 그대로 유지됩니다.
또한 이번 통합을 통해 비디오 콘텐츠를 대상으로 하는 고급 분석이 가능하므로, 수동 검토나 기존의 처리 방식으로는 감지할 수 없었던 패턴과 인사이트를 기업이 발굴할 수 있도록 지원합니다.
이 튜토리얼은 인프라 설정부터 정교한 비디오 검색 애플리케이션 구축에 이르기까지 실무적인 구현 방법을 다루며, 실제 비즈니스 가치를 창출하는 지능형 비디오 애플리케이션을 개발하는 데 필요한 포괄적인 지식을 제공합니다.
2 - Oracle Autonomous Database 생성
Oracle Cloud 설정
https://www.oracle.com/cloud/free/에서 Oracle Cloud 프리 티어 계정에 가입하세요. 30일 동안 사용할 수 있는 $300의 무료 크레딧과 상시 무료(Always Free) 서비스가 제공됩니다. 신용카드는 본인 인증용으로만 사용됩니다.
데이터베이스 생성
https://cloud.oracle.com/db/adb에 로그인합니다.
Oracle Database → Autonomous Data Warehouse로 이동합니다.
"Autonomous Database 생성(Create Autonomous Database)"을 클릭합니다.
설정 구성
표시 이름(Display name): "VideoEmbeddingsDB" (최대 14자)
워크로드 유형(Workload type): 데이터 웨어하우스(Data Warehouse)
배포 유형(Deployment): 서버리스(Serverless)
필수 구성 사항
데이터베이스 버전: 벡터 기능을 올바르게 사용하려면 "23ai"를 선택하세요.
"상시 무료(Always Free)" 옵션을 선택합니다 (2 OCPU, 20GB 스토리지 제공).
참고: 데이터베이스는 7일 동안 사용하지 않으면 자동으로 중지되지만, 30일 이내에 계속해서 사용하는 한 영구적으로 무료로 유지됩니다.
관리자 비밀번호 설정
ADMIN 사용자를 위한 강력한 비밀번호(12~30자, 대문자, 소문자, 숫자, 특수문자 포함)를 생성합니다.
네트워크 액세스
개발 목적 설정: "어디서나 보안 액세스 허용(Allow secure access from everywhere)"을 선택합니다.
데이터베이스 생성
"Autonomous Database 생성"을 클릭합니다. 프로비저닝에는 2~5분이 소요됩니다. 상태가 "사용 가능(Available)"으로 바뀔 때까지 기다립니다.
연결 월렛(Wallet) 다운로드
데이터베이스 상세 페이지로 이동합니다.
"데이터베이스 접속(Database Connection)" → "월렛 다운로드(Download Wallet)"를 클릭합니다.
월렛 비밀번호를 설정합니다.
다운로드한 월렛 ZIP 파일을 안전하게 저장합니다.
애플리케이션에서 ORACLE_DB_WALLET_PATH 변수에 이 월렛 경로를 제공하여 사용합니다.
이제 데이터베이스가 Twelve Labs Embed API와 통합할 준비를 마쳤습니다. 다음 단계에서는 필요한 환경 변수를 설정하겠습니다.
3 - 사전 요구 사항 및 환경 변수 설정
TwelveLabs Embed API를 Oracle Database 23ai와 통합하기 전에 필수 도구와 인증 정보가 준비되었는지 확인하세요. 이 섹션에서는 필요한 소프트웨어 설치와 환경 구성 방법을 다룹니다.
필수 소프트웨어 설치
이 튜토리얼을 성공적으로 완료하려면 다음이 필요합니다.
AI Vector Search 기능이 탑재된 Oracle Database 23.4 이상 버전
개발 장비에 설치된 Python 3.8 이상 버전
데이터베이스 연결을 위한 Oracle Client 라이브러리
Embed API 액세스를 위한 TwelveLabs API 키
필요한 Python 패키지를 설치합니다.
oracledb 패키지는 Python과 Oracle Database 간의 연결을 제공하며, twelvelabs 패키지는 Twelve Labs API 서비스에 빌드할 수 있는 편리한 인터페이스를 제공합니다.
환경 구성
연결 인증 정보를 안전하게 보관할 수 있도록 다음 환경 변수를 설정하세요.
export ORACLE_DB_USERNAME=your_username export ORACLE_DB_PASSWORD=your_password export ORACLE_DB_CONNECT_STRING=your_connect_string export ORACLE_DB_WALLET_PATH=/path/to/wallet export TWELVE_LABS_API_KEY
자리 표시자 값들을 실제 인증 정보로 변경하세요.
your_username: 데이터베이스 사용자 이름 (신규 Autonomous Database의 경우 보통 ADMIN)
your_password: 데이터베이스 프로비저닝 시 생성한 비밀번호
your_connect_string: 다운로드한 월렛 내 tnsnames.ora 파일에 정의된 서비스 이름
/path/to/wallet: Oracle 월렛 압축 파일을 해제한 디렉터리 경로
your_api_key: 개발자 포털에서 발급받은 TwelveLabs API 키
4 - 데이터베이스 스키마 설정
이 구문에서는 TwelveLabs를 통해 생성되는 비디오 임베딩을 저장하고 쿼리하는 데 필요한 데이터베이스 스키마를 생성하겠습니다. 연결을 수립하고 알맞은 벡터 인덱스를 명시한 테이블 구조를 생성하는 Python 스크립트를 구현 및 실행합니다.
Oracle Database 연결
create_schema_video_embeddings.py 스크립트는 이전 섹션에서 설정한 환경 변수를 바탕으로 Oracle Database 인스턴스와의 연결을 제어합니다. 이 스크립트의 핵심 구성 요소를 살펴보겠습니다.
import oracledb # Connect to Oracle Database 23.7 with oracledb.connect( user=db_username, password=db_password, dsn=db_connect_string, config_dir=db_wallet_path, wallet_location=db_wallet_path, wallet_password=db_password ) as connection: # Script operations will go here
비디오 임베딩 저장을 위한 테이블 생성
스크립트는 다음과 같은 구조를 가진 video_embeddings 테이블을 생성합니다.
CREATE TABLE video_embeddings ( id VARCHAR2(100) PRIMARY KEY, video_file VARCHAR2(1000), start_time NUMBER, end_time NUMBER, embedding_vector VECTOR(1024, float64) )
이 테이블에 포함되는 열은 다음과 같습니다.
id: 각 임베딩의 고유 식별자video_file: 원본 비디오 파일명 또는 경로start_time및end_time: 비디오 세그먼트의 시작 및 종료 타임스탬프 정보embedding_vector: Twelve Labs 임베딩을 저장하기 위한 float64 정밀도의 1024차원 벡터
벡터 인덱스 설정
테이블 생성 작업이 끝나면 create_vector_index를 호출하여 유사도 검색 효율을 높여줄 벡터 인덱스를 만듭니다. 여기서는 95%의 목표 정확도와 코사인 유사도(DISTANCE COSINE)를 활용합니다.
def create_vector_index(cursor): cursor.execute(""" CREATE VECTOR INDEX video_embeddings_idx ON video_embeddings(embedding_vector) ORGANIZATION NEIGHBOR PARTITIONS DISTANCE COSINE WITH TARGET ACCURACY 95 """)
스키마 생성 스크립트 실행
스키마 생성 스크립트를 실행합니다.
이 스크립트는 다음 작업을 순차적으로 수행합니다.
Oracle 데이터베이스 인스턴스에 접속합니다.
기존 테이블이 존재할 경우 이를 삭제(Drop)합니다.
새로운
video_embeddings테이블을 생성합니다.정의해 둔 벡터 인덱스를 생성합니다.
정상적으로 생성이 완료되었음을 콘솔 출력으로 확인합니다.
스키마 설정이 완료됨으로써, TwelveLabs 비디오 임베딩을 Oracle Database 23ai 인스턴스에 저장하고 쿼리할 수 있는 기반이 마련되었습니다.
5 - 비디오 임베딩 저장
데이터베이스 스키마 설정을 마쳤다면, 다음으로 비디오를 TwelveLabs Embed API로 처리하여 생성된 임베딩을 Oracle Database에 저장해야 합니다. store_video_embeddings.py 스크립트는 임베딩 생성과 데이터베이스 저장을 모두 유기적으로 관리하며 이 전 과정을 완벽히 처리합니다.
스크립트 워크플로에 대한 이해
이 스크립트는 다음과 같은 핵심 태스크를 실행합니다.
환경 변수 정보를 통해 Oracle Database에 연결합니다.
API 키를 사용하여 TwelveLabs 클라이언트를 초기화합니다.
TwelveLabs의 Marengo 모델을 활용해 비디오의 임베딩을 생성합니다.
생성된 임베딩을 준비된 데이터베이스 테이블에 저장합니다.
중복 작업을 방지하기 위해 이미 처리된 비디오 기록을 파일로 유지 관리합니다.
h2 id="179">
핵심 함수
임베딩 생성하기
def create_video_embeddings(client, video_file): """Create embeddings for a video file using Twelve Labs Marengo""" task = client.embed.task.create( model_name=EMBEDDING_MODEL, video_file=video_file, video_clip_length=SEGMENT_DURATION ) print(f"Created task: id={task.id} model_name={EMBEDDING_MODEL} status={task.status}") status = task.wait_for_done( sleep_interval=2, callback=on_task_update ) print(f"Embedding done: {status}") return task.id
이 함수는 비디오 파일을 TwelveLabs에 업로드하며, 플랫폼은 Marengo 2.7 모델을 구성하여 비디오를 가공하기 시작합니다. 비디오는 6초 길이의 구간 클립 단위로 분할되며(SEGMENT_DURATION 상수로 커스텀 설정 가능), 각 세그먼트마다 별도의 임베딩 벡터가 추출됩니다. 작업 처리가 종료되면 함수는 추출된 임베딩 결과물을 받아오는 데 사용되는 task ID 값을 반환합니다.
임베딩 저장하기
def store_embeddings_in_db(connection, task_id, video_file): """Store video embeddings in Oracle DB""" # Get embeddings from the task task = twelvelabs_client.embed.task.retrieve(task_id) # Get embeddings from the task if not task.video_embedding or not task.video_embedding.segments: print("No embeddings found") return insert_sql = """ INSERT INTO video_embeddings ( id, video_file, start_time, end_time, embedding_vector ) VALUES ( :1, :2, :3, :4, :5 )""" BATCH_SIZE = 1000 data_batch = [] # Process in batches of 1000 for efficiency with connection.cursor() as cursor: for idx, segment in enumerate(task.video_embedding.segments): id = f"{task_id}_{idx}" vector = array.array("f", segment.embeddings_float) data_batch.append([ id, video_file, segment.start_offset_sec, segment.end_offset_sec, vector ]) # Execute and commit every BATCH_SIZE rows if len(data_batch) >= BATCH_SIZE: print("insert data") cursor.executemany(insert_sql, data_batch) connection.commit() data_batch = [] # Insert any remaining rows if data_batch: print("insert data final") cursor.executemany(insert_sql, data_batch) connection.commit() print(f"Stored {len(task.video_embedding.segments)} embeddings in database")
이 함수는 TwelveLabs가 추출 완료한 임베딩을 내려받아 Oracle Database에 입력합니다. 각 개별 임베딩 레코드는 다음 메타데이터를 함께 저장합니다.
작업 ID와 세그먼트 시퀀스가 조합된 유니크 ID
원본 소스 비디오 파일의 이름
해당 세그먼트의 시작 및 종료 지점을 알리는 타임스탬프 정보
1024차원의 정밀한 임베딩 벡터 데이터 자체
데이터베이스 인서트를 최적화된 성능으로 다루기 위해, 1,000개 단위의 배치 배치 데이터로 묶어 처리하게 됩니다.
Task ID 파일 수명 관리
def load_task_ids(): """Load existing task IDs from JSON file""" try: with open('video_task_ids.json', 'r') as f: return json.load(f) except FileNotFoundError: return {}
스크립트는 로컬 디렉터리에 비디오의 처리 경로와 TwelveLabs 작업 ID 매핑 정보를 보관하는 video_task_ids.json 백업 파일을 생성하고 읽기 작업을 진행합니다. 이를 통해 이미 임베딩 완료된 비디오의 불필요한 이중 분석 연산을 스킵하여 실행 소요 시간과 불필요한 API 파이프라인 호출 비용을 절약합니다. 만약 특정 비디오를 다시 가공해 임베딩을 새로 넣고 싶다면, JSON 맵 대응 항목을 삭제하거나 해당 캐시 파일을 지우면 됩니다.
코드 스크립트 실행하기
이 모듈은 두 가지 방식으로 구동할 수 있습니다.
단일 비디오 처리 모드:
디렉터리 내 전체 비디오 스캔 모드:
디렉터리 모드로 작동 시, 스크립트는 내부적인 화이트리스트 확장자 필터링(.mp4, .avi, .mov, .mkv, .webm)을 가동하여 부합하는 모든 대상 파일을 감지하고 프로세스 파이프라인에 주입합니다.
진행 상황 모니터링
수행하는 동안 터미널 콘솔 로그에 다음 실시간 정보가 지속 업데이트됩니다.
Oracle Database 연결 상태 및 확인 로그
TwelveLabs API를 통한 작업 등록 및 라이브 테일링 처리 상황
배치 적재 커밋 수량을 포함한 DB 임베딩 저장 경과
모든 데이터의 저장이 완료되었음을 알리는 요약 세부 요약 피드백
완료 신호가 뜨면, 이제 비디오 임베딩이 video_embeddings 스키마에 입체적으로 세팅되어 언제든 의미 검색을 시작할 준비를 끝내게 됩니다. 다음 장에서는 이 임베딩 저장소를 쿼리하는 방법을 알아보겠습니다.
6 - 비디오 임베딩 쿼리하기
임베딩 구조를 Oracle Database 23ai로 셋업하고 난 후 발휘되는 진정한 강점은 바로 자연어로 전체 컬렉션을 자유롭게 서칭할 수 있다는 점입니다. query_video_embeddings.py 파이썬 코드는 단순 텍스트 키워드 매칭을 극복하여 문장의 참뜻과 미디어 맥락에 적합한 최적의 순간들을 인지하고 결과를 전달해 줍니다.
기본 세만틱 유사도 검색
검색의 중추 역할을 수행하는 핵심 쿼리 구문은 아래 코드 부분에 녹아 있습니다.
SELECT video_file, start_time, end_time FROM video_embeddings ORDER BY vector_distance(embedding_vector, :1, COSINE) FETCH FIRST :2 ROWS ONLY
이 검색 질의문은 오라클이 네이티브하게 최적화 지원하는 vector_distance 구문과 COSINE 비교 평가 로직을 적용한 뒤, 파라미터로 입력된 문장의 인코딩 벡터를 DB 내 모든 컬렉션과 계산 매칭합니다. 정렬 방식을 통해 가깝고 점수가 높은 유사 값 우선순위 상위 2개의 목록을 응답합니다.
주요 핵심 로직 설명
이 스크립트는 보다 원활하고 정확하게 정보를 탐색할 수 있도록 보조하는 몇 개의 기능 모듈로 나뉩니다.
텍스트 구문의 임베딩 실시간 생성
def similarity_search(connection, query_text): # Create embedding for query embedding = twelvelabs_client.embed.create( model_name=EMBEDDING_MODEL, text=query_text, text_truncate="start", ) if len(embedding.text_embedding.segments) > 1: print(f"Warning: Query generated {len(embedding.text_embedding.segments)} segments. Using only the first segment.") query_vector = array.array("d", embedding.text_embedding.segments[0].embeddings_float) # Search query search_sql = """ SELECT video_file, start_time, end_time FROM video_embeddings ORDER BY vector_distance(embedding_vector, :1, COSINE) FETCH FIRST :2 ROWS ONLY """ results = [] cursor = connection.cursor() cursor.execute(search_sql, [query_vector, TOP_K]) for row in cursor: results.append({ 'video_file': row[0], 'start_time': row[1], 'end_time': row[2] }) cursor.close() return results
입력된 질문 문자열을 Twelve Labs API로 실시간 보내어 어휘 맥락의 수치적 매트릭스 정보를 반환받습니다. 길이가 긴 질의어 텍스트 문장의 경우에는 시스템이 문장의 앞단 우선으로 의미를 효과적으로 조율해 나가는 절단 전처리 기법(text_truncate="start")이 동작하므로 매끄러운 쿼리가 가능해집니다.
멀티 쿼리 병렬 배치 처리 기법
def similarity_search_multiple(connection, query_texts, batch_size=1000): """Perform multiple similarity searches using a list of query texts in batches""" results_by_query = {} # Process queries in batches for i in range(0, len(query_texts), batch_size): batch_queries = query_texts[i:i + batch_size] print(f"\nProcessing batch {i//batch_size + 1} ({len(batch_queries)} queries)") # Create embeddings for batch queries embeddings = [] for query_text in batch_queries: embedding = twelvelabs_client.embed.create( model_name=EMBEDDING_MODEL, text=query_text, text_truncate="start", ) if len(embedding.text_embedding.segments) > 1: print(f"Warning: Query '{query_text}' generated {len(embedding.text_embedding.segments)} segments. Using only the first segment.") query_vector = array.array("d", embedding.text_embedding.segments[0].embeddings_float) embeddings.append(query_vector) # Search query search_sql = """ SELECT video_file, start_time, end_time FROM video_embeddings ORDER BY vector_distance(embedding_vector, :1, COSINE) FETCH FIRST :2 ROWS ONLY """ with connection.cursor() as cursor: for query_text, query_vector in zip(batch_queries, embeddings): results = [] for row in cursor.execute(search_sql, [query_vector, TOP_K]): results.append({ 'video_file': row[0], 'start_time': row[1], 'end_time': row[2] }) results_by_query[query_text] = results return results_by_query
동시다발적인 멀티플 검색 질의가 일어나는 상황 하에서 최고의 운용을 보여주는 함수로, 커넥션 풀 경유 횟수와 트래픽 부하를 상당량 감소시켜 줍니다. 구조화된 맵 구조 딕셔너리에 쿼리와 아웃풋을 고유 키로 격리 보관하므로 쉽게 원하는 레코드를 모니터링할 수 있습니다.
관계형 DB 접속 세션 관리
def query_video_embeddings(query_text): connection = oracledb.connect( user=db_username, password=db_password, dsn=db_connect_string, config_dir=db_wallet_path, wallet_location=db_wallet_path, wallet_password=db_password ) # Verify DB version db_version = tuple(int(s) for s in connection.version.split("."))[:2] if db_version < (23, 7): sys.exit("This example requires Oracle Database 23.7 or later") print("Connected to Oracle Database") print("\nSearching for relevant video segments...") results = similarity_search(connection, query_text) print("\nResults:") print("========") for r in results: print(f"Video: {r['video_file']}") print(f"Segment: {r['start_time']:.1f}s to {r['end_time']:.1f}s\n")
이 모듈은 이전에 선언해 둔 환경 변수 리스트를 바탕으로 보안 인증과 안정적인 연결 유지를 지탱해 줍니다.
코드로 텍스트 검색 실행해 보기
전체 동영상 데이터베이스에서 탐색해 보고 싶은 명사나 형용사 구문을 나열해 실행 인자로 전달합니다.
python3 query_video_embeddings.py "people dancing at a party" "someone explaining AI concepts"
개수 제한 없이 다수의 질문 입력이 가능하며, 엔진은 다음 단계를 백그라운드에서 신속하게 전개해 나갑니다.
Twelve Labs Marengo-2.7 최첨단 연산 모델을 타고 텍스트 정보를 벡터 임베딩 수치 배열로 실시간 변조합니다.
기초 테이블 내 모든 세그먼트 벡터값들과 코사인 연산을 수행해 유사 점수를 산출합니다.
이 중 매칭 감도가 극대화된 최고 매칭 2점을 걸러내어 정리해 줍니다.
결과 시각화 확인하기
해당 결과를 보기 편한 기본 리포트 포맷 형태로 정렬해 단말에 뿌려 줍니다.
Connected to Oracle Database Searching for relevant video segments... Results: ======== Query: 'people dancing at a party' ---------------------------------- Video: birthday_celebration.mp4 Segment: 15.0s to 21.0s Video: summer_festival.mp4 Segment: 45.5s to 51.5s Query: 'someone explaining AI concepts' -------------------------------------- Video: tech_lecture.mp4 Segment: 120.0s to 126.0s Video: developer_conference.mp4 Segment: 75.5s to 81
제공된 문장 마다 완벽 매칭된 동영상 클립 구간의 타임스탬프 스탬프 정보가 표기되므로, 작업자는 기나긴 클립에서 원하는 위치를 바로 재생해 확인할 수 있습니다.
코사인 정밀 벡터 기술이 유감없이 기여하는 원리 덕분에, 단순 자막 음성이나 영상 프레임 캡션에 본인이 넣은 문자 어휘가 활자로 직접 들어가 있지 않은 간접 묘사일지라도 행동 연출 형태나 상황을 꿰뚫어 가장 올바른 정답 타겟 지점 구간을 훌륭하게 반환해 줍니다.
7 - 결론
TwelveLabs Embed API와 Oracle Database 23ai의 결합은 비디오 인지와 검색 기능 전반에 걸친 큰 이정표입니다. 당사의 고도화된 멀티모달 프레임워크에 오라클의 완성도 높은 하드웨어 통합 벡터 시스템을 얹음으로써, 인력 감상 관점에 가장 가까운 지식 이해도를 구현한 명품 서비스 소프트웨어를 단숨에 시장에 내놓을 수 있게 되었습니다.
독보적인 비즈니스 효용
이 합작 통합 모델은 글로벌 비즈니스 기업에 막강한 장점을 제공합니다.
비교 불허의 비디오 검색: 단순한 자구 검색을 비웃듯, 자연어 본뜻 중심의 극적인 의미론적 비디오 검색 가치를 선사하며 고객 인게이지먼트를 자극하고 새로운 아카이브 발견의 장을 엽니다.
통합의 인프라 극대화: 오라클이 주도하는 단일 원 팀 플랫폼 콘셉트 하에, 별개의 하이브리드 엔진 아키텍처 다수를 겹겹이 두를 필요를 원칙적으로 끊어내어 복잡 요소는 누르고 유연한 확장과 강력한 보안 가치를 영위합니다.
혁신의 주도권 선점: 최선두의 동영상 AI 기술력을 인프라에 녹여내어 비즈니스 경쟁 기업 대비 완벽한 상품 및 기술 리더십 격차를 견고하게 벌릴 기회를 소유하게 됩니다.
기술적 어드밴티지
제품 개발 개발팀에 제공하는 기회는 다음과 같습니다.
물 흐르듯 명쾌해지는 개발 루틴: 단 하나의 백엔드 콘셉트 스택을 사용하므로, 복잡하고 귀찮던 쿼리 제어 단계가 극적으로 한눈에 줄어들어 개발 연동 및 워크플로 효율이 배가 됩니다.
초고성능 비디오 서칭 처리 속도: TwelveLabs의 시그니처 정밀 임베딩 배열이 오라클 고유의 벡터 로직을 만나, 테라바이트급 라이브러리 전체 데이터 속에서도 눈 깜짝할 사이에 정답 행들을 뽑아내 줍니다.
신뢰받는 스케일업 파워: Oracle Cloud Infrastructure(OCI) 환경에서 단련하고 검증을 끝낸 당사의 비디오 파운데이션 모델들을 이용하므로 상시 고품질 수준의 프로덕션 안전성을 장담합니다.
완벽한 협업 연합 가치
TwelveLabs와 오라클은 보이지 않는 저변에서부터 강력하게 묶여 있습니다. 당사는 차세대 미디어 시장을 뒤바꿀 파운데이션 인공지능 모델 훈련 연산 기틀로 검증된 OCI 기술 인프라를 채택했습니다. 이는 사람이 보고 이해하는 직관을 한 차원 뛰어넘은 독창적인 모델의 고속 탄생을 가능하게 했습니다. TwelveLabs의 Embed API와 Oracle Database 23ai의 우수성을 융합함으로써 혁신적 기술이 어떻게 완벽한 사업 기회를 만드는지 온전히 시장에 증명해 보였습니다.
결론적으로, 이번 연동 개발은 기존 미디어 디지털 아카이브 자산의 참된 활용 가치를 200% 끌어올리고자 준비하는 현명한 제품 설계자 및 소프트웨어 기업에 엄청난 돌파구를 선사합니다. 양사의 강력한 시너지가 선도하는 차세대 비디오 인사이트 비즈니스의 미래를 직접 현장에서 검증해 보십시오.
참고 자료 리스트
전체 실행 코드가 담긴 GitHub 레포지토리: https://github.com/twelvelabs-io/twelvelabs-developer-experience/tree/main/integrations/Oracle
TwelveLabs Embed API 기술 상세 명세 가이드: https://docs.twelvelabs.io/v1.3/docs/guides/create-embeddings/video
Oracle AI Vector Search 심층 유저 공식 매뉴얼: https://docs.oracle.com/en/database/oracle/oracle-database/23/vecse/overview-node.html




