文搜视频、图搜视频、视频搜视频——Nova Multimodal Embeddings 多模态素材搜索实战

15 阅读1分钟

上周帮朋友的游戏团队看素材管理方案,他们的痛点让我很有共鸣:库里十万条广告视频,找一个"角色被手指弹飞"的片段,翻了半小时没找到,最后重新拍了一条。

刚好看到 JoyCastle(乐堡互娱)跟亚马逊云科技合作的案例,用 Amazon Nova Multimodal Embeddings 解决了这个问题。拆解一下方案。

素材库变成"素材沼泽"

做过游戏广告投放的都知道,素材是命根子。JoyCastle 作为一家全球化移动游戏公司,日下载量超百万,全球玩家过亿。每月新增数千条广告视频,库里已经堆了超过十万条素材。

问题来了:找素材比做素材还慢。

传统的管理方式就是人工打标签+关键词搜索。标签是运营同事一条一条手动标的,标准不统一,搜索也只能匹配关键词。你搜"角色被手指弹飞",系统直接懵了——因为没人打过这种标签。

更要命的是跨模态检索。创意同事手里有一张参考图,想找风格类似的视频片段,传统系统压根不支持。结果就是大量优质素材沉在文件夹里,团队宁可重新拍也不愿意翻找。

Amazon Nova Multimodal Embeddings:统一向量空间

JoyCastle 跟亚马逊云科技游戏行业解决方案团队合作,基于 Amazon Nova Multimodal Embeddings 搭了一套智能素材管理系统。

核心思路:把文本、图片、视频、音频全部映射到同一个语义向量空间,实现跨模态语义搜索。

跟传统方案对比一下:

对比维度人工标签+关键词LLM自动打标Nova Multimodal Embeddings
标注成本高(纯人工)中(需定义Prompt)低(无需标注)
搜索灵活性受限于预定义标签受限于预定义Prompt支持任意自然语言查询
跨模态搜索不支持不支持原生支持文本↔图片↔视频↔音频
实时性依赖标签完整性批处理,延迟高毫秒级向量检索
可扩展性线性增长推理成本高一次Embedding,长期复用

Nova Multimodal Embeddings 有个杀手级特性:视频智能分段(Segmented Embedding)。它能自动把长视频切成 1-30 秒的片段,每个片段独立生成向量。这跟广告素材的使用方式天然匹配——创意团队要的从来不是整条视频,而是其中某个 5 秒的精彩片段。

架构拆解

整个系统基于亚马逊云科技的 GMM(Gaming Material Manager)方案,核心组件:

  • Amazon Bedrock:提供 Nova Multimodal Embeddings 模型访问,支持同步和异步调用
  • Amazon OpenSearch Service:向量数据库,HNSW 索引 + 毫秒级 KNN 检索
  • Amazon Lambda:无服务器计算,处理 Embedding 生成和搜索请求
  • Amazon S3:存储原始素材文件
  • Amazon SQS + DynamoDB:异步任务编排与状态追踪

两条核心工作流:

素材入库:素材上传 S3 → Lambda 触发 → Bedrock 生成 Embedding → 存入 OpenSearch

素材检索:用户输入(文本/图片/视频/音频)→ Bedrock 生成查询向量 → OpenSearch KNN 搜索 → 返回相似素材+时间戳

向量维度怎么选

Nova Multimodal Embeddings 基于 Matryoshka Representation Learning(MRL)训练,提供四种维度:

维度英文精度中文精度适用场景
307289.378.2对检索质量要求极高的核心场景
102485.768.3大多数业务场景(推荐)
384大规模部署、延迟敏感
256成本优化极端场景

JoyCastle 的实践建议:广告素材场景用 SEGMENTED_EMBEDDING 模式 + 5 秒分段长度 + 1024 维度,精度和成本平衡点刚刚好。

多模态搜索怎么用

