Twelve Labs#
Twelve Labs Embed API предоставляет мощные вложения, представляющие видео, тексты, изображения и аудио в едином векторном пространстве. Это пространство позволяет выполнять поиск «любой к любому» по различным типам контента.
Обрабатывая все модальности нативно, он захватывает взаимодействия, такие как визуальные выражения, речь и контекст, позволяя создавать передовые приложения, такие как анализ настроений, обнаружение аномалий и рекомендательные системы с высокой точностью и эффективностью.
В данном руководстве будет рассмотрено как работать с вложениями Twelve Labs в Platform V Vector DB (далее - Vector DB) через Python и Node.js SDK.
Установка SDK#
$ pip install twelvelabs qdrant-client
$ npm install twelvelabs-js @qdrant/js-client-rest
Настройка клиентов#
from twelvelabs import TwelveLabs
from qdrant_client import QdrantClient
# Get your API keys from:
# https://playground.twelvelabs.io/dashboard/api-key
TL_API_KEY = "<YOUR_TWELVE_LABS_API_KEY>"
twelvelabs_client = TwelveLabs(api_key=TL_API_KEY)
qdrant_client = QdrantClient(url="http://localhost:6333/")
import { QdrantClient } from '@qdrant/js-client-rest';
import { TwelveLabs, EmbeddingsTask, SegmentEmbedding } from 'twelvelabs-js';
// Get your API keys from:
// https://playground.twelvelabs.io/dashboard/api-key
const TL_API_KEY = "<YOUR_TWELVE_LABS_API_KEY>"
const twelveLabsClient = new TwelveLabs({ apiKey: TL_API_KEY });
const qdrantClient = new QdrantClient({ url: 'http://localhost:6333' });
Следующий пример использует модель "Marengo-retrieval-2.7" для вложения видео. Он генерирует векторные вложения размерности 1024 и работает с косинусным сходством.
Можно использовать ту же модель для вложения аудио, текста и изображений в общее векторное пространство. Что позволяет осуществлять кросс-модальный поиск!
Вложение видео#
task = twelvelabs_client.embed.task.create(
model_name="Marengo-retrieval-2.7",
video_url="https://sample-videos.com/video321/mp4/720/big_buck_bunny_720p_2mb.mp4"
)
task.wait_for_done(sleep_interval=3)
task_result = twelvelabs_client.embed.task.retrieve(task.id)
const task = await twelveLabsClient.embed.task.create("Marengo-retrieval-2.7", {
url: "https://sample-videos.com/video321/mp4/720/big_buck_bunny_720p_2mb.mp4"
})
await task.waitForDone(3)
const taskResult = await twelveLabsClient.embed.task.retrieve(task.id)
Преобразование выходных данных модели в точки Vector DB#
from qdrant_client.models import PointStruct
points = [
PointStruct(
id=idx,
vector=v.embeddings_float,
payload={
"start_offset_sec": v.start_offset_sec,
"end_offset_sec": v.end_offset_sec,
"embedding_scope": v.embedding_scope,
},
)
for idx, v in enumerate(task_result.video_embedding.segments)
]
let points = taskResult.videoEmbedding.segments.map((data, i) => {
return {
id: i,
vector: data.embeddingsFloat,
payload: {
startOffsetSec: data.startOffsetSec,
endOffsetSec: data.endOffsetSec,
embeddingScope: data.embeddingScope
}
}
})
Создание коллекции для вставки векторов#
from qdrant_client.models import VectorParams, Distance
collection_name = "twelve_labs_collection"
qdrant_client.create_collection(
collection_name,
vectors_config=VectorParams(
size=1024,
distance=Distance.COSINE,
),
)
qdrant_client.upsert(collection_name, points)
const COLLECTION_NAME = "twelve_labs_collection"
await qdrantClient.createCollection(COLLECTION_NAME, {
vectors: {
size: 1024,
distance: 'Cosine',
}
});
await qdrantClient.upsert(COLLECTION_NAME, {
wait: true,
points
})
Поиск#
После добавления векторов можно запускать семантические поиски по разным модальностям.
text_segment = twelvelabs_client.embed.create(
model_name="Marengo-retrieval-2.7",
text="<YOUR_QUERY_TEXT>",
).text_embedding.segments[0]
qdrant_client.query_points(
collection_name=collection_name,
query=text_segment.embeddings_float,
)
const textSegment = (await twelveLabsClient.embed.create({
modelName: "Marengo-retrieval-2.7",
text: "<YOUR_QUERY_TEXT>"
})).textEmbedding.segments[0]
await qdrantClient.query(COLLECTION_NAME, {
query: textSegment.embeddingsFloat,
});
Попробуйте найти аудио:
audio_segment = twelvelabs_client.embed.create(
model_name="Marengo-retrieval-2.7",
audio_url="https://codeskulptor-demos.commondatastorage.googleapis.com/descent/background%20music.mp3",
).audio_embedding.segments[0]
qdrant_client.query_points(
collection_name=collection_name,
query=audio_segment.embeddings_float,
)
const audioSegment = (await twelveLabsClient.embed.create({
modelName: "Marengo-retrieval-2.7",
audioUrl: "https://codeskulptor-demos.commondatastorage.googleapis.com/descent/background%20music.mp3"
})).audioEmbedding.segments[0]
await qdrantClient.query(COLLECTION_NAME, {
query: audioSegment.embeddingsFloat,
});
Аналогично, создайте запрос поиска по изображению:
image_segment = twelvelabs_client.embed.create(
model_name="Marengo-retrieval-2.7",
image_url="https://gratisography.com/wp-content/uploads/2024/01/gratisography-cyber-kitty-1170x780.jpg",
).image_embedding.segments[0]
qdrant_client.query_points(
collection_name=collection_name,
query=image_segment.embeddings_float,
)
const imageSegment = (await twelveLabsClient.embed.create({
modelName: "Marengo-retrieval-2.7",
imageUrl: "https://gratisography.com/wp-content/uploads/2024/01/gratisography-cyber-kitty-1170x780.jpg"
})).imageEmbedding.segments[0]
await qdrantClient.query(COLLECTION_NAME, {
query: imageSegment.embeddingsFloat,
});