使用 RAG、Langchain 和 Streamlit 制作用于文档问答的 AI 聊天机器人

news2024/11/17 14:39:41

在这篇文章中,我们将探索创建一个简单但有效的聊天机器人,该机器人根据上传的 PDF 或文本文件的内容响应查询。该聊天机器人使用 Langchain、FAISS 和 OpenAI 的 GPT-4 构建,将为文档查询提供友好的界面,同时保持对话上下文完整。

APP链接地址:Streamlit

潜在用例

在深入研究实际代码之前,让我们花点时间回顾一下该工具的潜在用例以及如何使用它来进一步增强您的研究、信息检索或摘要工作流程:

1.内容概括

  • 三句摘要:用三个简洁的句子总结 PDF 的每个部分,以捕捉核心思想。
  • 要点摘要:总结每个部分的关键要点,以概述所涵盖的主要主题。
  • QA 摘要:将每个部分的要点转化为问答形式,以对话的方式简化对内容的理解。
  • 表格摘要:将要点组织到 Markdown 表格中,其中包含章节名称、主要发现和含义的列。

2. 信息提取

  • 关键句子提取:从每个部分中识别并提取总结要点的关键句子。
  • 关键词提取:识别并列出经常出现的关键词和关键短语,以快照主题
  • 联系方式收集:从 PDF 中提取重要片段,例如联系信息。
  • 页面定位器:指向 PDF 中感兴趣的特定主题所在的确切页面。
  • 多文档查询:跨多个文档查询以提取比较见解或聚合信息。
  • 情绪分析:了解文档或文档特定部分所传达的情绪或语气。

这些工具是可扩展的,可以改进附加功能,例如内容增强、可视化,甚至用于自动化文档处理的工作流集成。通过利用这一工具,人们可以提高文档交互、分析和信息检索过程的效率和深度。

然而,为了增强该工具用于特定用例或更高质量的交付,需要以即时工程、使用更强大的向量数据库和嵌入模型的形式进行进一步细化。人们还可以考虑对模型进行微调以获得更高质量的结果。

您可以在我的 GitHub Repo 中找到使用的完整代码:

AI-DocumentQnA,使用 Langchain 和…构建的简单的支持 LLM 的文档问答应用程序,下载AI-DocumentQnA的源码_GitHub_帮酷icon-default.png?t=N7T8https://github.com/yakshb/AI-DocumentQnA.git?source=post_page-----83f00c1f6b4b--------------------------------

设置和依赖项:

首先,请确保您已安装以下库。如果没有,请使用 pip 安装它们:

pip install streamlit PyPDF2 langchain openai sentence-transformers faiss-cpu

在深入代码之前,让我们先简要了解一下关键组件:

  1. Langchain:一个极其通用和全面的库,旨在简化使用法学硕士构建的应用程序的创建。Langchain 使开发人员可以将 LLM 连接到自定义数据库和 API,并提供各种 NLP 工具和代理功能。
  2. Facebook AI 相似性搜索(FAISS):Meta 开发的一个框架,用于高效相似性搜索和密集向量聚类。
  3. OpenAI API:这不需要更深入的解释。大多数人都熟悉 GPT——我们将使用它来生成对用户查询的响应的底层语言模型。您可以在此处获取 OpenAI API 令牌。

接下来,让我们导入必要的模块:

import streamlit as st 
from PyPDF2 import PdfReader
from langchain.embeddings import OpenAIEmbeddings, SentenceTransformerEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain, RetrievalQA
from langchain.memory import ConversationBufferWindowMemory
from langchain.vectorstores import FAISS
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

提高模块化程度的辅助函数

现在,让我们创建辅助函数来处理 PDF 文档中的文本,将文本转换为向量,并初始化用于处理用户查询的对话链。这些辅助函数支持采用结构化方法来处理和准备 PDF 文档中的文本数据以供进一步分析。

# Extracts and concatenates text from a list of PDF documents
def get_pdf_text(pdf_docs):
    text = ""
    for pdf in pdf_docs:
        pdf_reader = PdfReader(pdf)
        for page in pdf_reader.pages:
            text += page.extract_text()
    return text

