PDF对话RAG应用开发实战

news2024/11/20 23:27:02

与大型 PDF 对话很酷。你可以与笔记、书籍和文档等聊天。这篇博文将帮助你构建一个基于 Multi RAG Streamlit 的 Web 应用程序,以通过对话式 AI 聊天机器人读取、处理和与 PDF 数据交互。以下是此应用程序工作原理的分步分解,使用简单的语言易于理解。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、使用必要的工具设置舞台

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

  • 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_agent

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

2、读取和处理 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 text

def get_chunks(text):
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    chunks = text_splitter.split_text(text)
    return chunks

2、创建可搜索的文本数据库并进行嵌入

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

矢量存储:应用程序使用 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")

3、设置对话式 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, api_key="")
    prompt = ChatPromptTemplate.from_messages([...])
    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)

4、用户交互

后端准备就绪后,应用程序使用 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")

5、流程图与完整代码

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_agent

import 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 text



def get_chunks(text):
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    chunks = text_splitter.split_text(text)
    return chunks


def 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):
    #os.environ["ANTHROPIC_API_KEY"]=os.getenv["ANTHROPIC_API_KEY"]
    #llm = ChatAnthropic(model="claude-3-sonnet-20240229", temperature=0, api_key=os.getenv("ANTHROPIC_API_KEY"),verbose=True)
    llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0, api_key="")
    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)





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

输出:


原文链接:PDF RAG应用开发实战 - BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运用电磁铁需求注意哪些问题

电磁铁是比较常用的磁场设备,在与磁性研究相关的实验室里,我们能经常看到,那磁场设备在使用的时候,包括各类电磁铁、亥姆霍兹线圈、螺线管等,有什么需要注意的事项呢? 电磁铁设备主要包括电磁铁以及配套电…

大跳水!华为三折叠手机黄牛价暴跌,市场需求显真相

华为首款三折叠手机Mate XT上市初期受到黄牛热炒,但由于实际需求不足和定价过高,市场溢价迅速下跌,反映出折叠屏手机市场仍需培养消费者接受度。 转载:科技新知 原创 作者丨依蔓 编辑丨蕨影 惊了!华为首款三折叠手机M…

Electron 主进程与渲染进程、预加载preload.js

在 Electron 中,主要控制两类进程: 主进程 、 渲染进程 。 Electron 应⽤的结构如下图: 如果需要更深入的了解electron进程,可以访问官网 流程模型 文档。 主进程 每个 Electron 应用都有一个单一的主进程,作为应用…

如何通过VSM识别生产过程中的信息流浪费?

VSM(价值流图),作为精益生产的核心工具之一,它不仅仅是一张简单的流程图,更是企业优化生产流程、提升价值传递效率的指南针。通过VSM,我们可以清晰地看到从原材料到成品交付的全过程,包括物料流…

kafka集群跨双网段及多网段通信问题解决(避免踩坑)

一、问题场景: 实际生产环境总存在很多kafka集群跨网段的问题。kafka集群可能存在多个网卡,对应多个网段。不同网段之间需要同时与集群通信,即跨网段生产消费问题。 单机 # broker 的唯一标识符,在 Kafka 集群中必须唯一 broker.…

uniapp修改uni-ui组件样式(对微信小程序/H5有效,vue3)

寻找要修改的样式 使用开发者工具找到具体要修改的class类名 修改 <style lang"scss">//.nav为上一级的class.nav::v-deep .uni-navbar--border {border-bottom-style: none !important;} </style>完整代码 <template><view><uni-na…

基于SpringBoot+Vue的在线考试管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

24年Novartis诺华制药社招入职SHL测评:综合能力、性格问卷、动机问卷高分攻略

尊敬的求职者&#xff0c;若您渴望在医药行业的领军企业——诺华制药——开启您的职业生涯&#xff0c;深入了解其社招与校招测评流程至关重要。以下是对诺华SHL测评题型的全面解读&#xff0c;助您在招聘季脱颖而出。 测评构成 诺华的招聘测评由以下三个部分组成&#xff1a…

Arthas trace (方法内部调用路径,并输出方法路径上的每个节点上耗时)

文章目录 二、命令列表2.3 monitor/watch/trace/stack/tt 相关2.3.3 trace &#xff08;方法内部调用路径&#xff0c;并输出方法路径上的每个节点上耗时&#xff09;举例1&#xff1a;查看方法整体耗时举例2&#xff1a;trace次数限制 本人其他相关文章链接 二、命令列表 2.3…

