在本篇文章中,我会构建一个基于生成式AI的应用,让大家能利用生成式AI的能力和视频交互,并且几乎不需要编写任何代码。
在本篇文章中,我将展示如何构建一个简单的AI应用,它可以总结冗长的YouTube视频并使其可交互,同样的方式大家可以应用到B站视频等。海外的开发者经常观看YouTube视频,目的包括学习、娱乐和工作。因为是从事IT行业,开发者有时候没有时间看完整个视频,但又非常想了解视频中提到的关键内容,以便进一步深入研究自己感兴趣的部分。今天大家可以可以利用这个应用来实现这个需求。
例如在下图中,我就用了这个应用总结了Matt Wood(亚马逊云科技AI副总裁)在亚马逊洛杉矶峰会上的1.5小时主题演讲,AI总结并生成内容的整个过程不到一分钟。然后我们就可以围绕自己感兴趣的关键点向AI提问,并通过对话进行深入探讨。
以下是整个云端解决方案的流程图
如果大家对亚马逊云科技的生成式AI技术栈不熟悉,我建议先学习相关内容,然后再回来开始本项目的搭建。我们在动手之前,可以对以下组件进行了深入学习和了解,方便我们开始本篇文章中的项目。
作为一名云端方案设计者,我认为理解各组件如何协同工作,以及了解模块修改对整体解决方案的影响是非常重要。我们应该对生成式AI应用的整体逻辑和架构有较好的理解,然而除了代码,我们还需要编写代码使其运行。因此在本方案中,我想利用AI代码生成助手Amazon Q,测试其如何帮助我最大程度地减少代码编写工作。通过多次迭代和参考大量现有示例,这个过程其实并不难。
代码主要由以下三个组件组成:
首先我向Amazon Q提出了这个问题:
write a python function that sets up a conversational AI system using the Amazon Bedrock service and the Claude language model (claude3). The AI can engage in a back-and-forth conversation with a user, maintaining context and providing relevant responses based on the prompt template and conversation history and then return the conversation with the user
它为我生成了示例代码,我只需进行少量调整,就能使其能够在Streamlit环境中运行。最终代码如下所示:
import boto3
from langchain.prompts import PromptTemplate
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
from langchain_community.chat_models import BedrockChat
import streamlit as st
from botocore.config import Config
retry_config = Config(
region_name = 'us-east-1',
retries = {
'max_attempts': 10,
'mode': 'standard'
}
)
def bedrock_chain():
ACCESS_KEY = st.secrets["ACCESS_KEY"]
SECRET_KEY = st.secrets["SECRET_KEY"]
session = boto3.Session(
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY
)
bedrock_runtime = session.client("bedrock-runtime", config=retry_config)
model_id = "anthropic.claude-3-sonnet-20240229-v1:0"
model_kwargs = {
"max_tokens": 2048, # Claude-3 use “max_tokens” However Claud-2 requires “max_tokens_to_sample”.
"temperature": 0.0,
"top_k": 250,
"top_p": 1,
"stop_sequences": ["\n\nHuman"],
}
model = BedrockChat(
client=bedrock_runtime,
model_id=model_id,
model_kwargs=model_kwargs,
)
prompt_template = """System: TThe following is a video transcript. I want you to provide a comprehensive summary of this text and then list the key points. The entire summary should be around 400 word.
Current conversation:
{history}
User: {input}
Bot:"""
prompt = PromptTemplate(
input_variables=["history", "input"], template=prompt_template
)
memory = ConversationBufferMemory(human_prefix="User", ai_prefix="Bot")
conversation = ConversationChain(
prompt=prompt,
llm=model,
verbose=True,
memory=memory,
)
return conversation
我让Amazon Q为我构建了以下三个函数代码:
代码如下所示:
import logging
from youtube_transcript_api import YouTubeTranscriptApi
logger = logging.getLogger()
logger.setLevel("INFO")
def get_video_id_from_url(youtube_url):
logger.info("Inside get_video_id_from_url ..")
watch_param = 'watch?v='
video_id = youtube_url.split('/')[-1].strip()
if video_id == '':
video_id = youtube_url.split('/')[-2].strip()
if watch_param in video_id:
video_id = video_id[len(watch_param):]
logger.info("video_id")
logger.info(video_id)
return video_id
def get_transcript(video_id):
logger.info("Inside get_transcript ..")
transcript = YouTubeTranscriptApi.get_transcript(video_id)
logger.info("transcript")
logger.info(transcript)
return transcript
def generate_prompt_from_transcript(transcript):
logger.info("Inside generate_prompt_from_transcript ..")
prompt = "Summarize the following video:\n"
for trans in transcript:
prompt += " " + trans.get('text', '')
logger.info("prompt")
logger.info(prompt)
return prompt
app.py是Streamlit网页前端应用代码,它提供用户界面,让用户可以输入视频URL进行摘要,并与视频内容进行对话。
在这个文件中,大部分代码涉及用户会话管理、UI设计以及如何呈现应用的交互逻辑。其中最核心的函数是handle_input()
,它负责检测用户输入(是摘要请求还是后续提问)、返回对应的摘要或聊天回复,并相应地重置用户状态。
import logging
from youtube_transcript_api import YouTubeTranscriptApi
logger = logging.getLogger()
logger.setLevel("INFO")
def get_video_id_from_url(youtube_url):
logger.info("Inside get_video_id_from_url ..")
watch_param = 'watch?v='
video_id = youtube_url.split('/')[-1].strip()
if video_id == '':
video_id = youtube_url.split('/')[-2].strip()
if watch_param in video_id:
video_id = video_id[len(watch_param):]
logger.info("video_id")
logger.info(video_id)
return video_id
def get_transcript(video_id):
logger.info("Inside get_transcript ..")
transcript = YouTubeTranscriptApi.get_transcript(video_id)
logger.info("transcript")
logger.info(transcript)
return transcript
def generate_prompt_from_transcript(transcript):
logger.info("Inside generate_prompt_from_transcript ..")
prompt = "Summarize the following video:\n"
for trans in transcript:
prompt += " " + trans.get('text', '')
logger.info("prompt")
logger.info(prompt)
return prompt
在完成代码开发完成后,我们通过Streamlit非常简单的就部署这个应用并让其他人可以使用。这一平台让构建和部署生成式AI应用变得异常简单。
AI代码助手极大的提升了该项目的开发效率,整个过程花了我几周时间,每周抽出一两个小时来开发。但如果没有AI助手,这个过程肯定会耗费更长的时间。总体来说,完成这个项目的时间大约是5-6小时。
在这篇文章中,我展示了如何结合Amazon Q、Amazon Bedrock和Streamlit构建一个简单的应用,实现YouTube视频摘要和交互式对话。我还演示了如何利用生成式AI加速开发过程,并使用Amazon Q快速生成可用于POC(概念性验证)的代码。