# Splits a given text into smaller chunks based on specified conditions
def get_text_chunks(text):
    text_splitter = RecursiveCharacterTextSplitter(
        separators="\\n",
        chunk_size=1000,
        chunk_overlap=200,
        length_function=len
    )
    chunks = text_splitter.split_text(text)
    return chunks
# Generates embeddings for given text chunks and creates a vector store using FAISS
def get_vectorstore(text_chunks):
    embeddings = SentenceTransformerEmbeddings(model_name='all-MiniLM-L6-v2')
    vectorstore = FAISS.from_texts(texts=text_chunks, embedding=embeddings)
    return vectorstore

最初,从 PDF 文档列表中提取文本并将其连接成单个字符串。然后,该文本被分割成更小的块,使其更易于分析管理。最后,使用句子转换器将这些块转换为向量嵌入,并在 FAISS 向量存储中进行组织,以便在后续操作中实现高效的相似性搜索功能。通过这些步骤,代码为高级文本分析奠定了基础,为更大系统中的相似性搜索和上下文查询等功能铺平了道路。

使用 Langchain 和 OpenAI 作为 LLM 引擎

在对话式人工智能领域,保留和参考过去交互的能力对于维持对话中的上下文相关性非常宝贵。下面的代码片段揭示了 Langchain(一个帮助我们构建对话代理的库)如何与 OpenAI 的 GPT 模型一起使用来初始化对话链——一系列可以随时间引用或扩展的交互序列。

# Initializes a conversation chain with a given vector store
def get_conversation_chain(vectorstore):
    memory = ConversationBufferWindowMemory(memory_key='chat_history', return_message=True)
    conversation_chain = ConversationalRetrievalChain.from_llm(
        llm=ChatOpenAI(temperature=temperature_input, model_name=model_select),
        retriever=vectorstore.as_retriever(),
        get_chat_history=lambda h: h,
        memory=memory
    )
    return conversation_chain

以下是该代码片段中关键组件的细分:

  1. 内存初始化:ConversationBufferWindowMemory创建一个指定为memory_key“chat_history”的实例。该对象将保存对话历史记录,允许对话链引用以前的交互。
  2. 对话链创建:ConversationalRetrievalChain对象通过其from_llm方法进行实例化,这意味着使用大型语言模型(LLM)作为对话处理的底层引擎。
  • 检索器规范:retriever参数使对话链能够在对话期间查询向量存储以获取相关信息。
  • 记忆关联:参数memory与之前创建的实例相关联ConversationBufferWindowMemory,将对话历史记录链接到对话链。

有了这个框架,我们就可以开始构建一个交互式界面,供用户开始查询他们的文档。

对于这个项目,我们将使用Streamlit,这是一个越来越流行的工具,供希望快速测试和部署数据应用程序的开发人员使用。通过简单的 Python 脚本执行,Streamlit 有助于 AI 应用程序的快速原型设计。

使用 Streamlit 简化文档上传和处理

提供的代码片段演示了使用 Streamlit 库处理文件上传、处理和对话分析准备的简化而有效的方法。它提供了简单的 UI 元素,例如文件上传按钮和处理指示器,这对于用户参与和反馈至关重要。

user_uploads = st.file_uploader("Upload your files", accept_multiple_files=True)
if user_uploads is not None:
    if st.button("Upload"):
        with st.spinner("Processing"):
            # Get PDF Text
            raw_text = get_pdf_text(user_uploads)
            # Retrieve chunks from text
            text_chunks = get_text_chunks(raw_text)
            # Create FAISS Vector Store of PDF Docs
            vectorstore = get_vectorstore(text_chunks)
            # Create conversation chain
            st.session_state.conversation = get_conversation_chain(vectorstore)

Streamlit 小部件和会话状态的使用分别实现了用户友好的界面和持久的对话上下文,与创建直观的交互式文档问答应用程序的目标非常一致。

聊天界面

