在亚马逊云科技上提取视频内容并利用AI大模型开发视频内容问答服务

项目简介:

小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践,并应用到自己的日常工作里。

本次介绍的是如何在亚马逊云科技上利用音视频转录服务Transcribe提取视频内容字幕,并利用SageMaker部署开源向量模型GPT-J 6B和大语言模型Falcon-7B,利用向量模型对视频字幕进行向量化并存入FAISS内存向量库,最后利用streamlit框架搭建Web UI集成大模型API实现基于视频内容的问答。本架构设计全部采用了云原生Serverless架构,提供可扩展和安全的AI解决方案。本方案的解决方案架构图如下:

方案所需基础知识    

什么是 Amazon SageMaker?

Amazon SageMaker 是亚马逊云科技提供的一站式机器学习服务,帮助开发者和数据科学家轻松构建、训练和部署机器学习模型。SageMaker 提供了全面的工具,从数据准备、模型训练到部署和监控,覆盖了机器学习项目的全生命周期。通过 SageMaker,用户可以加速机器学习模型的开发和上线,并确保模型在生产环境中的稳定性和性能。

什么是 Amazon Transcribe?

Amazon Transcribe 是亚马逊云科技提供的一项自动语音识别(ASR)服务,能够将语音内容准确地转录为文本。Transcribe 支持实时和批量转录,能够处理多种语言和方言。它被广泛应用于客户服务、内容制作、会议记录等场景,帮助企业轻松地将音频和视频内容转化为可搜索、可分析的文本数据。

基于视频转录内容进行问答的现实场景

在现代内容消费和业务场景中,视频正变得越来越重要。通过 Amazon Transcribe,将视频内容转录为文本后,可以进一步应用于问答系统,提升用户体验和业务效率。例如:

在线教育

在在线课程平台上,学生可以通过输入问题,基于课程视频的转录内容快速找到答案,提升学习效率和效果。

客户支持

客服团队可以通过视频转录内容建立知识库,客户在观看产品演示视频时,能够实时查询与视频内容相关的常见问题和解答,提升客户满意度。

媒体内容索引

对媒体公司而言,转录视频内容后,可以建立基于视频内容的问答系统,用户可以快速搜索视频中的关键信息,提升内容的可访问性和互动性。

企业内部培训

企业可以将培训视频内容转录为文本,并基于这些转录内容提供员工自助问答服务,帮助员工快速获取培训相关的信息,提升内部知识传播效率。

本方案包括的内容

1.  利用亚马逊云科技Transcribe服务对音视频文件进行文字转录

2. 在Amazon SageMaker上部署向量大模型

3. 在Amazon SageMaker上利用Jupyter Notebook处理原始数据构建知识库

4. 开发基于Streamlit框架的视频内容问答的网页服务并部署。

项目搭建具体步骤

1. 进入亚马逊云科技控制台,并打开Amazon Transcribe服务

2. 点击”Create Job“创建一个Transcribe音视频转录服务

3. 为任务取名为”video-transcription“,并选择语言为英文

4. 在S3桶中选择一个我们希望转录的视频文件。

5. 选择一个保存转录文本的S3存储桶,最后点击Create创建

6. 重复上述步骤我们再创建一个新的任务”audio-transcription“,用于转录音频文件。

7. 接下来我们进入到SageMaker服务主页,点击Open Studio打开我们的Studio机器学习开发环境。

8. 我们点击JumpStart中的HuggingFace,用于快速部署AI大模型,无需额外创建和训练。

9. 在搜索框中搜索模型名”GPT-J 6B Embedding FP16“, 并点击

10. 配置模型计算资源类型为”ml.g5.2xlarge“,再点击部署。同时我们使用相同的步骤部署大模型”Falcon-7b“。

11. 接下来我们打开一个Jupyter Notebook,首先创建一个ipynb文件,复制以下代码安装和导入必要依赖,如LangChain和SageMaker等。

!pip install --upgrade sagemaker --quiet
!pip install ipywidgets==7.0.0 --quiet
!pip install langchain==0.0.148 --quiet
!pip install faiss-cpu --quiet
!pip install unstructured==0.8.1 --quiet

import time
import os
import sagemaker, boto3, json
from sagemaker.session import Session
from sagemaker.model import Model
from sagemaker import image_uris, model_uris, script_uris, hyperparameters
from sagemaker.predictor import Predictor
from sagemaker.utils import name_from_base
from typing import Any, Dict, List, Optional
from langchain.embeddings import SagemakerEndpointEmbeddings
from langchain.llms.sagemaker_endpoint import ContentHandlerBase