系统支持这些搜索方式:

  • 文搜视频/图片/音频:输入"角色被手指弹飞的画面",语义匹配而非关键词匹配
  • 以图搜图/视频:上传参考图,找视觉风格相似的素材
  • 以视频搜视频:上传一段片段,找内容或风格相近的其他素材
  • 以音搜索:通过音频特征检索相似素材

所有模态映射到统一向量空间——"赛车"这个文本描述会在语义空间中跟包含赛车画面的视频自然靠近。

搜索结果精确到视频片段级别,返回具体的起止时间戳和相似度评分。支持 AUDIO_VIDEO_COMBINED 模式,同时理解画面内容和音频信息。

实测效果

基于 170 个游戏广告素材(130 条视频 + 40 张图片)测试:

  • 96.7% 召回成功率——目标内容被成功检索到
  • 73.3% 高精度召回——目标出现在 Top 2 结果中
  • 跨语言能力——中文查询 78.2 分,英文查询 89.3 分(3072 维度)

代码示例:快速上手

import boto3
import json

# 初始化 Bedrock Runtime 客户端
bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')

# 文本生成 Embedding
def get_text_embedding(text, dimension=1024):
    response = bedrock.invoke_model(
        modelId='amazon.nova-embed-multimodal-v1:0',
        body=json.dumps({
            "inputText": text,
            "embeddingConfig": {
                "outputEmbeddingLength": dimension
            }
        })
    )
    result = json.loads(response['body'].read())
    return result['embedding']

# 视频分段 Embedding(异步)
def get_video_segment_embedding(s3_uri, segment_seconds=5):
    response = bedrock.start_async_invoke(
        modelId='amazon.nova-embed-multimodal-v1:0',
        modelInput={
            "inputVideo": {"s3Uri": s3_uri},
            "embeddingConfig": {
                "outputEmbeddingLength": 1024,
                "videoEmbeddingConfig": {
                    "embeddingType": "SEGMENTED_EMBEDDING",
                    "segmentLengthInSec": segment_seconds
                }
            }
        },
        outputDataConfig={"s3OutputDataConfig": {"s3Uri": "s3://your-bucket/output/"}}
    )
    return response['invocationArn']

# 使用示例
embedding = get_text_embedding("角色被手指弹飞的画面")
print(f"向量维度: {len(embedding)}")
# OpenSearch KNN 搜索
from opensearchpy import OpenSearch

client = OpenSearch(
    hosts=[{'host': 'your-domain.us-east-1.es.amazonaws.com', 'port': 443}],
    use_ssl=True
)

def search_similar(query_vector, top_k=10):
    body = {
        "size": top_k,
        "query": {
            "knn": {
                "embedding_vector": {
                    "vector": query_vector,
                    "k": top_k
                }
            }
        }
    }
    response = client.search(index="media-assets", body=body)
    return response['hits']['hits']

# 搜索与查询语义相似的素材
results = search_similar(embedding)
for hit in results:
    print(f"素材: {hit['_source']['filename']}, "
          f"相似度: {hit['_score']:.4f}, "
          f"时间段: {hit['_source'].get('start_time', 'N/A')}-{hit['_source'].get('end_time', 'N/A')}")

从搜索到全链路智能化

JoyCastle 跟亚马逊云科技正在推进下一步:

  1. 智能切分:结合投放效果数据(转化率、点击率),自动识别高效素材片段
  2. 自动拼接:用自然语言描述需求,系统自动完成检索→分析→去重→拼接
  3. 自动投放测试:打通广告创编模块,形成"检索→拼接→投放→反馈→优化"闭环

动手试试

完整源码和部署脚本已开源:

git clone https://github.com/aws-samples/nova-multimodal-embeddings-gmm
cd nova-multimodal-embeddings-gmm
# 按 README 部署

如果你的团队也在为素材管理头疼,这套方案值得试试。特别是游戏、电商、短视频这些素材密集型行业,多模态搜索带来的效率提升是质变级的。


参考:JoyCastle 素材资产智能化之路:基于 Amazon Nova Multimodal Embeddings 的广告素材管理实践