现在,所提供的文档是使用 LLM 模型处理的 PDF 解析、文本嵌入和向量存储辅助函数进行处理的,现在任何文档都可以用作与用户对话的上下文。从这里开始,就非常简单了。初始化聊天机器人功能,您应该能够开始使用您自己的文档问答助手。

if user_query := st.chat_input("Enter your query here"):
    # Process the user's message using the conversation chain
    if 'conversation' in st.session_state:
        result = st.session_state.conversation({
            "question": user_query, 
            "chat_history": st.session_state.get('chat_history', [])
        })
        response = result["answer"]
    else:
        response = "Please upload a document first to initialize the conversation chain."
    with st.chat_message("assistant"):
        st.write(response)

结论

我们现在使用 Streamlit、Langchain、FAISS 和 OpenAI GPT 模型创建了一个上下文感知文档问答聊天机器人(用户可以在 GPT 3.5、3.5-turbo 或 GPT-4 之间进行选择)。用户可以上传PDF文档并进行交互查询。该聊天机器人可以成为一个有用的工具,可以轻松地从文档中提取有价值的见解。

我鼓励读者使用这个工具并发现从他们的见解中解锁见解的方法。如果这有帮助,请告诉我。您可以进一步增强和自定义该聊天机器人以满足特定要求,使文档查询变得轻而易举。

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

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

相关文章

EtherCAT转Profinet协议网关使西门子和倍福的PLC实现通讯的方法

通过倍福PLC协议,远创智控YC-ECTM-PN网关能与倍福系列的PLC进行通信,一起探索下如何操作吧。 1.网关通过网线和倍福 PLC、电脑进行连接,如果网口不够,可以使用交换机连接。 开VS软件,新建一个工程,选择对应…

mac idea 解决0% classes 0% lines covered不显示,非快捷键办法

问题如下 网上说了一堆快捷键,冲突了用不了,页面按下面这样点就可以了点击no coverage就行了

高并发下的缓存击穿、雪崩、穿透和分布式锁(三)

一.缓存穿透 概念: 去查询缓存和数据库都不存在的数据,然后大量请求不存在的数据,导致数据库压力过大崩溃。 解决方案: 把不存在的数据null存入缓存,并给个短期的过期时间。 二.缓存雪崩 概念: 缓存采用…

树莓派 Qt中 QCameraInfo 无法使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、QCameraInfo 是什么?二、使用步骤1.测试代码2.解决方案2.1输入命令2.2输出 3. 成功打印了摄像头的信息 总结 前言 提示:这里可以添…

苹果秋季发布会官宣,新款Mac将搭载M3芯片,来势迅猛!

苹果宣布将于 10 月 31 日上午 8 点(北京时间)举行发布会,这次发布会的主题是「来势迅猛」,旨在为全球的苹果粉丝和科技爱好者带来令人期待的新品发布。这次发布会引人瞩目,因为它将聚焦在 Mac 系列产品以及全新的 M3 …

Spring源码解析-注册配置信息

1、注册方法概述 register(componentClasses) 注册配置类的信息。其中componentClasses 为传入的配置类class。 通过AnnotatedBeanDefinitionReader 的register(this.reader.register(componentClasses))方法。AnnotatedBeanDefinitionReader 已经注册了系统自带的处理器以及方…

程序化广告系列之一---名词解释

基础 1、DSP:全称“Demand-Side Platform”,需求方平台,是为广告主、代理商提供一个综合性的管理平台,通过统一界面管理多个数字广告和数据交换账户。 2、SSP:SSP是Sell-Side Platform的缩写,即供应方平台…

边缘计算技术的崭新篇章:赋能未来智能系统

边缘计算是近年来云计算和物联网技术发展的重要趋势。通过将数据处理和分析从云端迁移到设备边缘,边缘计算能够实现更低的延迟和更高的数据安全。本文将探索边缘计算技术的最新进展及其在不同行业中的应用场景。 1. 实时数据处理与决策 在需要快速响应的场景中&…

电脑技巧:Win10飞行模式相关知识介绍