12. 接下来我们初始化SageMaker客户端,定义三个函数分别获取大模型回复、处理响应、获取大模型API端点。

sagemaker_session = Session()

aws_role = sagemaker_session.get_caller_identity_arn()
aws_region = boto3.Session().region_name
sess = sagemaker.Session()

client = boto3.client("runtime.sagemaker")

def query_endpoint_with_json_payload(encoded_json, endpoint_name, content_type="application/json"):
    response = client.invoke_endpoint(
        EndpointName=endpoint_name, ContentType=content_type, Body=encoded_json
    )
    return response


def parse_response(query_response):
    model_predictions = json.loads(query_response["Body"].read())
    return model_predictions

def get_model_endpoint_with_prefix(prefix="falcon"):
    # Create a SageMaker client
    client = boto3.client('sagemaker')
    
    # List all SageMaker endpoints
    response = client.list_endpoints(
        MaxResults=5,  
        SortBy='Name'
    )
    
    # Filter endpoints that start with 'falcon'
    for endpoint in response['Endpoints']:
        if endpoint['EndpointName'].startswith(prefix):
            return endpoint['EndpointName']
    
    return None

qa_endpoint_name = get_model_endpoint_with_prefix()

13. 我们利用以下代码段与SageMaker端点进行API交互生成关于问题的回复,问题为”什么是Amazon Bedrock“

## Code Cell 3 ##

question = "What is Amazon Bedrock?"

payload = {
        "inputs": question,
        "max_new_tokens": 50,
        "top_k":50,
        "num_return_sequences": 1,
        "top_p":0.95,
        "do_sample":True
    }

query_response = query_endpoint_with_json_payload(
        json.dumps(payload).encode("utf-8"), endpoint_name=qa_endpoint_name
    )
generated_texts = parse_response(query_response)

print(f"{generated_texts[0]}")    

14. 接下来我们通过LangChain创建一个SageMaker上的向量模型实例,指定了向量模型端点、文档向量化配置以及API输入输出请求格式。

## Code Cell 4 ##

from langchain.embeddings.sagemaker_endpoint import EmbeddingsContentHandler
from langchain.embeddings import SagemakerEndpointEmbeddings


class SagemakerEndpointEmbeddingsJumpStart(SagemakerEndpointEmbeddings):
    def embed_documents(self, texts: List[str], chunk_size: int = 5) -> List[List[float]]:
        """Compute doc embeddings using a SageMaker Inference Endpoint.

        Args:
            texts: The list of texts to embed.
            chunk_size: The chunk size defines how many input texts will
                be grouped together as request. If None, will use the
                chunk size specified by the class.

        Returns:
            List of embeddings, one for each text.
        """
        results = []
        _chunk_size = len(texts) if chunk_size > len(texts) else chunk_size

        for i in range(0, len(texts), _chunk_size):
            response = self._embedding_func(texts[i : i + _chunk_size])
            print
            results.extend(response)
        return results


class ContentHandler(EmbeddingsContentHandler):
    content_type = "application/json"
    accepts = "application/json"

    def transform_input(self, prompt: str, model_kwargs={}) -> bytes:
        input_str = json.dumps({"text_inputs": prompt, **model_kwargs})
        return input_str.encode("utf-8")

    def transform_output(self, output: bytes) -> str:
        response_json = json.loads(output.read().decode("utf-8"))
        embeddings = response_json["embedding"]
        return embeddings


content_handler = ContentHandler()

embeddings = SagemakerEndpointEmbeddingsJumpStart(
    endpoint_name=get_model_endpoint_with_prefix("jumpstart"),
    region_name=aws_region,
    content_handler=content_handler,
)

15. 利用LangChain初始化SageMaker上的大语言模型,指定模型回复参数、API调用输入输出格式。

## Code Cell 5 ##

from langchain.llms.sagemaker_endpoint import LLMContentHandler, SagemakerEndpoint

parameters = {
    "max_length": 200,
    "num_return_sequences": 1,
    "top_k": 250,
    "top_p": 0.95,
    "do_sample": False,
    "temperature": 1,
}

class ContentHandler(LLMContentHandler):
    content_type = "application/json"
    accepts = "application/json"

    def transform_input(self, prompt: str, model_kwargs={}) -> bytes:
        input_str = json.dumps({"inputs": prompt, **model_kwargs})
        return input_str.encode("utf-8")

    def transform_output(self, output: bytes) -> str:
        response_json = json.loads(output.read().decode("utf-8"))
        print(response_json)
       
        return response_json[0]["generated_text"]

