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

在本文中,使用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的文档添加到集合(此步骤创建嵌入),然后查询此集合(语义检索)。

五、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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Halcon区域的灰度特征值gray_features

Halcon区域的灰度特征值 gray_features 算子用于计算指定区域的灰度特征值。其输入是一组区域,每个区域的特征都存 储在一组value数组中。 典型的基于灰度值的特征如下: (1)area:灰度区域面积。 (2&#x…

c++学习第八讲---类和对象---继承

继承: 使子类(派生类)拥有与父类(基类)相同的成员,以节约代码量。 1.继承的基本语法: class 子类名:继承方式 父类名{} ; 例: class father { public:in…

Unity 了解Input Manage下默认的输入轴

在Unity菜单Edit->Project Settings->Input Manager->Axes下有一些默认的输入轴,如 这些输入轴代表不同类型的输入,其中: Horizontal:水平移动输入轴。通常与键盘的左右箭头键、A和D键、游戏手柄的左摇杆水平轴等相关联…

数据结构入门到入土——链表(2)

目录 一,与链表相关的题目(2) 1.输入两个链表,找出它们的第一个公共节点 2.给定一个链表,判断链表中是否有环 3.给定一个链表,返回链表开始入环的第一个节点,若无则返回null 一,…

SonarQube 漏洞扫描

SonarQube 漏洞扫描 一、部署服务 1.1 docker方式部署 #安装docker curl -L download.beyourself.org.cn/shell-project/os/get-docker-latest.sh | sh yum install -y docker-compose #进去输入:set paste可以保证不穿行 [rootlocalhost sonar]# vim docker-compose.yml v…

Python从入门到网络爬虫(异常处理详解)

前言 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在python无法正常处理程序时就会发生一个异常。异常是python对象,表示一个错误。当python脚本发生异常时我们需要捕获处理它,…

如何把电脑中的项目快速传进Github中?

一、打开GitHub网站:https:github.com 登录自己的个人账号 1.新建一个项目 2.用鼠标直接拖拽电脑中的项目文件夹与文件到新创建的项目中点击保存即可。

家里有必要买NAS吗?

完全没有必要,因为用旧电脑搭建NAS不仅价格实惠,而且非常简单,效果也完全不差买了的! 并且......还环保 教程链接: 用旧电脑搭建NAS在您的家庭中,通过将旧 PC 转变为NAS服务器,您可以轻松搭建…

【Docker】创建,查看,进入容器

目录 方式一: 创建 查看 ​编辑 方式二: 创建 查看 进入容器 方式一: 首先查看有什么镜像 创建 docker run -i -t --namefreedom centos:7 /bin - i 表示容器一直运行着,容器如果没有客户端连接就会关闭,加了…

【无标题】MySQL8修改非root用户密码

首先查看修改的用户信息,我这里用户名是demo,host是**%** 然后使用alter命令修改密码 这里USER后的参数是第一步里查询得到的user与host的组合。ALTER USER demo% IDENTIFIED WITH mysql_native_password BY 新密码;可能会出现的错误: 如果百…

听GPT 讲Rust源代码--compiler(32)

File: rust/compiler/rustc_middle/src/middle/exported_symbols.rs 在Rust的源代码中,rust/compiler/rustc_middle/src/middle/exported_symbols.rs文件的作用是实现编译器中处理导出符号的功能。 该文件中定义了一些结构体和枚举,用于描述导出符号的信…

李沐-《动手学深度学习》-- 01-预备知识

一、线性代数知识 1. 矩阵计算 a. 矩阵求导 ​ 当y和x分别为标量和向量时候,进行求导得到的矩阵形状,矩阵求导就是矩阵A中的每一个元素对矩阵B中的每一个元素求导 ​ 梯度指向的是值变化最大的方向 ​ 分子布局和分母布局: b. 常识 ax…

设计模式③ :生成实例

文章目录 一、前言二、Singleton 模式1. 介绍2. 应用3. 总结 三、Prototype 模式1. 介绍2. 应用3. 总结 四、Builder 模式1. 介绍2. 应用3. 总结 五、Abstract Factory 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子,就懒得看源码又不像浪费时间所…

Linux_CentOS_7.9_Oracle11gr2配置数据库及监听服务自启动多方案实操之简易记录

前言: 作为运维保障,都无法准确预估硬件宕机的突发阶段,其生产数据实时在产出,那作为dba数据库服务以及相关Listener的其重要性、必要性就突显而出。这里拿虚拟机试验做个配置记录,便于大家学习参考。 实现方法一: 环境变量值::$ORACLE_HOME= /data/oracle/product/1…

ASP.NET Core基础之图片文件(二)-WebApi图片文件上传到文件夹

阅读本文你的收获: 了解WebApi项目保存上传图片的三种方式学习在WebApi项目中如何上传图片到指定文件夹中 在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中,学习了如何获取WebApi中的静态图片,本文继续分享如何上传图片。 那么…

基于机器视觉的车牌检测-边缘检测因子的选择

车牌检测概述 车牌识别在检测报警、汽车出入登记、交通违法违章以及移动电子警察方面应用广泛。车牌识别过程为:首先通过摄像头获取包含车牌的彩色图像;然后进行车牌边缘检测,先粗略定位到车牌位置,再精细定位;最后根…

你真的会用 Postman 吗?

1. 场景 提到 Postman,大部分的人可能只停留在使用 Postman「 模拟网络请求 」这单一功能上面。 事实上,Postman 的功能很强大,下面将罗列出几个比较少用,但实用的功能。 2. 抓包及拦截器 除了 Fiddler 和 Charles&#xff0c…

深入浅出Nacos的原理

前言 本文来讲一讲nacos作为底层注册中心的实现原理。那么就有这几个问题? 临时实例和永久实例是什么?有什么区别? 服务实例是如何注册到服务端的? 服务实例和服务端之间是如何保活的? 服务订阅是如何实现的&#…

idea怎么设置作者信息(详细)

目录 一:在Java类的开头自动注释作者名字和日期等信息 二:给Java的方法注释作者名字和日期等信息 1. 不可修改的模板:Postfix Completion 2. 可修改的模板:Live Templates tips:首先给大家推荐两款好用的免费软件&…

C语言汇总(持续更新)

大家好,这里是争做图书馆扫地僧的小白。非常感谢各位的支持,也期待着您的关注。 目前博主有着C语言、C、linux以及数据结构的专栏,内容正在逐步的更新。 希望对各位朋友有所帮助同时也期望可以得到各位的支持,有任何问题欢迎私信与…