目录 一、飞行模式简介 二、如何开关Windows 10中的飞行模式 方法一:使用硬件开关 方法二:使用Windows 10操作中心 方法三:使用Windows 10设置 三、飞行模式开关被卡住、变灰或不工作时怎么办 什么是 Windows 10 飞行模式? 用户如何打…

matlab simulink ADRC控制样例

1、内容简介 略 3-可以交流、咨询、答疑 2、内容说明 用adrc控制传递函数,保证输出达到预期 ADRC控制器、传递函数 3、仿真分析 4、参考论文 略

计算机网络重点概念整理-第六章 应用层【期末复习|考研复习】

第六章 应用层 【期末复习|考研复习】 计算机网络系列文章传送门: 第一章 计算机网络概述 第二章 物理层 第三章 数据链路层 第四章 网络层 第五章 传输层 第六章 应用层 第七章 网络安全 计算机网络整理-简称&缩写 文章目录 第六章 应用层 【期末复习|考研复习…

(一)MySQL-架构

一、MySQL逻辑架构 中间是MySQL的核心服务,包括查询分析、优化、缓存及所有的内置函数(日期、时间、数据等),所有跨存储的引擎的功能都在这一层实现:存储过程、触发器、视图等。 存储引擎负责MySQL中的存储和提取。服务器通过A…

数字孪生与智慧城市:开启未来智慧生活

在数字时代的浪潮中,数字孪生技术和智慧城市的理念相互交织,共同塑造了一个更智能、更可持续、更宜居的未来。数字孪生是一项前沿技术,将虚拟世界与现实世界相融合,为城市管理者和市民带来了前所未有的机遇和便捷。 数字孪生模型是…

AD原理图如何转换为OrCAD原理图?

在电子工程领域,原理图是用于描述电路设计的重要工具,虽然Altium Designer(AD)和OrCAD都是广泛使用的原理图绘制工具,但他们之间存在一定的差异,因此如果你遇见了需要将AD原理图转为OrCAD原理图&#xff0c…

C语言数据结构之链表

目录 顺序存储和链式存储 数组—顺序存储 链表—链式存储 单链表 单链表的基本设计 单链表概念&设计 单链表的基本操作 双向链表 双向链表的基本设计 双向链表的基本操作 循环链表 循环链表的介绍及创建 循环链表的基本操作 顺序存储和链式存储 数组—顺序存…

计算机操作系统重点概念整理-第五章 文件管理【期末复习|考研复习】

第五章 文件管理 【期末复习|考研复习】 计算机操作系统系列文章传送门: 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第五章 文件管理 【期末复习|考研复习】前言五、文件管理5.1 文…

iOS Xcode15 适配:Other Linker Flags:-ld_classic

0x00 适配是一条没有尽头的路 Xcode 14 毛问题都没有,Xcode 15 崩溃 看图说话 0x01 解决方案 Other Linker Flags 添加 -ld_classic 即可 0x02 我的小作品 欢迎体验我的作品之一:小挑战-XGame 拼图游戏,渐变色游戏,经典24点游…

中南林业科技大学javaweb实验报告

文章目录 📍 前置说明实验一 Web服务器开发环境配置一、实验目的二、实验内容三、实验步骤3.1 JDK 的安装与配置3.2 IDEA 中配置 Tomcat3.3 创建 Web 工程3.4 配置 web 工程3.5 运行服务3.6 乱码的解决 四、实验心得 实验二 HTML和Javascript的应用一、实验目的二、…

AI 浪潮下的创业故事(二)|Azure OpenAI Service - ChatU

点击蓝字 关注我们 编辑:Alan Wang 排版:Rani Sun 微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术&#xff0…

vue3 源码解析(2)— ref、toRef、toRefs、shallowRef 响应式的实现

前言 vue3 源码解析(1)— reactive 响应式实现 介绍完 reactive 之后还有另一个很重要的响应式API,其中包括 ref、toRef、toRefs 和 shallowRef。这些API在vue3中起着至关重要的作用,它们帮助我们更好地管理和跟踪响应式数据的变…