content_handler = ContentHandler()

sm_llm = SagemakerEndpoint(
    endpoint_name=get_model_endpoint_with_prefix("falcon"),
    region_name=aws_region,
    model_kwargs=parameters,
    content_handler=content_handler,
)

16. 从S3桶中提取Transcribe转录的音视频内容,并将其保存到本地的rag_data/路径中,以txt结尾。

## Code Cell 6 ##

s3 = boto3.client('s3')
transcribes_bucket = [bucket['Name'] for bucket in s3.list_buckets()['Buckets'] if bucket['Name'].startswith('transcribe-')].pop()

!mkdir -p rag_data
!aws s3 cp --recursive s3://$transcribes_bucket rag_data

#Converting transcripts from json to text files
directory='rag_data'
for filename in os.listdir(directory):
    # Check if the current file is a JSON file
    if filename.endswith('.json'):
        json_path = os.path.join(directory, filename)
        # Open and read the JSON file
        with open(json_path) as json_file:
            data = json.load(json_file)
            transcript = data["results"]["transcripts"][0]["transcript"]
        
        # Create a corresponding text file name
        text_filename = filename.replace('.json', '.txt')
        text_path = os.path.join(directory, text_filename)
        
        # Open the text file for writing and write the transcript
        with open(text_path, 'w') as text_file:
            text_file.write(transcript)

17. 下面我们利用LangChain构建一个知识库来对文件内容进行问答,首先导入必要的依赖和将txt文件中的内容导入DirectorLoader加载器中。

## Code Cell 7 ##

import nltk
nltk.download('punkt_tab')

# Import the LangChain doc
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
from langchain.document_loaders import TextLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain.vectorstores import Chroma, AtlasDB, FAISS
from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter
from langchain import PromptTemplate
from langchain.chains.question_answering import load_qa_chain
from langchain.document_loaders import DirectoryLoader

loader = DirectoryLoader("./rag_data/", glob="*.txt")
documents = loader.load()

18. 接下来我们利用”VectorstoreIndexCreator“方法创建一个FAISS向量存储库,并利用向量模型将我们的文档内容向量化,再利用index.creator创建索引用于高效语义搜索。再使用我们刚才的问题对向量库进行提问。

## Code Cell 8 ##

index_creator = VectorstoreIndexCreator(
    vectorstore_cls=FAISS,
    embedding=embeddings,
    text_splitter=RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=200),
)
index = index_creator.from_loaders([loader])

# Review the question variable content.
print(question)

# Ask the question to the model using the vector store with the transcript embeddings.
index.query(question=question, llm=sm_llm)

19. 同时我们还可以用FAISS直接将文档向量化并进行语义搜索提问得到相似性最高的3个回复。

## Code Cell 9 ##

docsearch = FAISS.from_documents(documents, embeddings)

print(question)

docs = docsearch.similarity_search(question, k=3)

20. 在此处我们利用LangChain定义提示词模板,并利用问答链对向量库中搜索出的内容进行搜索增强回复(RAG)。

## Code Cell 11 ## 
prompt_template = """Answer based on context:\n\n{context}\n\n{question}"""

PROMPT = PromptTemplate(template=prompt_template, input_variables=["context", "question"])
chain = load_qa_chain(llm=sm_llm, prompt=PROMPT)

## Code Cell 12 ##
result = chain({"input_documents": docs, "question": question}, return_only_outputs=True)[
    "output_text"
]

21. 接下来我们创建一个chatbot.py文件,包含以上所有代码,用于调用知识库生成回复。并且创建一个requirements.txt用于安装必要依赖。

