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

news/2024/12/22 0:16:54/

接着前面的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-apipip install faiss-cpupip 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 dbdef 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视频URLyoutube_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.pyYou can now view your Streamlit app in your browser.Local URL: http://localhost:8501Network URL: http://192.168.50.10:8501For 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

http://www.ppmy.cn/news/1230264.html

相关文章

OpenVPN Connect使用连接公网VPN服务器实现内网穿透

安装并运行OpenVPN Connect 点击AGREE 添加配置.OVPN文件 点击连接 连接成功 两个内网主机通过公网VPN穿透

Python-----PyInstaller的简单使用

PyInstaller简介 PyInstaller是一个Python库&#xff0c;可以将Python应用程序转换为独立的可执行文件。PyInstaller支持跨平台&#xff0c;可以在Windows、Linux和MacOS上生成可执行文件。 PyInstaller会分析Python程序&#xff0c;并将程序打包成一个完整的可执行文件&…

[ruby on rails]rack-cors, rack-attack

gem rack-attack gem rack-cors1. rack-attack 可以根据ip、域名等设置黑名单、设置访问频率 设置黑名单 # 新增 config/initializers/rack_attack.rb # 请求referer如果匹配不上设置的allowed_origins&#xff0c;返回403 forbidden Rack::Attack.blocklist(block bad domai…

力扣:172. 阶乘后的零(Python3)

题目&#xff1a; 给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长…

FFmpeg常用命令行讲解及实战一

文章目录 前言一、学习资料参考二、FFmpeg 选项1、主要选项①、主要命令选项②、举例 2、视频选项①、主要命令选项②、举例1&#xff09;提取固定帧2&#xff09;禁止输出视频3&#xff09;指定视频的纵横比 3、音频选项①、主要命令选项②、举例 4、字幕选项①、主要命令选项…

猫12分类:使用多线程爬取图片的Python程序

本文目标 对于猫12目标检测部分的数据集&#xff0c;采用网络爬虫来制作数据集。 在网络爬虫中&#xff0c;经常需要下载大量的图片。为了提高下载效率&#xff0c;可以使用多线程来并发地下载图片。本文将介绍如何使用Python编写一个多线程爬虫程序&#xff0c;用于爬取图片…

01背包 P1507 NASA的食物计划

P1507 NASA的食物计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 普通01背包状态表示&#xff1a;f(i, j)表示前i件物品放入一个容量为j的背包可以获得的最大价值。 本题类似&#xff0c;f(i, j, k)表示前i件物品放入一个限制为j&#xff0c;且另一个限制为k的背包中可以…

原理Redis-Dict字典

Dict 1) Dict组成2) Dict的扩容3) Dict的收缩4) Dict的rehash5) 总结 1) Dict组成 Redis是一个键值型&#xff08;Key-Value Pair&#xff09;的数据库&#xff0c;可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成&#xff0c;分别…