LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve

接着前面的Langchain,继续实现读取YouTube的视频脚本来问答Indexes for information retrieve

  1. LangChain 实现给动物取名字,
  2. LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
  3. LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄

在这里插入图片描述

1. 安装youtube-transcript-api

pip install youtube-transcript-api

pip install faiss-cpu

pip install tiktoken

引用向量数据库Faiss
在这里插入图片描述

2. 编写读取视频字幕并存入向量数据库Faiss,文件langchain_helper.py

# 从langchain包和其他库中导入必要的模块
from langchain.document_loaders import YoutubeLoader  # 导入YoutubeLoader,用于加载YouTube视频数据
from langchain.text_splitter import RecursiveCharacterTextSplitter  # 导入文本分割器,用于处理文档
from langchain.embeddings.openai import OpenAIEmbeddings  # 导入OpenAIEmbeddings,用于生成嵌入向量
from langchain.vectorstores import FAISS  # 导入FAISS,用于大数据集中高效的相似性搜索
from langchain.llms import OpenAI  # 导入OpenAI,用于语言模型功能
from langchain import PromptTemplate  # 导入PromptTemplate,用于模板化提示
from langchain.chains import LLMChain  # 导入LLMChain,用于创建语言模型链
from dotenv import load_dotenv  # 导入load_dotenv,用于管理环境变量

load_dotenv()  # 从.env文件加载环境变量

embedding = OpenAIEmbeddings()  # 初始化OpenAI嵌入向量,用于生成文档嵌入向量

# YouTube视频的URL
video_url = "https://youtu.be/-Osca2Zax4Y?si=iy0iePxzUy_bUayO"

def create_vector_db_from_youtube_url(video_url: str) -> FAISS:
    # 加载YouTube视频字幕
    loader = YoutubeLoader.from_youtube_url(video_url)
    transcript = loader.load()
    
    # 将字幕分割成较小的片段
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
    docs = text_splitter.split_documents(transcript)
    
    # 从文档片段创建FAISS数据库
    db = FAISS.from_documents(docs, embedding)
    return db

# 示例:从给定YouTube URL创建向量数据库
print(create_vector_db_from_youtube_url(video_url))

