
Amazon Nova 2 мультимодальні ембеддинги з Amazon S3 Vectors та AWS Java SDK — Частина 3: Створення та збереження аудіо- й відео ембеддингів
https://ift.tt/nFeKlMB
Вступ
У частині 2 ми розглянули створення текстових та зображувальних ембеддингів за допомогою Amazon Nova 2 Multimodal Embeddings та збереження їх у Amazon S3 Vectors за допомогою AWS Java SDK. У цієї частині серії ми розглянемо аудіо- та відео ембеддинги.
Створення та збереження аудіо ембеддингів
Ми використаємо багато елементів з процесу створення та збереження текстових та зображувальних ембеддингів, описаного у частині 2. Відповідна бізнес-логіка нашого прикладу досі зберігається в AmazonNovaMultimodalEmbeddings.
Для демонстраційних цілей я конвертував офіційне відео AWS про AWS Lambda у файл .mp3 з ім’ям, визначеним як private static final String[] AUDIO_NAMES = { “AWS-Lambda-explained-in-90-seconds-audio” }, і загрузив його у бакет S3, визначений як private final static String S3_BUCKET = “s3://vk-amazon-nova-2-mme/” (будь ласка, використайте власне унікальне ім’я бакета).
Оскільки тривалість цього аудіофайлу перевищує 15 секунд (а фактично більше 90 секунд), ми повинні використати асинхронний Bedrock API. Цей асинхронний API ділить аудіо на частини по 15 секунд та створює ембеддинги для кожної з них. Відповідна частина знаходиться у методі createAndStoreAudioEmbeddings:
private static void createAndStoreAudioEmbeddings() throws Exception {
for (String audioName : AUDIO_NAMES) {
asyncInvokeBedrockModelAndPutVectorsToS3(prepareAudioDocument(S3_BUCKET +
audioName + AUDIO_EXTENSION), audioName, “embedding-audio.jsonl”);
}
}
Давайте розглянемо, що тут відбувається. По-перше, у методі prepareAudioDocument ми застосовуємо API Document з бібліотеки software.amazon.awssdk.core.document.Document для створення запиту JSON на створення аудіо ембеддингу. Ми встановлюємо taskType як SEGMENTED_EMBEDDING (бо ми розбиваємо аудіофайл), durationSeconds у segmentationConfig дорівнює 15 секундам. Потім задаємо embeddingPurpose як GENERIC_INDEX та embeddingDimension як 384. Ми можемо використати для компромісу між точністю ембеддингу та витратами на збереження векторів 4 розміри: 3072, 1024, 384 та 256. Далі визначаємо формат аудіо як mp3 та джерело з його s3Location. Для повної схеми запиту та відповіді ембеддингів дивіться відповідну статтю. Нижче наведено повний вихідний код цього методу:
private static Document prepareAudioDocument(String s3_audio_uri) {
var s3locationConfig = Document.mapBuilder()
.putString(“uri”, s3_audio_uri).build();
var sourceConfig = Document.mapBuilder()
.putDocument(“s3Location”, s3locationConfig).build();
var durationConfig = Document.mapBuilder().putNumber(“durationSeconds”, 15).build();
var audioConfig = Document.mapBuilder().putString(“format”,”mp3″)
.putDocument(“source”, sourceConfig)
.putDocument(“segmentationConfig”, durationConfig).build();
var singleEmbeddingParams = Document.mapBuilder().putString(“embeddingPurpose”, “GENERIC_INDEX”)
.putNumber(“embeddingDimension”,EMBEDDING_DIMENSION)
.putDocument(“audio”, audioConfig).build();
var request = Document.mapBuilder().putString(“taskType”, “SEGMENTED_EMBEDDING”)
.putDocument(“segmentedEmbeddingParams”,singleEmbeddingParams).build();
return request;
}
Згенерований Document виглядає так:
{
“taskType”: “SEGMENTED_EMBEDDING”,
“segmentedEmbeddingParams”: {
“embeddingPurpose”: “GENERIC_INDEX”,
“embeddingDimension”: 384, “audio”: {
“format”: “mp3”,
“source”: {
“s3Location”: {
“uri”: “s3://vk-amazon-nova-2-mme/AWS-Lambda-explained-in-90-seconds-audio.mp3”
}
}
“segmentationConfig”: {
“durationSeconds”: 15
}
}
}
}
Тепер розглянемо, що далі відбувається у методі asyncInvokeBedrockModelAndPutVectorsToS3 після запуску асинхронного виклику моделі Bedrock. Ми спочатку використовуємо створений Document для запуску асинхронного виклику моделі Bedrock, що відбувається у методі startAsyncInvokeBedrockModel. Розділений режим потрібний для аудіо та відео, бо сегментація відповідного часу може тривати кілька хвилин. Якщо тривалість файлу становить 15 хвилин або менше, ми можемо використати синхронний виклик так само, як ми робили для створення текстових та зображувальних ембеддингів. Спочатку ми будуємо об’єкт AsyncInvokeS3OutputDataConfig, передаючи йому S3_EMBEDDINGS_DESTINATION_URI, який визначено як private final static String S3_EMBEDDINGS_DESTINATION_URI = S3_BUCKET + “embeddings-output/”. Його використовують для побудови AsyncInvokeOutputDataConfig. Потім ми створюємо StartAsyncInvokeRequest, передаючи йому Document та раніше створені AsyncInvokeOutputDataConfig та ідентифікатор моделі (amazon.nova-2-multimodal-embeddings-v1:0). Далі ми використовуємо Bedrock Runtime Client для виклику StartAsyncInvokeRequest та отримуємо invocationArn. Цей ARN ресурсу є частиною відповіді, яку ми також повертаємо. Нижче наведено повний вихідний код методу startAsyncInvokeBedrockModel:
private static String startAsyncInvokeBedrockModel(Document document) {
var ais3dc = AsyncInvokeS3OutputDataConfig.builder()
.s3Uri(S3_EMBEDDINGS_DESTINATION_URI).build();
var aiodc = AsyncInvokeOutputDataConfig.builder()
.s3OutputDataConfig(ais3dc).build();
var saiRequest = StartAsyncInvokeRequest.builder()
.modelId(MODEL_ID).modelInput(document)
.outputDataConfig(aiodc).build();
var saiResponse = BEDRDOCK_RUNTIME_CLIENT.startAsyncInvoke(saiRequest);
var invocationARN = saiResponse.invocationArn();
return invocationARN;
}
Продовжимо дослідження методу asyncInvokeBedrockModelAndPutVectorsToS3 після запуску асинхронного виклику Bedrock. Ми створюємо об’єкт GetAsyncInvokeRequest з invocationArn. Потім використовуємо Bedrock Runtime Client, щоб викликати його та отримати статус у відповіді. Доки статус IN_PROGRESS, ми робимо паузу у 20 секунд і повторюємо запит GetAsyncInvokeRequest, доки не отримаємо статус COMPLETED. У такому випадку ми готові отримати результати з s3Uri з GetAsyncInvokeResponse. Так виглядає відповідь для кожного результату асинхронного виклику Bedrock:
Щоб отримати створені сегментовані аудіо-ембеддинги, потрібно розпарсити файл з ім’ям embedding-audio.jsonl і розділити його. Для цього використовуємо регулярний вираз
\r?\n|\r, щоб отримати окремі ембеддинги. Для тривалості аудіо трохи більше 90 секунд та сегментації по 15 секунд буде згенеровано 7 ембеддингів. Тоді для кожного ембеддингу ми конвертуємо його представлення в об’єкт AsyncEmbeddingResponse. Цей об’єкт містить масив ембеддингів, статус та метадані сегмента. До таких метаданих належать: порядковий номер, початок та кінець сегмента в секундах, наприклад з 16-ї до 30-ї секунди. Потім ми отримуємо ембеддинг для поточного об’єкта AsyncEmbeddingResponse та зберігаємо його за ключем, який визначено як сукупність імені файлу та номера сегмента (значення змінної i) у Amazon S3 Vectors за допомогою методу putVectors, описаного у частині 2. Нижче наведено повний вихідний код методу asyncInvokeBedrockModelAndPutVectorsToS3:
private static void asyncInvokeBedrockModelAndPutVectorsToS3(Document document, String fileName, String embeddingsResultFileName)
throws Exception {
var invocationARN= startAsyncInvokeBedrockModel(document);
while (true) {
var gaiRequest = GetAsyncInvokeRequest.builder()
.invocationArn(invocationARN).build();
var gaiResponse = BEDRDOCK_RUNTIME_CLIENT.getAsyncInvoke(gaiRequest);
var status = gaiResponse.status();
if (AsyncInvokeStatus.IN_PROGRESS.equals(status)) {
Thread.sleep(20000);
}
if (AsyncInvokeStatus.COMPLETED.equals(status)) {
var s3Uri = gaiResponse.outputDataConfig()
.s3OutputDataConfig().s3Uri();
int i = 1;
for (String line : new String(getS3ObjectWithEmbeddings(s3Uri,embeddingsResultFileName))
.split(“\\r?\\n|\\r”)) {
AsyncEmbeddingResponse asyncEmbeddingResponse = MAPPER.readValue(line, AsyncEmbeddingResponse.class);
putVectors(asyncEmbeddingResponse.embedding(), fileName + “_” + i);
i++;
}
return;
}
}
}
Щоб протестувати створення та збереження аудіо ембеддингів, можна розкоментувати цей виклик у головному методі.
public static void main(String[] args) throws Exception {
createAndStoreAudioEmbeddings();
}
Створення та збереження відео ембеддингів
Створення та збереження відео ембеддингів досить подібні до процедури, описаної для аудіо ембеддингів. Тож відмінності розглянемо лише щодо змісту.
Для демонстраційних цілей я конвертував офіційне відео AWS про AWS Lambda у файл .mp4 з ім’ям, визначеним як private final String[] VIDEO_NAMES = { “AWS-Lambda-explained-in-90-seconds-video” } та завантажив його у S3 бакет з приватним оголошеним шляхом, як private final static String S3_BUCKET = “s3://vk-amazon-nova-2-mme/” (будь ласка, використайте власне унікальне ім’я бакета).
Оскільки тривалість цього відеофайлу перевищує 15 секунд (більше 90 секунд), потрібно використати асинхронний Bedrock API. Цей асинхронний API розділяє відео на частини по 15 секунд та створює ембеддинги для кожної з них. Відповідна частина знаходиться у методі createAndStoreVideoEmbeddings:
private static void createAndStoreVideoEmbeddings() throws Exception {
for (String videoName : VIDEO_NAMES) {
asyncInvokeBedrockModelAndPutVectorsToS3(prepareVideoDocument(S3_BUCKET +
videoName + VIDEO_EXTENSION), videoName, “embedding-audio-video.jsonl”);
}
}
Давайте розглянемо, що тут відбувається. По-перше, у методі prepareVideoDocument ми застосовуємо API Document з бібліотеки software.amazon.awssdk.core.document.Document для створення JSON-запиту на створення відео ембеддингу. Ми встановлюємо taskType як SEGMENTED_EMBEDDING (бо ми розбиваємо відео), durationSeconds у segmentationConfig дорівнює 15 секундам. Потім задаємо embeddingPurpose як GENERIC_INDEX та embeddingDimension як 384 (для компромісу між точністю ембеддингу та витратами на збереження векторів використовуються 4 розміри: 3072, 1024, 384 та 256). Далі визначаємо формат відео як mp4, embeddingMode як AUDIO_VIDEO_COMBINED. Наприкінці визначаємо джерело та його s3Location вашого відеофайлу. Для повної схеми запиту та відповіді ембеддингів дивіться відповідну статтю. Нижче наведено повний вихідний код цього методу:
private static Document prepareVideoDocument(String s3_audio_uri) {
var s3locationConfig = Document.mapBuilder()
.putString(“uri”, s3_video_uri).build();
var sourceConfig = Document.mapBuilder()
.putDocument(“s3Location”, s3locationConfig).build();
var durationConfig = Document.mapBuilder()
.putNumber(“durationSeconds”, 15).build();
var videoConfig = Document.mapBuilder().putString(“format”, “mp4”)
.putString(“embeddingMode”, “AUDIO_VIDEO_COMBINED”)
.putDocument(“source”, sourceConfig)
.putDocument(“segmentationConfig”, durationConfig).build();
var singleEmbeddingParams = Document.mapBuilder()
.putString(“embeddingPurpose”, “GENERIC_INDEX”)
.putNumber(“embeddingDimension”, EMBEDDING_DIMENSION)
.putDocument(“video”, videoConfig).build();
var request = Document.mapBuilder()
.putString(“taskType”, “SEGMENTED_EMBEDDING”)
.putDocument(“segmentedEmbeddingParams”, singleEmbeddingParams)
.build();
return request;
}
Згенерований Document виглядає так:
{
“taskType”: “SEGMENTED_EMBEDDING”,
“segmentedEmbeddingParams”: {
“embeddingPurpose”: “GENERIC_INDEX”,
“embeddingDimension”: 384,
“video”: {
“format”: “mp4”,
“embeddingMode”: “AUDIO_VIDEO_COMBINED”,
“source”: {
“s3Location”: {
“uri”: “s3://vk-amazon-nova-2-mme/AWS-Lambda-explained-in-90-seconds-audio.mp4”}
},
“segmentationConfig”: {
“durationSeconds”: 15
}
}
}
}
Усе решта працює так само, як і у випадку аудіо ембеддингів. Єдина додаткова відмінність для створення відео-ембеддингів полягає в тому, як виглядає вивід для кожного результату асинхронного виклику Bedrock. Зверніть увагу на імена файлів:
Ми отримуємо всі згенеровані відео-ембеддинги з файлу embedding-audio-video.jsonl, розпарсуємо їх поодинці та створюємо ембеддинги у Amazon S3 Vectors. Дивіться наведений вище описаний метод asyncInvokeBedrockModelAndPutVectorsToS3.
Щоб протестувати створення та збереження аудіо ембеддингів, можна розкоментувати цей виклик у головному методі.
public static void main(String[] args) throws Exception {
createAndStoreVideoEmbeddings();
}
Висновок
У цій частині ми розглянули створення аудіо- та відео ембеддингів за допомогою Amazon Nova 2 Multimodal Embeddings та збереження їх у Amazon S3 Vectors за допомогою AWS Java SDK. У наступній частині серії ми розглянемо пошук за подібністю серед усіх (текстових, зображувальних, аудіо та відео) створених ембеддингів.
HI-FI News
через DEV Community: AWS Heroes https://ift.tt/M5zl74c
9 лютого 2026 року, 17:15
February 9, 2026 at 05:15PM

Залишити відповідь