RAG进阶教程- 利用langchain下载B站视频并构建RAG应用

利用LangChain下载Bilibili视频并构建RAG应用教程

概述

本文将展示如何利用LangChain下载Bilibili视频并将其转录内容用于构建一个RAG(Retrieval-Augmented Generation)应用。

教程包括从视频下载、转录到RAG应用的实现步骤。以下是系统的架构图:

1architecture.drawio (2).png

环境准备

在开始之前,请确保您的环境已配置好,包括安装必要的Python库,并能调用OpenAI的大模型

sh
复制代码
pip install openai langchain langchain-openai langchain_pinecone langchain[docarray] docarray pydantic==1.10.8 pytube python-dotenv tiktoken pinecone-client scikit-learn ruff

这里提供完整的代码和流程,但是需要网络环境好以及能调用OpenAI的大模型才能完整运行代码

本教程重点展示实现过程,不涉及对RAG基础原理的解释和说明

第一步:提取视频

首先,我们需要将Bilibili视频下载到本地,并对视频内容进行转录。

由于这一步不是本教程的重点,这里只提供代码和相关API工具链接,感兴趣的读者可以自行研究。

1.1 将目标视频链接转化为Base64编码

为了使用API下载视频,首先需要将视频的URL转换为Base64编码。以下是具体代码:

python
复制代码
import requests
import os
import base64
from dotenv import load_dotenv

load_dotenv()

ROLL_APP_ID = os.getenv("ROLL_APP_ID")
ROLL_APP_SECRET = os.getenv("ROLL_APP_SECRET")

def url_to_base64(url):
    # 将URL编码为字节
    url_bytes = url.encode('utf-8')
    # 对字节进行Base64编码
    base64_bytes = base64.urlsafe_b64encode(url_bytes)
    # 将Base64字节转换为字符串
    base64_url = base64_bytes.decode('utf-8')
    return base64_url

# 示例URL
url = "https://www.bilibili.com/video/BV1im4y117pn"
base64_url = url_to_base64(url)
print("Base64编码后的URL:", base64_url)

1.2 使用API获得视频下载链接

API参数以及返回数据解析

image.png

python
复制代码
# 接口地址和请求参数
API_URL = "https://www.mxnzp.com/api/bilibili/video"

API_PARAMS = {
    "url": base64_url,
    "app_id": ROLL_APP_ID,  # 替换为你的 app_id
    "app_secret": ROLL_APP_SECRET  # 替换为你的 app_secret
}

# 获取视频下载链接
def get_video_download_url():
    response = requests.get(API_URL, params=API_PARAMS)
    data = response.json()
    
    if data['code'] == 1:
        video_url = data['data']['list'][0]['url']
        video_title= data['data']['title']
        return [video_title,video_url]
    else:
        print("Error:", data['msg'])
        return None
    
video = get_video_download_url()
print(video)

1.3 视频下载到本地

python
复制代码
import requests

def download_video_by_url(video):
    print("正在下载视频...")

    # 添加请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36"
    }

    response = requests.get(video[1], headers=headers)
    
    if response.status_code == 200:
        # 获取视频数据
        video_data = response.content

        # 指定视频文件的保存路径
        save_path = video[0] + ".mp4"  # 请指定保存路径和文件名
        # 使用urllib保存视频文件
        with open(save_path, "wb") as video_file:
            video_file.write(video_data)
            print("视频下载完成")
            return save_path
    else:
        print("无法下载视频,HTTP状态码:", response.status_code)
python
复制代码
# 定义视频文件名
video_file_name = video[0] +  ".mp4"

if not os.path.exists(video_file_name):
    video_file_name = download_video_by_url(video)

2. 用whisper转录音频内容

这里选择用whisper做音频转录,不是因为它效果最好,只是它免费,并且可以下载到本地使用

顺便说明一下,whisper对中文的支持度不高,如果要做一个可应用的产品,需要调用其他转录工具

python
复制代码
import tempfile
import whisper
from moviepy.editor import VideoFileClip

# 定义视频文件名和转录文件名
transcription_file_name = video_file_name +  ".txt"

if not os.path.exists(transcription_file_name):
    # 加载 Whisper 模型(可选择“tiny”, "base", "small", "large")
    whisper_model = whisper.load_model("small")

    with tempfile.TemporaryDirectory() as tmpdir:
        print(f"Temporary directory created at: {tmpdir}")
        
        # 将视频文件转换为音频文件
        video_path = os.path.join(tmpdir, video_file_name)
        audio_path = os.path.join(tmpdir, "audio.mp3")
        
        video = VideoFileClip(video_file_name)
        video.audio.write_audiofile(audio_path)
        print(f"Extracted audio file to: {audio_path}")

        if not os.path.exists(audio_path):
            raise FileNotFoundError(f"Extracted audio file not found at: {audio_path}")

        # 使用 Whisper 模型进行转录
        transcription = whisper_model.transcribe(audio_path, fp16=False, language="zh")["text"].strip()

        # 将转录结果保存到文件
        with open(transcription_file_name, "w") as file:
            file.write(transcription)
        print(f"Transcription saved to: {transcription_file_name}")