【项目总结】工程构建思路分析与分享

背景 写这篇文章的初衷是因为国产化项目临近结束&#xff0c;在做项目总结时&#xff0c;回想起了代码管理的相关问题。虽然工程搭建及管理是一个高级工程师必备的能力&#xff0c;但似乎每次一个新项目立项&#xff0c;都是从老的项目中拷贝工程框架&#xff0c;再进行定制修…

【C++】C++17中可以存储任意类型数据的对象——any类的使用与设计思想

目录 引言 any类的使用 构造 号运算符重载 std::any::swap std::any::has_value std::any::type std::any::reset std::any_cast any类的设计思想 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 C专栏&#xff1a;C_东洛的克莱斯韦克的博客-CSDN博客 引言 一提到存…

按键 tab 则 切换输入框, 按键 ↑↓ 则 加减数值

1) 页面内输入框,按键 tab 则 切换输入框, 按键 ↑↓ 则 加减数值 2) 思路 1、按键 tab切换input框&#xff0c;默认tab切换会聚焦到浏览器地址栏&#xff08;F12时会聚焦到开发者工具选项&#xff09;&#xff0c;我们需要阻止该默认事件。 2、进入页面就聚焦到第一个输入框…

【JAVA基础】lombok的@Data会生成什么?和无参构造器有关系吗

问题&#xff1a; 前提&#xff1a;实体中有三个属性&#xff1b;问题一、lombok在实体上如果只加Data会生成哪些构造器。问题二 编译器默认生成无参构造器&#xff0c;如果自己写了有一个参数的构造器&#xff0c;还会生成默认的无参构造器吗 &#xff1f; 问题一解答 当在Jav…

免费送源码:Java+B/S+ssm+MySQL 公众养老服务网上预订系统 计算机毕业设计原创定制

摘 要 本论文主要论述了如何使用JAVA语言开发一个公众养老服务网上预订系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;SSM框架进行开发。在引言中&#xff0c;作者将论述公众养老服务网上预订系统的当前背景以及系统开发…

本地生活服务项目有哪些:如何利用本地生活市场,打开线下流量!

随着各大互联网公司在本地生活服务板块的布局力度持续加大&#xff0c;越来越多的人都开始意识到了它背后所蕴含着的发展前景和收益潜力&#xff0c;进而纷纷打听起了与之相关的消息。而就小编与多位创业者的交流情况而言&#xff0c;在众多问题中&#xff0c;属本地生活服务项…

巨控协议转换网关GRM321GRM322GRM323应用场景

巨控工业协议网关GRM321,GRM322,GRM323是网口型网关&#xff0c;支持各种PLC的TCP协议&#xff0c;具备多路RS485,RS232和三个TCP网口。能实现RS485&#xff0c;RS232和TCP的工业协议的零代码无缝转换&#xff0c;能极大节约工程师编程时间&#xff0c;保障数据采集的可靠性。 …

遥感图像分割

遥感图像分割是一种应用于遥感图像的计算机视觉技术&#xff0c;用于将图像划分为不同的区域&#xff0c;每个区域代表地表的不同特征&#xff0c;如水体、森林、城市区域等。这种分割帮助我们更好地理解和分析地球表面的变化&#xff0c;对于环境监测、城市规划、农业、灾害管…

阿里云ACP云计算高级工程师知识点,超详细,看完就够了!

本文以访问控制章节知识点为例&#xff0c;不说废话直接上干货&#xff01; 考法1&#xff1a;VPC访问控制方式对比 1.VPC可以通过安全组、防火墙、RDS白名单、SLB白名单等方式进行访问控制。 2.专有网络内的ECS使用安全组防火墙进行三层网络访问控制&#xff0c;ACL进行二层…

基于STM32的无人驾驶汽车路径规划与视觉识别系统

目录 引言项目背景环境准备 硬件准备软件安装与配置系统设计 系统架构关键技术代码示例 摄像头图像采集与处理路径规划算法实现实时视觉障碍物检测电机控制与执行应用场景结论 1. 引言 无人驾驶技术是当前自动化和人工智能领域的热门课题之一&#xff0c;涉及到复杂的感知、…

Python数据分析和可视化详解

Python数据分析和可视化详解 Python 是当前最受欢迎的数据分析和可视化工具之一。凭借其简单的语法和强大的第三方库&#xff0c;Python 为数据科学家、分析师和工程师提供了广泛的工具&#xff0c;用于处理、分析和展示数据。本文将介绍如何使用 Python 进行数据分析与可视化…