用通俗易懂的方式讲解:使用 Mistral-7B 和 Langchain 搭建基于PDF文件的聊天机器人

news/2024/7/20 18:28:43 标签: langchain, pdf, 机器人, 大模型, AIGC, 多模态

在本文中,使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序,可以从任何pdf文件中回答问题。

一、LangChain简介

LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few-shot示例的LLM来提供相关响应和推理。LangChain擅长文档问答、聊天机器人、分析结构化数据等。LangChain提供方便处理LLM的抽象组件及其实现,还为更高级别的任务提供组件Chain。

安装langchain

pip install langchain

LangChain中的模块Model I/O(模型I/O, Retrieval(检索, Chains(), Agents(代理), Memory(记忆), Callbacks(回调)

1.1 模型I/O模块

模型I/O是应用程序的核心元素。使用LangChain,可以使用任何大语言模型。这个接口需要三个组件:大语言模型提示输出解析器

LangChain提供了许多函数来构建提示,为各种任务提供现成的**提示模板,**也可以自定义提示模板。

LangChain可以使用LLM,也可以使用以聊天消息列表为输入并返回聊天聊天消息。它可以与许多LLM一起工作,包括OpenAI LLMs和开源LLM。

输出解析器用于构建从LLM接收的响应,PydanticOutputParser是LangChain中输出解析器的主要类型。

1.2 检索模块

检索模块实现了检索增强生成(RAG),可以访问大模型训练数据之外的用户私有数据。检索步骤包括以下几步:加载数据、转换数据、创建或获取嵌入、存储嵌入和检索嵌入。LangChain拥有大约100个文档加载器,可以读取主要的文档格式,比如CSV、HTML、pdf、代码等。它可以使用不同的算法转换数据。LangChain集成了超过25个嵌入模型和超过50家向量数据库。

1.3 链条模块

复杂的应用程序通常需要组合多个LLM来完成。LangChain提供了Chain功能,可以集成多个LLM,Chain也可以调用其他Chain。

1.4 代理模块

代理也是一种Chain,负责决定下一步动作。代理由一个语言模型和一个提示组成,它需要以下输入:可用工具列表用户输入和历史执行信息(如果有的话)。代理cals的功能被称为“工具”。代理使用LLM来决定要采取的操作和顺序。操作包括——使用工具,观察工具的输出,向用户返回响应。

1.5 记忆模块

记忆模块使系统能够记住过去的信息,这在对话机器人中非常重要。

1.6 回调模块

回调机制允许用户使用API的“回调”参数返回LLM应用程序不同阶段的信息,比如用于日志记录、监控、流式传输等。

二、Mistral-7B

Mistral-7B是一个强大的语言模型(目前是开源的),具有73亿个参数,性能优于很多参数量更高的大模型。它可以下载以供离线使用,也可以在云中使用或从HuggingFace下载。使用langchain中的HuggingFaceHub,可以使用以下代码加载并使用Mistral-7B:

repo_id = "mistralai/Mistral-7B-v0.1"
llm = HuggingFaceHub(huggingfacehub_api_token='your huggingface access token here', 
                     repo_id=repo_id, model_kwargs={"temperature":0.2, "max_new_tokens":50})

三、HuggingFace Embedding

在处理文本、图像、音频、视频、文档等数据时,通常首先会进行embedding把他们表示成数字类型,这样便于神经网络处理,embedding不仅仅是一种数字表示,它也可以捕捉数据的上下文语义信息。

HuggingFace提供了Sentence Transformers模型可以进行embedding,安装如下所示:

pip install -U sentence-transformers

然后使用它加载一个预先训练好的模型来对文本句子进行编码。

四、chroma向量存储

chroma是一个开源的嵌入数据库(矢量存储),用于创建、存储、检索和进行嵌入的语义搜索。安装如下:

pip install chroma

它允许用户连接到chroma客户端,创建一个集合,将带有元数据和id的文档添加到集合(此步骤创建嵌入),然后查询此集合(语义检索)。

pdf__76">五、pypdf

pypdf库可以读取、拆分、合并、裁剪、转换pdf文件的页面,添加自定义数据,更改查看选项,为pdf文件添加密码,从pdf文件中检索文本和元数据。安装如下所示:

pip install pypdf

要将pypdf与AES加密或解密一起使用,请安装额外的依赖项:

pip install pypdf[crypto]

六、实现代码

# Install dependencies
!pip install huggingface_hub
!pip install chromadb
!pip install langchain
!pip install pypdf
!pip install sentence-transformers
# import required libraries
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.llms import HuggingFaceHub
from langchain.vectorstores import Chroma
from langchain.chains import ConversationalRetrievalChain
# Load the pdf file and split it into smaller chunks
loader = PyPDFLoader('report.pdf')
documents = loader.load()

# Split the documents into smaller chunks 
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)
# We will use HuggingFace embeddings 
embeddings = HuggingFaceEmbeddings()
#Using Chroma vector database to store and retrieve embeddings of our text
db = Chroma.from_documents(texts, embeddings)
retriever = db.as_retriever(search_kwargs={'k': 2})
# We are using Mistral-7B for this question answering 
repo_id = "mistralai/Mistral-7B-v0.1"
llm = HuggingFaceHub(huggingfacehub_api_token='your huggingface access token here', 
                     repo_id=repo_id, model_kwargs={"temperature":0.2, "max_new_tokens":50})
# Create the Conversational Retrieval Chain
qa_chain = ConversationalRetrievalChain.from_llm(llm, retriever,return_source_documents=True)
#We will run an infinite loop to ask questions to LLM and retrieve answers untill the user wants to quit
import sys
chat_history = []
while True:
    query = input('Prompt: ')
    #To exit: use 'exit', 'quit', 'q', or Ctrl-D.",
    if query.lower() in ["exit", "quit", "q"]:
        print('Exiting')
        sys.exit()
    result = qa_chain({'question': query, 'chat_history': chat_history})
    print('Answer: ' + result['answer'] + '\n')
    chat_history.append((query, result['answer']))

至此,基于PDF的聊天机器人就搭建好了,你可以从一个长而难的pdf中回答你的所有问题。Just do it!

通俗易懂讲解大模型系列

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:结合检索和重排序模型,改善大模型 RAG 效果明显

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:ChatGLM3-6B 功能原理解析

  • 用通俗易懂的方式讲解:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解:一个强大的 LLM 微调工具 LLaMA Factory

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:LangChain Agent 原理解析

  • 用通俗易懂的方式讲解:HugggingFace 推理 API、推理端点和推理空间使用详解

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:使用 FastChat 部署 LLM 的体验太爽了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:使用 Docker 部署大模型的训练环境

  • 用通俗易懂的方式讲解:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:LangChain 知识库检索常见问题及解决方案

  • 用通俗易懂的方式讲解:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解:代码大模型盘点及优劣分析

  • 用通俗易懂的方式讲解:Prompt 提示词在开发中的使用

  • 用通俗易懂的方式讲解:万字长文带你入门大模型

技术交流

建了AIGC大模型技术交流群! 想要学习、技术交流、获取如下原版资料的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

在这里插入图片描述

参考文献:

[1] https://medium.com/@nimritakoul01/chat-with-your-pdf-files-using-mistral-7b-and-langchain-f3be9363301c

[2] https://colab.research.google.com/corgiredirector?site=https%3A%2F%2Fmedium.com%2F%40woyera%2Fhow-to-chat-with-your-pdf-using-python-llama-2-41df80c4e674

[3] https://www.shakudo.io/blog/build-pdf-bot-open-source-llms


http://www.niftyadmin.cn/n/5310308.html

相关文章

三、计算机理论-关系数据库-结构化查询语言SQL

SQL概述 是一种介于关系代数与关系演算之间的语言,现成为关系数据库的标准语言 特点:综合统一、高度非过程化、面向集合的操作方式、以同一种语法结构提供两种使用方式(直接使用或者嵌入高级语言使用)、语言简洁,易学易…

本地部署 gemini-openai-proxy,使用 Google Gemini 实现 Openai API

本地部署 gemini-openai-proxy,使用Google Gemini 实现 Openai API 0. 背景1. 申请 Google Gemini API key2. (Optional)Google Gemini 模型说明3. gemini-openai-proxy Github 地址4. 本地部署 gemini-openai-proxy5. 测试 0. 背景 使用 Google Gemini 实现 Opena…

爬虫-1-请求和响应

#无以规矩&#xff0c;不成方圆(&#xff89;_ _)&#xff89; <(_ _)> 请求和响应 案例实现

LeetCode-移动零(283)

题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 思路&#xff1a; 这里的思路跟以前做过的去重复数字的思路有点像&…

YOLOv5改进 | 损失函数篇 | MPDIoU、InnerMPDIoU助力细节涨点

一、本文介绍 本文为读者详细介绍了YOLOv5模型的最新改进,带来的改进机制是最新的损失函数MPDIoU和融合了最新的Inner思想的InnerMPDIoU。提升检测精度和处理细节方面的作用。通过深入探讨MPDIoU和InnerMPDIoU(全网首发)的工作原理和实际代码实现,本文旨在指导读者如何将这些…

服务器RAID管理之MegaRaid工具

一、简介 MegaCli是一款管理维护硬件RAID软件&#xff0c;可以通过它来了解当前raid卡的所有信息&#xff0c;包括 raid卡的型号&#xff0c;raid的阵列类型&#xff0c;raid 上各磁盘状态等等。通常&#xff0c;我们对硬盘当前的状态不太好确定&#xff0c;一般通过机房人员巡…

传感数据分析——高通滤波与低通滤波

传感数据分析——高通滤波与低通滤波 文章目录 传感数据分析——高通滤波与低通滤波前言一、运行环境二、Python实现总结 前言 对于传感信号而言&#xff0c;我们可以提取其中的高频信息和低频信息&#xff0c;低频信息往往是信号的趋势&#xff0c;高频信息往往是一些突变或异…

Fowsniff

靶场搭建 遇到扫描不到的情况&#xff0c;可以尝试改靶机的网络为NAT模式&#xff0c;在靶机启动时按”esc“&#xff0c;进入Advanced options for Ubantu&#xff0c;选择recovery mode&#xff0c;选择network&#xff0c;按方向键”→“&#xff0c;OK&#xff0c;然后res…