大模型技术 | 基于 Langchain 和 Streamlit,构建多 PDF RAG 聊天机器人

与 PDF 互动是很酷的。你可以与你的笔记、书籍和文档等进行聊天。

本文将帮助你构建一个基于 Multi RAG Streamlit 的 Web 应用程序,通过对话 AI 聊天机器人来读取、处理和互动PDF数据。

在这里插入图片描述

以下是该应用程序的工作步骤,用简单的语言进行说明。

RAG%20%E8%81%8A%E5%A4%A9%E6%9C%BA%E5%99%A8%E4%BA%BA&spm=1018.2226.3001.4187">配置必要的工具

该应用程序首先导入了各种强大的库:

  • Streamlit:用于创建Web界面。
  • PyPDF2:用于读取PDF文件的工具。
  • Langchain:用于自然语言处理和创建对话AI的一套工具。
  • FAISS:用于高效相似性搜索的向量库,在大数据集中快速查找信息非常有用。
import streamlit as st
from PyPDF2 import PdfReader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.embeddings.spacy_embeddings import SpacyEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.tools.retriever import create_retriever_tool
from dotenv import load_dotenv
from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.agents import AgentExecutor, create_tool_calling_agentimport os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

RAG%20%E8%81%8A%E5%A4%A9%E6%9C%BA%E5%99%A8%E4%BA%BA&spm=1018.2226.3001.4187">读取和处理PDF文件

应用程序的第一个主要功能是读取PDF文件:

  • PDF阅读器:当用户上传一个或多个PDF文件时,应用程序读取这些文档的每一页并提取文本,将其合并为一个连续的字符串。

一旦提取文本,它将被分割成可管理的块:

  • 文本分割器:使用Langchain库,将文本分割成每块1000个字符。这种分割有助于更高效地处理和分析文本。
def pdf_read(pdf_doc):text = ""for pdf in pdf_doc:pdf_reader = PdfReader(pdf)for page in pdf_reader.pages:text += page.extract_text()return textdef get_chunks(text):text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)chunks = text_splitter.split_text(text)return chunks

RAG%20%E8%81%8A%E5%A4%A9%E6%9C%BA%E5%99%A8%E4%BA%BA&spm=1018.2226.3001.4187">创建可搜索的文本数据库和生成嵌入

为了使文本可搜索,应用程序将文本块转换为向量表示:

  • 向量存储:应用程序使用FAISS库将文本块转换为向量,并将这些向量本地保存。这一转换至关重要,因为它允许系统在文本中执行快速高效的搜索。
embeddings = SpacyEmbeddings(model_name="en_core_web_sm")def vector_store(text_chunks):vector_store = FAISS.from_texts(text_chunks, embedding=embeddings)vector_store.save_local("faiss_db")

RAG%20%E8%81%8A%E5%A4%A9%E6%9C%BA%E5%99%A8%E4%BA%BA&spm=1018.2226.3001.4187">设置对话AI

该应用程序的核心是对话AI,它使用OpenAI的强大模型:

  • AI配置:应用程序使用OpenAI的GPT模型设置对话AI。这个AI设计用于回答基于已处理的PDF内容的问题。
  • 对话链:AI使用一组提示来理解上下文并为用户查询提供准确的响应。如果文本中没有问题的答案,AI会回复“答案不在上下文中”,确保用户不会收到错误信息。
def get_conversational_chain(tools, ques):llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)prompt = ChatPromptTemplate.from_messages([("system", "You are a helpful assistant. Answer the question as detailed as possible from the provided context, make sure to provide all the details, if the answer is not in provided context just say, 'answer is not available in the context', don't provide the wrong answer"),("placeholder", "{chat_history}"),("human", "{input}"),("placeholder", "{agent_scratchpad}"),])tool = [tools]agent = create_tool_calling_agent(llm, tool, prompt)agent_executor = AgentExecutor(agent=agent, tools=tool, verbose=True)response = agent_executor.invoke({"input": ques})print(response)st.write("Reply: ", response['output'])def user_input(user_question):new_db = FAISS.load_local("faiss_db", embeddings, allow_dangerous_deserialization=True)retriever = new_db.as_retriever()retrieval_chain = create_retriever_tool(retriever, "pdf_extractor", "This tool is to give answer to queries from the pdf")get_conversational_chain(retrieval_chain, user_question)

RAG%20%E8%81%8A%E5%A4%A9%E6%9C%BA%E5%99%A8%E4%BA%BA&spm=1018.2226.3001.4187">用户互动

在后端准备就绪后,应用程序使用Streamlit创建一个用户友好的界面:

  • 用户界面:用户看到一个简单的文本输入框,他们可以在其中输入与PDF内容相关的问题。应用程序会直接在网页上显示AI的响应。
  • 文件上传和处理:用户可以随时上传新的PDF文件。应用程序会即时处理这些文件,更新AI搜索的新文本数据库。
