借助 Amazon Nova 模型与 Bedrock Knowledge Base 实现视频检索

不知您是否有过想要检索视频的经历?

比如,只依稀记得视频里提到过某些内容,但这些内容并未体现在视频标题中,导致无论如何都找不到对应的视频。

或许如果能像使用 Google 搜索那样检索就好了,但对于公司内部的视频或工作中使用的视频而言,事情往往没那么简单。

为了解决这类困扰,我们尝试利用 Amazon Nova 模型与 Amazon Bedrock Knowledge Base 开发了一款工具。

通过使用 Bedrock Knowledge Base,无需自行开发文档导入与检索功能,只需将视频的摘要结果存入 S3,即可轻松实现联动。

也就是说,能够在最大限度降低开发成本的同时,开发出高性能的应用程序。

构成图

1. 视频检索想要实现的目标

如果视频标题中包含目标语句,那么通过标题就能进行检索,但对于仅在视频部分内容中提及的信息等,很难通过字符串进行检索。

此外,有时用户并非对某一特定视频感兴趣,而是希望广泛检索主题相同的视频。

在本次视频检索项目中,为实现此类模糊检索,我们考虑通过 Bedrock Knowledge Base 进行向量检索。

2. 实现方法

大致步骤如下:

  1. 使 Amazon Nova 模型可对视频进行摘要处理
  2. 使摘要结果可导入 Bedrock Knowledge Base
  3. 实现视频检索处理
  4. 制作检索界面

下面分别进行详细说明。

2.1. 使 Amazon Nova 模型可对视频进行摘要处理

通过模型生成摘要

Amazon Nova 模型除了可接收文本、图像输入外,还能接收视频输入。

我们将视频及其文字稿与下述提示词一同输入模型,让模型生成摘要文本。

本次我们从 YouTube 频道视频中,选取了时长 1 分钟以内的视频,并上传至 S3。

视频上传至 S3 后,Lambda 会接收事件触发,调用 Amazon Nova Lite 为这些视频生成说明文本,并将文本文件上传至 S3。

该文本文件随后将成为 Knowledge Base 的导入对象。

system_prompt = [
    {
        "text": dedent("""\
            您的任务是分析给定的视频,并说明视频中呈现的内容。
            视频的文字稿结果已记载在「文字稿:xxx」部分,请将其作为说明的依据。
            您的回复必须严格仅由视频的说明文本构成。
            请尽可能详细地进行说明。
            摘要请以中文呈现。
        """)
    }
]
use_messages = [
    {
        "role": "user",
        "content": [
            {"text": f"视频名: {filename}"},
            {
                "video": {
                    "format": "mp4",
                    "source": {"bytes": b64_content},
                },
            },
            {"text": f"文字稿: {transcript}"},
            {"text": "请用中文说明此视频。"},
        ],
    }
]
config = {"temperature": 0}
body = {
    "schemaVersion": "messages-v1",
    "system": system_prompt,
    "messages": use_messages,
    "inferenceConfig": config,
}

response = bedrock_agent.invoke_model(
    modelId=MODEL_ID,
    body=json.dumps(body),
    contentType="application/json",
)
model_response = json.loads(response["body"].read())
content = model_response["output"]["message"]["content"][0]["text"]

模型会返回如下响应:

此外,由于本次仅针对短时长视频,因此采用了直接向 API 提交视频的方式,但如果文件体积较大,则需要采取诸如读取上传至 S3 的文件、将视频分段传输后再合并等方法。

2.2. 使摘要结果可导入 Bedrock Knowledge Base

导入 Knowledge Base

接下来需要通过 Knowledge Base 进行同步,以导入上述说明文本。但如果直接导入,无法实现原始视频与上传的文本文件之间的关联。

为解决这一问题,我们使用了 Knowledge Base 的 metadata.json 功能。

在此 JSON 文件中记载的内容,会在 Knowledge Base 同步时作为元数据保存到 OpenSearch Serverless 中,可供检索时获取。

本次我们在元数据中指定了视频的 URL,用于检索后的界面显示。

{
  "metadataAttributes": {
    "original_path": "s3://bucket/path/to/video.mp4"
  }
}

当视频的说明文本与对应的 metadata.json 配置完成后,即可对 Knowledge Base 进行同步。

2.3. 实现视频检索处理

执行检索

检索时使用了 Knowledge Base 的 Retrieve API。

此外,通过在检索后设置分数下限作为阈值,可确保经重排序后被判定为相关性较低的视频不纳入检索结果。

const input = {
  knowledgeBaseId,
  retrievalQuery: {
    text: query.trim(),
  }
  retrievalConfiguration: {
    vectorSearchConfiguration: {
      numberOfResults: 20,
      overrideSearchType: "HYBRID",
      rerankingConfiguration: {
        bedrockRerankingConfiguration: {
          modelConfiguration: {
            modelArn: AMAZON_RERANK_MODEL,
          },
          numberOfRerankedResults: 10,
        },
        type: "BEDROCK_RERANKING_MODEL",
      },
    },
  },
};
const command = new RetrieveCommand(input);
return client.send(command);

可按如下方式获取视频的概要及视频文件路径:

{
  "retrievalResults": [{
    "content": {
      "text": "该视频介绍了远程办公中的 IT 工程师想吃的豆沙包排名……",
      "type": "TEXT"
    },
    "location": {
      "s3Location": {
        "uri": "s3://bucket/path/to/summary.txt"
      },
      "type": "S3"
    },
    "metadata": {
      "original_path": "s3://bucket/path/to/video.mp4"
    }
  }]
}

2.4. 制作检索界面

本次使用 bolt.new 制作了执行上述检索的界面。

虽然我不太擅长前端开发,但只需用中文下达指令,就能制作出非常不错的应用,这一点让我很惊喜。

制作的检索应用
检索结果

3. 结果

3.1. 尝试用视频中包含的语句进行检索

首先,我们尝试使用既包含在视频标题中、也包含在生成式 AI 生成的摘要文本中的关键词进行检索。

经确认,目标视频会显示在检索结果的第一位。

当遇到 “想再看那个视频,但用传统检索方式搜不到” 的情况时,使用这款应用就能立即找到想看的视频。

“美味的豆沙包”

3.2. 尝试用视频中不包含的语句进行检索

接下来,我们尝试用未出现在标题和摘要文本中,但凭借向量检索可能捕捉到相关内容的语句进行了检索。

此次检索也成功命中了一段视频,内容是 2018 年参加在美国旧金山举办的 “Elastic {ON}” 大会时的场景。

虽然本次知识库中仅导入了 Elastic {ON} 相关的视频,但如果预先导入其他海外大会的视频,就能实现 “并非想找某一特定视频,而是希望广泛获取同类视频” 的需求。

海外大会的场景

总结

目前,Bedrock Knowledge Base 尚无法直接输入视频,但通过使用 Amazon Nova 生成视频说明文本,我们间接实现了视频检索功能。

虽然通过自行对视频进行嵌入处理也能实现相同功能,但 Bedrock Knowledge Base 的优势在于可轻松集成内容导入与检索能力。

内容导入仅需将文件放入 S3 并执行 “同步” 操作即可,检索也只需调用 Retrieve API。借助 Retrieve API,还能通过重排序功能轻松优化检索结果。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注