3. 设置langchain部分

需要在环境变量里配置API key

python
复制代码
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_BASE_URL = os.getenv("OPENAI_API_BASE")

3.1. 选择大语言模型

这里用gpt-3.5,因为便宜

首先加载大语言模型

python
复制代码
from langchain_openai.chat_models import ChatOpenAI

model = ChatOpenAI(openai_api_key=OPENAI_API_KEY,openai_api_base=OPENAI_BASE_URL, model_name="gpt-3.5-turbo")

3.2. 拆分文档

system2.png

有许多不同的方法可以拆分文档。在这个例子中,我们将使用一个简单的拆分器,将文档拆分成固定大小的块(chunk)

不同文档拆分方法的更多信息,请参阅文档拆分器

我们将转录内容拆分成每块1000个字符,并且每块之间有20个字符的重叠

python
复制代码
from langchain_community.document_loaders import TextLoader

loader = TextLoader(transcription_file_name)
text_documents = loader.load()
text_documents
python
复制代码
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=20)
documents = text_splitter.split_documents(text_documents)

3.3. 加载并嵌入拆分后的转录文本

python
复制代码
from langchain_openai.embeddings import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY,openai_api_base=OPENAI_BASE_URL)

3.4. 创建检索和生成答案的链式结构

python
复制代码
from langchain.prompts import ChatPromptTemplate

template = """
Answer the question based on the context below. If you can't 
answer the question, reply "I don't know".

Context: {context}

Question: {question}
"""

prompt = ChatPromptTemplate.from_template(template)
python
复制代码
from langchain_community.vectorstores import DocArrayInMemorySearch
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

vectorstore2 = DocArrayInMemorySearch.from_documents(documents, embeddings)

chain = (
    {"context": vectorstore2.as_retriever(), "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

3.5. 测试RAG应用

python
复制代码
chain.invoke("这篇文章讲述了关于人生的什么内容,并给出详细解释答案的原因")

总结

目前展示的RAG流程,是把知识库放在本地载入,这样并不优雅

更好的实现方式是通过一个向量数据库来储存知识库的内容

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。
  • 内容
    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
      - L1.4.1 知识大模型
      - L1.4.2 生产大模型
      - L1.4.3 模型工程方法论
      - L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
  • 内容
    • L2.1 API接口
      - L2.1.1 OpenAI API接口
      - L2.1.2 Python接口接入
      - L2.1.3 BOT工具类框架
      - L2.1.4 代码示例
    • L2.2 Prompt框架
      - L2.2.1 什么是Prompt
      - L2.2.2 Prompt框架应用现状
      - L2.2.3 基于GPTAS的Prompt框架
      - L2.2.4 Prompt框架与Thought
      - L2.2.5 Prompt框架与提示词
    • L2.3 流水线工程
      - L2.3.1 流水线工程的概念
      - L2.3.2 流水线工程的优点
      - L2.3.3 流水线工程的应用
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
  • 内容
    • L3.1 Agent模型框架
      - L3.1.1 Agent模型框架的设计理念
      - L3.1.2 Agent模型框架的核心组件
      - L3.1.3 Agent模型框架的实现细节
    • L3.2 MetaGPT
      - L3.2.1 MetaGPT的基本概念
      - L3.2.2 MetaGPT的工作原理
      - L3.2.3 MetaGPT的应用场景
    • L3.3 ChatGLM
      - L3.3.1 ChatGLM的特点
      - L3.3.2 ChatGLM的开发环境
      - L3.3.3 ChatGLM的使用示例
    • L3.4 LLAMA
      - L3.4.1 LLAMA的特点
      - L3.4.2 LLAMA的开发环境
      - L3.4.3 LLAMA的使用示例
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
  • 内容
    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

学习计划:

  • 阶段1:1-2个月,建立AI大模型的基础知识体系。
  • 阶段2:2-3个月,专注于API应用开发能力的提升。
  • 阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。
  • 阶段4:4-5个月,专注于高级模型的应用和部署。
这份完整版的所有 ⚡️ 大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

全套 《LLM大模型入门+进阶学习资源包↓↓↓ 获取~

👉CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值