def main():st.set_page_config("Chat PDF")st.header("RAG based Chat with PDF")user_question = st.text_input("Ask a Question from the PDF Files")if user_question:user_input(user_question)with st.sidebar:pdf_doc = st.file_uploader("Upload your PDF Files and Click on the Submit & Process Button", accept_multiple_files=True)if st.button("Submit & Process"):with st.spinner("Processing..."):raw_text = pdf_read(pdf_doc)text_chunks = get_chunks(raw_text)vector_store(text_chunks)st.success("Done")

RAG%20%E8%81%8A%E5%A4%A9%E6%9C%BA%E5%99%A8%E4%BA%BA&spm=1018.2226.3001.4187">结论

完整代码

import streamlit as st
from PyPDF2 import PdfReader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.embeddings.spacy_embeddings import SpacyEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.tools.retriever import create_retriever_tool
from dotenv import load_dotenv
from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain.agents import AgentExecutor, create_tool_calling_agentimport os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"embeddings = SpacyEmbeddings(model_name="en_core_web_sm")
def pdf_read(pdf_doc):text = ""for pdf in pdf_doc:pdf_reader = PdfReader(pdf)for page in pdf_reader.pages:text += page.extract_text()return textdef get_chunks(text):text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)chunks = text_splitter.split_text(text)return chunksdef vector_store(text_chunks):vector_store = FAISS.from_texts(text_chunks, embedding=embeddings)vector_store.save_local("faiss_db")def get_conversational_chain(tools,ques):llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0, apikey)prompt = ChatPromptTemplate.from_messages([("system","""You are a helpful assistant. Answer the question as detailed as possible from the provided context, make sure to provide all the details, if the answer is not inprovided context just say, "answer is not available in the context", don't provide the wrong answer""",),("placeholder", "{chat_history}"),("human", "{input}"),("placeholder", "{agent_scratchpad}"),]
)tool=[tools]agent = create_tool_calling_agent(llm, tool, prompt)agent_executor = AgentExecutor(agent=agent, tools=tool, verbose=True)response=agent_executor.invoke({"input": ques})print(response)st.write("Reply: ", response['output'])def user_input(user_question):new_db = FAISS.load_local("faiss_db", embeddings,allow_dangerous_deserialization=True)retriever=new_db.as_retriever()retrieval_chain= create_retriever_tool(retriever,"pdf_extractor","This tool is to give answer to queries from the pdf")get_conversational_chain(retrieval_chain,user_question)def main():st.set_page_config("Chat PDF")st.header("RAG based Chat with PDF")user_question = st.text_input("Ask a Question from the PDF Files")if user_question:user_input(user_question)with st.sidebar:st.title("Menu:")pdf_doc = st.file_uploader("Upload your PDF Files and Click on the Submit & Process Button", accept_multiple_files=True)if st.button("Submit & Process"):with st.spinner("Processing..."):raw_text = pdf_read(pdf_doc)text_chunks = get_chunks(raw_text)vector_store(text_chunks)st.success("Done")if __name__ == "__main__":main()

通过将应用程序保存为 app.py,然后使用

streamlit run app.py

在这里插入图片描述

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

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

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

img

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

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

img

三、AI大模型经典PDF籍

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

img

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

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。


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

相关文章

JDK原理