aiohttp==3.8.4
aiosignal==1.3.1
altair==5.0.1
async-timeout==4.0.2
attrs==23.1.0
blinker==1.6.2
boto3==1.26.150
botocore==1.29.150
cachetools==5.3.1
certifi==2023.5.7
charset-normalizer==3.1.0
click==8.1.3
dataclasses-json==0.5.7
decorator==5.1.1
frozenlist==1.3.3
gitdb==4.0.10
GitPython==3.1.31
idna==3.4
importlib-metadata==6.6.0
Jinja2==3.1.2
jmespath==1.0.1
jsonschema==4.17.3
langchain==0.0.195
langchainplus-sdk==0.0.8
markdown-it-py==2.2.0
MarkupSafe==2.1.3
marshmallow==3.19.0
marshmallow-enum==1.5.1
mdurl==0.1.2
multidict==6.0.4
mypy-extensions==1.0.0
numexpr==2.8.4
numpy==1.24.3
openapi-schema-pydantic==1.2.4
packaging==23.1
pandas==2.0.2
Pillow==9.5.0
protobuf==4.23.2
pyarrow==12.0.0
pydantic==1.10.9
pydeck==0.8.1b0
Pygments==2.15.1
Pympler==1.0.1
pyrsistent==0.19.3
python-dateutil==2.8.2
pytz==2023.3
pytz-deprecation-shim==0.1.0.post0
PyYAML==6.0
requests==2.31.0
rich==13.4.1
s3transfer==0.6.1
six==1.16.0
smmap==5.0.0
SQLAlchemy==2.0.15
streamlit==1.23.1
streamlit-chat==0.0.2.2
tenacity==8.2.2
toml==0.10.2
toolz==0.12.0
tornado==6.3.2
typing-inspect==0.9.0
typing_extensions==4.6.3
tzdata==2023.3
tzlocal==4.3
urllib3==1.26.16
yarl==1.9.2
zipp==3.15.0
unstructured==0.8.1
transformers~=4.30.2
faiss-cpu==1.7.4

22.  接下来我们运行以下命令,启动streamlit网页服务器。

streamlit run chatbot.py

23. 将服务器启动返回的URL在浏览器中打开,选择使用知识库内容回复,输入问题”什么是Amazon Bedrock“并点击send发送

24. 就可以得到基于知识库中视频内容的问题回复了

以上就是在亚马逊云科技上利用亚马逊云科技上利用Amazon Sagemaker部署AI大模型和向量模型,并基于Transcribe服务转录的视频字幕实现与用户问答的全部步骤。欢迎大家未来与我一起,未来获取更多国际前沿的生成式AI开发方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/870684.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

langchian 批次调用 prompt

目录 基础不使用批次 batch 批次调用 关于 langchian 额一些应用,可以查看案例: GitHub - 5zjk5/prompt-engineering: prompt 工程项目案例 基础不使用批次 from dotenv import load_dotenv import time import os from langchain_core.prompts imp…

Image-coloring的部署,在Ubuntu22.04系统下——点动科技

一、ubuntu22.04基本环境配置 1.1 更换清华Ubuntu镜像源 删除原来的文件 rm /etc/apt/sources.list开始编辑新文件 vim /etc/apt/sources.list先按i键,粘贴以下内容 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https:…

【体检】程序人生之健康检查,全身体检与预防疫苗,五大传染病普筛,基因检测等

程序员养生指南之 【体检】程序人生之健康检查,全身体检项目分类,五大传染病普筛,基因检测等 文章目录 一、全身体检与预防疫苗(年检)1、实验室检测:生化全套检查2、医技检查:辅助诊疗科室3、科…

【学习笔记】多元线性回归模型 —— Matlab

文章目录 前言一、多元线性回归多元线性回归模型线性模型 ( Y , X β , σ 2 I n ) (Y,X\beta,\sigma^2I_n) (Y,Xβ,σ2In​) 考虑的主要问题多元线性回归模型的参数估计多元线性回归模型和回归系数的检验 二、示例三、代码实现----Matlab1.多元回归的实现2.逐步回归的实现3.M…

MES系统:智能化排班排产的全面解决方案

MES(制造执行系统)管理系统通过集成多种先进技术、实时数据采集与分析、优化算法应用以及与其他系统的协同工作,实现了智能化排班排产功能。以下是该功能的详细实现方式: 数据集成与实时采集:MES系统与ERP、SCM、设备管…

Linux常用命令 ---- rmdir 命令[删除一个空目录]

rmdir 命令 功能:删除一个空目录 我们使用 mkdir 命令创建一个名为 test 空文件夹,如下图所示。 现在使用 rmdir 命令将 test 文件夹进行删除,如下图所示。 注意:rmdir 命令只能删除一个空目录,如果这个目录中有其他文…

python从入门到精通:函数