zgpeaces-MBP at ~/Workspace/LLM/langchain-llm-app ±(feature/infoRetrievel) ✗ ❯ python langchain_helper.py
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/langchain/__init__.py:39: UserWarning: Importing PromptTemplate from langchain root module is no longer supported.
  warnings.warn(
<langchain.vectorstores.faiss.FAISS object at 0x11b1e96f0>

在这里插入图片描述

3. 根据向量数据库的信息查询

查看OpenAI model
在这里插入图片描述

3.1 添加查询方法

# 从langchain包和其他库中导入必要的模块
from langchain.document_loaders import YoutubeLoader  # 导入YoutubeLoader,用于从YouTube视频加载数据
from langchain.text_splitter import RecursiveCharacterTextSplitter  # 导入用于处理长文档的文本分割器
from langchain.embeddings.openai import OpenAIEmbeddings  # 导入OpenAIEmbeddings,用于生成文档嵌入向量
from langchain.vectorstores import FAISS  # 导入FAISS,用于大数据集中高效的相似性搜索
from langchain.llms import OpenAI  # 导入OpenAI,用于访问语言模型功能
from langchain import PromptTemplate  # 导入PromptTemplate,用于创建结构化的语言模型提示
from langchain.chains import LLMChain  # 导入LLMChain,用于构建使用语言模型的操作链
from dotenv import load_dotenv  # 导入load_dotenv,用于从.env文件加载环境变量

load_dotenv()  # 从.env文件加载环境变量

embedding = OpenAIEmbeddings()  # 初始化OpenAI嵌入向量的实例,用于生成文档嵌入向量

# YouTube视频的URL
video_url = "https://youtu.be/-Osca2Zax4Y?si=iy0iePxzUy_bUayO"

def create_vector_db_from_youtube_url(video_url: str) -> FAISS:
    # 加载YouTube视频字幕
    loader = YoutubeLoader.from_youtube_url(video_url)
    transcript = loader.load()

    # 将字幕分割成较小的片段
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
    docs = text_splitter.split_documents(transcript)

    # 从文档片段创建FAISS数据库
    db = FAISS.from_documents(docs, embedding)
    return db

def get_response_from_query(db, query, k=4):
    # 对给定查询执行数据库的相似性搜索
    docs = db.similarity_search(query, k=k)

    # 连接前几个文档的内容
    docs_page_content = " ".join([d.page_content for d in docs])
    
    # 初始化一个OpenAI语言模型
    llm = OpenAI(model="text-davinci-003")

    # 定义语言模型的提示模板
    prompt = PromptTemplate(
        input_variables=["question", "docs"],
        template = """
        You are a helpful assistant that that can answer questions about youtube videos 
        based on the video's transcript.
        
        Answer the following question: {question}
        By searching the following video transcript: {docs}
        
        Only use the factual information from the transcript to answer the question.
        
        If you feel like you don't have enough information to answer the question, say "I don't know".
        
        Your answers should be verbose and detailed.
    """,
    )

    # 使用定义的提示创建一个语言模型链
    chain = LLMChain(llm=llm, prompt=prompt)

    # 使用查询和连接的文档运行链
    response = chain.run(question=query, docs=docs_page_content)

    # 通过替换换行符来格式化响应
    response = response.replace("\n", " ")
    return response, docs

# 示例用法:从YouTube视频URL创建向量数据库
# print(create_vector_db_from_youtube_url(video_url))

3.2 Streamlit 实现入参视频地址和查询内容

main.py

import streamlit as st  # 导入Streamlit库,用于创建Web应用程序
import langchain_helper as lch  # 导入自定义模块'langchain_helper',用于处理langchain操作
import textwrap  # 导入textwrap模块,用于格式化文本

st.title("YouTube Assistant")  # 设置Streamlit网页应用的标题

# 使用Streamlit的侧边栏功能来创建输入表单
with st.sidebar:
    # 在侧边栏中创建一个表单
    with st.form(key='my_form'):
        # 创建一个文本区域用于输入YouTube视频URL
        youtube_url = st.sidebar.text_area(
            label="What is the YouTube video URL?",
            max_chars=50
        )
        # 创建一个文本区域用于输入关于YouTube视频的查询
        query = st.sidebar.text_area(
            label="Ask me about the video?",
            max_chars=50,
            key="query"
        )
        
        # 创建一个提交表单的按钮
        submit_button = st.form_submit_button(label='Submit')

# 检查是否同时提供了查询和YouTube URL
if query and youtube_url:
    # 从YouTube视频URL创建向量数据库
    db = lch.create_vector_db_from_youtube_url(youtube_url)
    # 根据向量数据库获取查询的响应
    response, docs = lch.get_response_from_query(db, query)
    # 在应用程序中显示一个副标题“回答:”
    st.subheader("Answer:")
    # 显示响应,格式化为每行85个字符
    st.text(textwrap.fill(response, width=85))

运行

$ streamlit run main.py

You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501
  Network URL: http://192.168.50.10:8501

  For better performance, install the Watchdog module:

What is the YouTube video URL?
https://youtu.be/-Osca2Zax4Y?si=iy0iePxzUy_bUayO

Ask me about the video?
What did they tal about Ransomware?

在这里插入图片描述

参考

  • https://github.com/zgpeace/pets-name-langchain/tree/feature/infoRetrievel
  • https://python.langchain.com/docs/integrations/document_loaders/youtube_transcript
  • https://youtu.be/lG7Uxts9SXs?si=H1CISGkoYiKRSF5V
  • https://engineering.fb.com/2017/03/29/data-infrastructure/faiss-a-library-for-efficient-similarity-search/
  • https://platform.openai.com/docs/models/gpt-4-and-gpt-4-turbo

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

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

相关文章

【华为HCIP | 华为数通工程师】刷题日记1116(一个字惨)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

NLP学习:深入NLP

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 之前学过一段时间NLP,因为其中涉及到一些深度学习常用的知识或者框架,但苦于不系统以及没有任务focus不能长久.这里借助微软的教程写点东西. tokenization&&representation 将一句话中的单词分割就是分词(…

【C++入门到精通】新的类功能 | 可变参数模板 C++11 [ C++入门 ]

阅读导航 引言一、新的类功能1. 默认成员函数2. 类成员变量初始化3. 强制生成默认函数的关键字default4. 禁止生成默认函数的关键字delete5. override 和 final&#xff08;1&#xff09;override&#xff08;2&#xff09;final 二、可变参数模板递归函数方式展开参数包逗号表…

nodejs+vue慢性胃炎健康管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于慢性胃炎健康管理系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了慢性胃炎健康管理系统&#xff0c; 系统首页、个…

控制您的音乐、视频等媒体内容

跨多个 Chrome 标签页播放音乐或声音 在计算机上打开 Chrome 。在标签页中播放音乐、视频或其他任何有声内容。您可以停留在该标签页上&#xff0c;也可以转到别处。要控制声音&#xff0c;请在右上角点击“媒体控件”图标 。您可暂停播放、转到下一首歌曲/下一个视频&#xf…

python django 小程序图书借阅源码

开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…

时间序列预测实战(十七)利用Prophet实现电力负荷长期预测(附代码+数据集+详细讲解)

一、本文介绍 Prophet是一个由Facebook开发的开源工具&#xff0c;用于时间序列预测。这个工具特别适合于具有强季节性影响和多个历史数据季节的业务时间序列数据。Prophet的主要思想是将数据分解为如下三个部分&#xff1a;趋势、季节性、节假日和特殊事件。这个模型非常适合…

CICD 持续集成与持续交付——jenkins

部署 软件下载&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/ [rootcicd2 ~]# rpm -ivh jdk-11.0.15_linux-x64_bin.rpm[rootcicd2 ~]# yum install -y fontconfig[rootcicd2 ~]# rpm -ivh jenkins-2.432-1.1.noarch.rpm启动服务 [rootcicd2 ~]# systemctl…

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(二)

文章目录 第三章 识别CAN中的隐藏带宽信道3.1 隐蔽带宽vs.隐藏带宽3.1.1 隐蔽通道3.1.2 隐藏带宽通道 3.2 通道属性3.3 CAN隐藏带宽信道3.3.1 CAN帧ID字段3.3.2 CAN帧数据字段3.3.3 帧错误检测领域3.3.4 时间通道3.3.5 混合通道 3.4 构建信道带宽公式3.5通道矩阵3.6 结论 第四章…

Python 自动化(十八)admin后台管理

admin后台管理 什么是admin后台管理 django提供了比较完善的后台数据库的接口&#xff0c;可供开发过程中调用和测试使用 django会搜集所有已注册的模型类&#xff0c;为这些模型类提供数据管理界面&#xff0c;供开发使用 admin配置步骤 创建后台管理账号 该账号为管理后…

深入理解注意力机制(上)-起源

一、介绍 近几年自然语言处理有很大的进展&#xff0c;从 2018 年 Google 推出的 BERT&#xff0c;到后来的 GPT、ChatGPT 等&#xff0c;这些模型当时能取得这样的成果&#xff0c;除了庞大的数据量及损害资源外&#xff0c;最重要的是的就是背后的Transformer模型&#xff0c…

C语言——操作符详解

前言&#xff1a;这篇文章主要讲解一下C语言中常见的操作符的使用&#xff0c;做一下整理&#xff0c;便于日后回顾&#xff0c;同时也希望能帮助到大家。 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4dd;CSDN主页 愚润求学 &#x1f304;每日鸡汤&#xff1a;念…

黑马程序员 计算机网络(笔记)

参考文章&#xff1a;【黑马程序员】计算机网络概述~ 程序员必须掌握的入门基础知识&#xff01; 参考文章&#xff1a;黑马程序员Linux运维工作场景解决方案零基础到就业 参考文章&#xff1a;网络安全运维进阶教程&#xff0c;运维工程师深度学习教程 文章目录 linux入门到…

2023.11.17使用flask将多个图片文件上传至服务器

2023.11.17使用flask将多个图片文件上传至服务器 实现功能&#xff1a; 1、同时上传多个图片文件 2、验证文件扩展名 3、显示上传文件的文件名 4、显示文件上传结果 程序结构 main.py from flask import Flask, request, jsonify, render_template import osapp Flask(__n…

Android 10.0 系统修改usb连接电脑mtp和PTP的显示名称

1.前言 在10.0的产品定制化开发中,在usb模块otg连接电脑,调整为mtp文件传输模式的时候,这时可以在电脑看到手机的内部存储 显示在电脑的盘符中,会有一个mtp名称做盘符,所以为了统一这个名称,就需要修改这个名称,接下来分析下处理的 方法来解决这个问题 2.系统修改usb连…

[AutoSar]工程中的cpuload陷阱(三)测试

目录 关键词平台说明背景一、 测试结果对比1.1 不带cache1.2 带cache 二、小结 关键词 嵌入式、C语言、autosar 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0c;C编译器HighTec (GCC) 背景 接着工程中的cpuload陷阱&#xff08;二)中的描述…

装饰模式 rust和java的实现

装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。 装饰器模式通过将对象包装在装饰器类中&#xff0c;以便动态地修改其行为。 这种模式创建了一个装饰类&#xff0c;用来包装原有的类&am…

(数据库管理系统)DBMS与(数据库系统)DBS的区别

数据库管理系统&#xff08;DBMS&#xff0c;Database Management System&#xff09;和数据库系统&#xff08;DBS&#xff0c;Database System&#xff09;是两个相关但不同的概念。 DBS是一个更广泛的概念&#xff0c;指的是计算机系统引入数据库后的系统&#xff0c;包括数…

翻译软件Mate Translate mac中文版介绍说明

Mate Translate mac可以帮你翻译超过100种语言的单词和短语&#xff0c;使用文本到语音转换&#xff0c;并浏览历史上已经完成的翻译。你还可以使用Control S在弹出窗口中快速交换语言。 Mate Translate Mac版软件介绍 Mate Translate 可以在你的所有设备之间轻松同步&#x…

微机原理练习题_13

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。&#xff09; 1、十六进制数5BF.C8转换成二进制数是(&#xff09; A. 11011100111111101B B. 010111011011.01101B C. 010110111111.11001B D. 010111011011.11001B 2,最适合…