当我们谈论JDK(Java Development Kit)的原理时,实际上是在探讨Java语言及其开发环境背后的技术和设计思想。JDK是Java编程语言的核心工具包,它包含了Java运行环境(JRE)、Java编译器(javac&#…

2 html5 浏览器已经支持的新API

HTML5规范下很多API浏览器都已经支持,这里我们列举几个很常用的浏览器支持的API: 1 tab页之间通信: BroadcastChannel(channelName); 可用于多个不同浏览器tab页之间通信。实例化的时候Channel名称必须相同。 const broadcastChannel new BroadcastChannel(myC…

39次8.29(了解docker-compose,docker-compose编排容器,配置harbor服务)

1.使用使用docker-compose编排容器 1.YAML ⽂件的格式和语法 1)YAML ⽂件格式 yaml 是⼀种标记语⾔很直观的数据序列化格式,可读性很⾼。 类似于 xml 描述性语⾔,语法⽐xml简单的很多。 yaml 数据结构通过缩进进⾏表示,连续的…

金九银十来了,你准备好了吗?——迎接技术行业的旺季

每年的九月和十月,对于技术行业来说,是一个特别的时期。这个时期被业界称为“金九银十”,意味着招聘和项目开发的高峰期。对于技术人员而言,这不仅是一个职业发展的黄金时期,也是技术能力提升和职业规划的关键时刻。那…

RAG中pdf解析的方法全览

RAG中解析PDF的方法 一 pdf格式都有哪些 1.机器生成的pdf文件,包含图像,文本,可以被编辑 2.传统扫描文档,表现为图像,不能被编辑 3.带OCR的扫描文档。可能转OCR的过程中带入了错误。 二 pdf解析全科指南 全面指南…

设计模式 8 组合模式

设计模式 8 创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff0…

golang 于 goland 无法运行

命令行 go build -o main.go 等等 报出 # command-line-arguments runtime.main_mainf: function main is undeclared in the main package 直接goland运行 爆出 command-line-arguements 等等 goland中直接删除配置( Edit Configurations ),或者把运行模式从 Fil…

redis主从+高可用切换+负载均衡

1. redis主从配置 # 在master中 cp sentinel.conf /etc/redis/ vim /etc/redis/sentinel.conf scp /etc/redis/sentinel.conf server2:/etc/redis/ scp /etc/redis/sentinel.conf server3:/etc/redis/ redis-sentinel /etc/redis/sentinel.conf # 启动监控# 在slave中 redis-s…

第十三节:学习Springboot整合mybatis——完整篇(自学Spring boot 3.x的第三天)

大家好,今天记录下学习springboot的第三天。​网创有方 这节详细记录了如何使用springboot整合mybatis方法,并成功实现将请求信息插入本地的mysql数据库。 由于只是为了方便本地验证,实际项目是需要部署到服务器上去的,所以就采用…

“NoSQL数据库技术及其应用”写作框架,软考高级,系统架构设计师

论文真题 随着互联网web2.0网站的兴起,传统关系数据库在应对web2.0 网站,特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展…

汽车免拆诊断案例 | 2012 款大众速腾车发动机偶尔抖动

故障现象 一辆2012款大众速腾车,搭载CST发动机和干式双离合变速器,累计行驶里程约为17万km。车主反映,发动机偶尔抖动。 故障诊断 接车后试车,确认发动机怠速偶尔抖动,且在D挡起步时抖动明显。用故障检测仪检测&…

仿论坛项目--开发社区首页

• 开发流程 1次请求的执行过程 • 分步实现开发社区首页,显示前10个帖子开发分页组件,分页显示所有的帖子 项目调试技巧 • 响应状态码的含义 • 服务端断点调试技巧 • 客户端断点调试技巧 • 设置日志级别,并将日志输出到不同的终端 h…

刷题记录(2)

1. HWOD机试 - 模拟消息队列(100) package com.yue.test;import org.junit.Test;import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List;/*** Author: 夜雨* Date: 2021-12-08-10:31* Description:* Version 1.0*/ public…

SAPUI5基础知识25 - 聚合绑定(Aggregation Binding)

1. 背景 Aggregation Binding 是 SAPUI5 中的一种数据绑定方式,用于将数据模型中的集合(如数组)绑定到 UI 控件的聚合(如列表项、表格行等)。 常见的场景包括将一个数组绑定到 sap.m.List 的 items 聚合,…

如何定义核心场景用例?

​首先我们解决两个问题: 1.什么是场景测试? 2.什么是核心场景? 1、什么是场景测试? 🎯 1.1:什么是场景 事件触发时的情景形成了场景。场景必不可少的几个要素:环境、人、时间、行为。简而…

JavaWeb——介绍(什么是Web、Web网站的开发模式)、初始Web前端(Web标准、学习内容)

目录 介绍 什么是Web Web网站的开发模式 初识Web前端 Web标准 学习内容 介绍 JavaWeb学习路线 (仅用作参考) 什么是Web Web:全球广域网,也称为万维网(www World Wide Web),能够通过浏览器访问的…

揭秘面试官常见问题 —— JavaScript 闭包

1. 什么是闭包? 闭包是 JavaScript 中的一种特性,它允许一个函数在定义的环境之外仍然能够访问和操作定义时的作用域中的变量。换句话说,闭包是指函数可以“记住”并访问它被创建时所处的词法作用域。 简单来说: - 当一个函数被…

[Meachines] [Medium] SecNotes XSRF跨站请求伪造+SMB-Webshell上传+Linux子系统命令历史记录泄露权限提升

信息收集 IP AddressOpening Ports10.10.10.97TCP:80,445,8808 $ nmap -p- 10.10.10.97 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 | http-title: Secure Notes - Login |…

SpringBoot中基于MongoDB的findAndModify原子操作实现分布式锁原理详解

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

网络是怎样连接的

网络是怎样连接的 HTTPDNS数据通信协议栈——TCP/IPRJ-45接口信号衰减噪声干扰双绞线MDI接口集线器交换机路由器接入网ADSL接入网FTTH接入网用户认证和配置下发DHCPPOPWeb服务器的部署地点防火墙 HTTP HTTP发展史&#xff1a; 1991 – HTTP/0.91996 – HTTP/1.01997 – HTTP/…