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

在这篇文章中,我们将探索创建一个简单但有效的聊天机器人,该机器人根据上传的 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文档并进行交互查询。该聊天机器人可以成为一个有用的工具,可以轻松地从文档中提取有价值的见解。

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

你可能感兴趣的:(大模型,python,人工智能,chatgpt)