目录 1、函数介绍 2、函数的定义 3、函数的传入参数 4、函数的返回值 5、函数说明文档 6、函数的嵌套调用 7、变量的作用域 1、函数介绍 函数是组织好的,可重复使用的,用来实现特定功能的代码段。 name "zhangsan"; length len(nam…

【面试题系列Vue02】Vue Router 路由都有哪些模式?各模式之间有什么区别?

官方解析 Vue Router 路由有三种模式: hash 模式:使⽤ URL 中的 hash(即 # 后面的内容)来作为路由路径。 在这种模式下,页面不会重新加载,只会更新 hash 值,并触发路由变化,从而渲…

什么是机器人快换盘?

机器人快换盘,行业内也称作工具快换盘、换枪盘、快换工具盘、快速更换器、快换器、 快换夹具、治具快换等。是末端执行器快速更换装置(End-Of-Arm Tooling,简称EOAT),是工业自动化领域中用于机器人手臂上的一种重要设备…

【Python零基础】while循环和用户输入

文章目录 前言一、input()函数二、while循环三、使用while循环来处理列表和字典总结 前言 我们开发一个应用程序,目的都是为了解决最终用户的问题,针对用户界面输入的数据,按照用户期待的逻辑进行处理,得到用户想要的结果。本章将…

如何在前端测试中,在F12中加入token

不止是token,cookie中其他的数据也都可以这样 首先打开F12,然后找到Application或者应用程序 然后找到cookie里面双击这里,输入token或者其他数据就可以了,后面输值。

高性能日志系统

目录 设计思路 架构设计 设计模式应用 单例模式 工厂模式 建造者模式 代理模式 异步处理设计 异步日志器使用原因 异步日志器设计思路 异步日志器实现的核心模块说明 性能优化以及问题解决 测试结果 双缓冲区机制设计 设计思路及其架构 生产消费模式与双缓冲区结…

C++ wxWidgets图形界面开发用什么IDE最好?

在主流免费的IDE工具中,我们可以想到的支持cmake项目的工具就只有QtCreator,VisualStudio,VSCode这三个。其中QtCreator和VSCode支持WIndows,Mac,WIndows三大主流平台。但是VSCode在Ubuntu等系统下的支持并没有在WIndo…

【vue讲解:ref属性、动态组件、插槽、vue-cli创建项目、vue项目目录介绍、vue项目开发规范、es6导入导出语法】

0 ref属性&#xff08;组件间通信&#xff09; # 1 ref属性放在普通标签上<input type"text" v-model"name" ref"myinput">通过 this.$refs[myinput] 拿到的是 原生dom对象操作dom对象&#xff1a;改值&#xff0c;换属性。。。# 2 ref属…

Leetcode JAVA刷刷站(38)外观数列

一、题目概述 二、思路方向 为了解决这个问题&#xff0c;我们可以编写一个Java函数countAndSay&#xff0c;该函数接受一个整数n作为输入&#xff0c;并返回外观数列的第n个元素。这个函数将基于递归公式来构建数列&#xff0c;其中countAndSay(1) "1"&#xff0c;…

pycharm windows/mac 指定多版本python

一、背景 工作中经常会使用不同版本的包&#xff0c;如同时需要tf2和tf1&#xff0c;比较新的tf2需要更高的python版本才能安装&#xff0c;而像tf1.5 需要低版本的python 才能安装&#xff08;如 python3.6&#xff09;,所以需要同时安装多个版本。 二、安装多版本python py…

网络安全之XSS基础

从 XSS Payload 学习浏览器解码 xss payload 1.<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">1</a> 2.<a href"&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:…

SpringBoot+Vue在线商城(电子商城)系统-附源码与配套论文

摘 要 随着互联网技术的发展和普及&#xff0c;电子商务在全球范围内得到了迅猛的发展&#xff0c;已经成为了一种重要的商业模式和生活方式。电子商城是电子商务的重要组成部分&#xff0c;是一个基于互联网的商业模式和交易平台&#xff0c;通过网络进行产品和服务的销售。…

【题目/训练】:双指针

引言 我们已经在这篇博客【算法/学习】双指针-CSDN博客里面讲了双指针、二分等的相关知识。 现在我们来做一些训练吧 经典例题 1. 移动零 思路&#xff1a; 使用 0 当做这个中间点&#xff0c;把不等于 0(注意题目没说不能有负数)的放到中间点的左边&#xff0c;等于 0 的…

Unity项目优化记录

背景&#xff1a;测试反馈项目组游戏存在内存泄露&#xff0c;来找到中台这边协调排查。好家伙&#xff0c;跑了两次看了内存快照&#xff0c;再看资源组织和管理方式&#xff0c;存在的问题确实比较多。 1、修复内存泄露&#xff1a;结算界面由于资源引用丢失导致整个面板不会…