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-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.rhkb.cn/news/200394.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python武器库开发-flask篇之error404(二十七)

flask篇之error404(二十七) 首先&#xff0c;我们先进入模板的界面创建一个404的html页面 cd templates vim 404.html404.html的内容如下&#xff1a; <h1>error!!!</h1>在 Flask 应用程序中&#xff0c;当用户访问一个不存在的页面的时候&#xff0c;会出现 4…

C进阶---动态内存管理

目录 一、为什么存在动态内存分配 1.1静动态内存分配区别&#xff1a; 1.2静态分配的优缺点 1.3动态分配优缺点 二、动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 三、常见的动态内存错误 3.1对NULL指针的解引用操作 3.2 对动态开辟空间的越界…

Java实现拼图小游戏

1、了解拼图游戏基本功能&#xff1a; 拼图游戏内容由若干小图像块组成的&#xff0c;通过鼠标点击图像块上下左右移动&#xff0c;完成图像的拼凑。 2、拼图游戏交互界面设计与开发&#xff1a; 通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 &#xff…

14. UART串口通信

14. UART串口通信 1. UART1.1 UART 通信格式1.2 UART 电平标准1.3 I.MX6U UART 简介1.3.1 控制寄存器1 UARTx_UCR1(x1~8)1.3.2 控制寄存器2 UARTx_UCR21.3.3 控制寄存器3 UARTx_UCR31.3.4 状态寄存器2 UARTx_USR21.3.4 UARTx_UFCR 、 UARTx_UBIR 和 UARTx_UBMR1.3.5 UARTx_URXD…

P2 C++变量

前言 一 C变量的作用 本期我们来讨论一下c 中的变量。 在一个 C 程序中&#xff0c;大部分内容实际上都是在使用数据。我们操作任何类型的数据&#xff0c;如包括我们想要改变、想要修改&#xff0c; 想要读和写数据。我们都需要把数据存储进叫做变量的东西里面。变量允许我们…

Activiti,Apache camel,Netflex conductor对比,业务选型

Activiti,Apache camel,Netflex conductor对比&#xff0c;业务选型 1.activiti是审批流&#xff0c;主要应用于人->系统交互&#xff0c;典型应用场景&#xff1a;请假&#xff0c;离职等审批 详情可见【精选】activti实际使用_activiti通过事件监听器实现的优势_记录点滴…

【开发流程】持续集成、持续交付、持续部署

一、开发工作流程 假设把开发流程分为以下几个阶段&#xff1a; 编码 -> 构建 -> 集成 -> 测试 -> 交付 -> 部署 如上图所示&#xff0c;持续集成、持续交付、持续部署有着不同的软件自动交付周期。 二、持续集成、持续交付、持续部署 1、持续集成 持续集成…

mysql 查询

-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 &#xff0c; 及所属的部门名称 &#xff08;隐式内连接实现&#xff09;select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.idtb_emp.id;-- 推荐使用select a.name,b.n…

SSL加密

小王学习录 今日摘录前言HTTP + SSL = HTTPSSSL加密1. 对称加密2. 非对称加密 + 对称加密3. 证书今日摘录 但愿四海无尘沙,有人卖酒仍卖花。 前言 SSL表示安全套接层,是一个用于保护计算机网络中数据传输安全的协议。SSL通过加密来防止第三方恶意截取并篡改数据。在实际应用…

GaussDB新特性Ustore存储引擎介绍

1、 Ustore和Astore存储引擎介绍 Ustore存储引擎&#xff0c;又名In-place Update存储引擎&#xff08;原地更新&#xff09;&#xff0c;是openGauss 内核新增的一种存储模式。此前的版本使用的行存储引擎是Append Update&#xff08;追加更新&#xff09;模式。相比于Append…

泉盛UV-K5/K6全功能中文固件

https://github.com/wu58430/uv-k5-firmware-chinese/releases 主要功能&#xff1a; 中文菜单 许多来自 OneOfEleven 的模块&#xff1a; AM 修复&#xff0c;显著提高接收质量长按按钮执行 F 操作的功能复制快速扫描菜单中的频道名称编辑频道名称 频率显示选项扫描列表分配…

Java入门篇 之 内部类

本篇碎碎念&#xff1a;本篇没有碎碎念&#xff0c;想分享一段话&#xff1a; 你不笨&#xff0c;你只是需要时间&#xff0c;耐心就是智慧&#xff0c;不见得快就好&#xff0c;如果方向都不对&#xff0c;如果心术不正&#xff0c;如果德不配位&#xff0c;快就是对自己天分的…

easyExcel注解详情

前言11个注解字段注解 类注解基础综合示例补充颜色总结 11个注解 ExcelProperty ColumnWith 列宽 ContentFontStyle 文本字体样式 ContentLoopMerge 文本合并 ContentRowHeight 文本行高度 ContentStyle 文本样式 HeadFontStyle 标题字体样式 HeadRowHeight 标题高度 HeadStyle…

8Base集团通过SmokeLoader部署新的Phobos勒索软件变种

最近&#xff0c;8Base集团的威胁行为者通过Phobos勒索软件的变种展开了一系列金融动机的攻击。这一发现来自于思科Talos的研究结果&#xff0c;他们记录了网络犯罪分子活动的增加。 安全研究员Guilherme Venere在周五发表的详尽的两部分分析中表示&#xff1a;“该组织的大多…

excel导入 Easy Excel

依旧是框架感觉有东西&#xff0c;但是确实是模拟不出来&#xff0c;各种零零散散的件太多了 controller层 ApiOperation(value "导入Excel", notes "导入Excel", httpMethod "POST", response ExcelResponseDTO.class)ApiImplicitParams({…

如何有效的禁止Google Chrome自动更新?

禁止Chrome自动更新 1、背景2、操作步骤 1、背景 众所周知&#xff0c;当我们在使用Selenium进行Web自动化操作&#xff08;如爬虫&#xff09;时&#xff0c;一般会用到ChromeDriver。然而Driver的更新速度明显跟不上Chrome的自动更新。导致我们在使用Selenium进行一些操作时就…

华为ac+fit无线2层漫游配置案例

ap的管理dhcp在ac上&#xff0c;业务dhcp在汇聚交换机上、并且带2层漫游 R1: interface GigabitEthernet0/0/0 ip address 11.1.1.1 255.255.255.0 ip route-static 12.2.2.0 255.255.255.0 11.1.1.2 ip route-static 192.168.0.0 255.255.0.0 11.1.1.2 lsw1: vlan batch 100…

鸿蒙系统扫盲(二):再谈鸿蒙是不是安卓套壳?

最近小米发布了澎湃OS&#xff0c;vivo发布了蓝OS&#xff0c;好像自从华为回归后&#xff0c;大伙都开始写自己的OS了&#xff0c;小米官方承认是套壳安卓&#xff0c;然后被大家喷了&#xff0c;于是鸿蒙是不是安卓套壳的话题又回到了大众的视野&#xff0c;今天在讨论下这个…

React函数组件状态Hook—useState《进阶-对象数组》

React函数组件状态-state 对象 state state 中可以保存任意类型的 JavaScript 值&#xff0c;包括对象。但是&#xff0c;你不应该直接修改存放在 React state 中的对象。相反&#xff0c;当你想要更新⼀个对象时&#xff0c;你需要创建⼀个新的对象&#xff08;或者将其拷⻉⼀…

VS+Qt+C++ Yolov8物体识别窗体程序onnx模型

程序示例精选 VSQtC Yolov8物体识别窗体程序onnx模型 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSQtC Yolov8物体识别窗体程序onnx模型》编写代码&#xff0c;代码整洁&#xff0c;规…