低代码开发能与视频对话的AI聊天应用(含前后端代码)

在本篇文章中,我会构建一个基于生成式AI的应用,让大家能利用生成式AI的能力和视频交互,并且几乎不需要编写任何代码。

在本篇文章中,我将展示如何构建一个简单的AI应用,它可以总结冗长的YouTube视频并使其可交互,同样的方式大家可以应用到B站视频等。海外的开发者经常观看YouTube视频,目的包括学习、娱乐和工作。因为是从事IT行业,开发者有时候没有时间看完整个视频,但又非常想了解视频中提到的关键内容,以便进一步深入研究自己感兴趣的部分。今天大家可以可以利用这个应用来实现这个需求。

例如在下图中,我就用了这个应用总结了Matt Wood(亚马逊云科技AI副总裁)在亚马逊洛杉矶峰会上的1.5小时主题演讲,AI总结并生成内容的整个过程不到一分钟。然后我们就可以围绕自己感兴趣的关键点向AI提问,并通过对话进行深入探讨。

架构设计方案

AI视频交互助手架构详解

以下是整个云端解决方案的流程图 

  1. 用户输入一个YouTube视频URL,让AI助手进行总结。
  2. Streamlit应用底层代码会提取URL,解析出视频ID,并调用YouTube API获取视频的转录文本。
  3. 应用从转录文本中构建一个提示词,并将其传递给Amazon Bedrock,使用预定义的模型进行内容总结。
  4. Bedrock根据提示词总结转录文本,并将响应回复返回给用户。
  5. 如果用户有后续问题,应用使用Langchain构建对话记忆,并基于原始转录内容回答用户的后续提问。

项目实操前提准备

如果大家对亚马逊云科技的生成式AI技术栈不熟悉,我建议先学习相关内容,然后再回来开始本项目的搭建。我们在动手之前,可以对以下组件进行了深入学习和了解,方便我们开始本篇文章中的项目。

  1. 在us-east-1区域设置Amazon Bedrock访问权限,并为Anthropic Claude 3模型启用访问权限。我选择这个AI大语言模型,因为它的最大Token数为200k,这让我能够在不增加我们的AI应用复杂度的情况下处理最长达3小时的视频转录文本。
  2. 在自己喜欢的代码IDE中安装Amazon Q Developer扩展。我使用的是Visual Studio Code。
  3. 熟悉Streamlit框架,以便部署AI Python应用——利用该框架的网页项目发布流程仅需一分钟。

代码组成部分

作为一名云端方案设计者,我认为理解各组件如何协同工作,以及了解模块修改对整体解决方案的影响是非常重要。我们应该对生成式AI应用的整体逻辑和架构有较好的理解,然而除了代码,我们还需要编写代码使其运行。因此在本方案中,我想利用AI代码生成助手Amazon Q,测试其如何帮助我最大程度地减少代码编写工作。通过多次迭代和参考大量现有示例,这个过程其实并不难。

代码主要由以下三个组件组成:

  1. bedrock.py:负责与LLM交互,创建Bedrock运行环境,进行内容总结,并利用LangChain管理聊天历史记录。
  2. utilities.py:负责获取视频转录文本,并基于转录内容构建提示词。
  3. app.py:主应用,负责与用户交互,包括接收视频URL、返回摘要、管理聊天会话等。

Bedrock模块详解

首先我向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为我构建了以下三个函数代码:

  1. 从YouTube URL获取视频ID
  2. 根据视频ID获取视频转录文本
  3. 从转录文本生成提示词

代码如下所示:

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应用模块详解

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(概念性验证)的代码。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值