LLM之RAG实战(十一)| 使用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/ORetrieval(检索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 librariesfrom langchain.document_loaders import PyPDFLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain.embeddings import HuggingFaceEmbeddingsfrom langchain.llms import HuggingFaceHubfrom langchain.vectorstores import Chromafrom langchain.chains import ConversationalRetrievalChain
# Load the pdf file and split it into smaller chunksloader = 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 textdb = 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 Chainqa_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 quitimport syschat_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!

参考文献:

[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/278977.html

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

相关文章

Transformer(seq2seq、self-attention)学习笔记

在self-attention 基础上记录一篇Transformer学习笔记 Transformer的网络结构EncoderDecoder 模型训练与评估 Transformer的网络结构 Transformer是一种seq2seq 模型。输入一个序列,经过encoder、decoder输出结果也是一个序列,输出序列的长度由模型决定…

基于MINIST的手写数字体识别

一、算法简述 网络结构设计 通过创建MnistNet类,定义了包含两个卷积层和两个全连接层的深度神经网络。这个网络的设计灵感来自于经典的CNN结构,其中卷积层用于提取图像特征,而全连接层则用于将这些特征映射到最终的类别。 卷积与池化 卷…

在 Golang 应用程序中管理多个数据库

掌握在 Golang 项目中处理多个数据库的艺术 在当前软件开发领域中,处理单个应用程序内的多个数据库的需求越来越普遍。具有强大功能的 Golang 是处理此类任务的绝佳解决方案,无论您是与多个数据源合作还是仅为增强组织和可扩展性而分隔数据。在本文中&a…

网络安全应急响应工具之-流量安全取证NetworkMiner

在前面的一些文章中,用了很多的章节介绍流量分析和捕获工具wireshark。Wireshark是一款通用的网络协议分析工具,非常强大,关于wireshark的更多介绍,请关注专栏,wireshark从入门到精通。本文将介绍一个专注于网络流量取…

JavaEE - 网络编程之回显服务器

目录 一.什么是回显服务器? 二.UDP是什么? 1.TCP 是有链接的, UDP 是无连接的 2.TCP是可靠传输的,UDP是不可靠传输的 3.TCP是面向字节流的,UDP是面向数据报 4.TCP和UDP是全双工的 三.UDP的 socket api 四. 具体代码实现 …

NModbus-一个C#的Modbus协议库实现

NModbus-一个基于C#实现的Modbus通信协议库 最近在学习C#的时候,因为之前做过环保设备时使用C做过环保设备采集使用到了Modbus协议,当时看了一下基于C语言开发的libmodbus库。所以特意搜索看了一下C#下有什么Modbus协议库,在Github上面找了一…

Spring Boot学习随笔- 集成MyBatis-Plus,第一个MP程序(环境搭建、@TableName、@TableId、@TableField示例)

学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 引言 MyBatis-Plus是一个基于MyBatis的增强工具,旨在简化开发,提高效率。它扩展了MyBatis的功能,提供了许多实用的特性,…

数据缓存(Redis, Spring Cache)——后端

场景:给用户端展示的数据都是通过查询数据库所得,因此数据库访问压力会随着用户访问量增大而增加,从而导致系统响应慢、用户体验差。 方法:通过Redis缓存数据,减少查询数据库操作。(Redis的数据是存储在内存…

vue中常见的指令

简单介绍一下常见的vue中用到的指令 v-on 指定当前的事件&#xff0c;语法糖为&#xff0c;如例子所示&#xff0c;指定按钮的事件为addCounter&#xff0c;点击会使变量counter 1 <!DOCTYPE html> <html><head><meta charset"utf-8" />…

【教学类-43-02】20231226 九宫格数独2.0(n=9)(ChatGPT AI对话大师生成 回溯算法)

作品展示&#xff1a; 背景需求&#xff1a; 大4班20号说&#xff1a;我不会做这种&#xff08;九宫格&#xff09;&#xff0c;我做的是小格子的&#xff0c; 他把手工纸翻过来&#xff0c;在反面自己画了矩阵格子。向我展示&#xff1a; “我会做这种&#xff01;” 原来他…

Android MVP 写法

前言 Model&#xff1a;负责数据逻辑 View&#xff1a;负责视图逻辑 Presenter&#xff1a;负责业务逻辑 持有关系&#xff1a; 1、View 持有 Presenter 2、Model 持有 Presenter 3、Presenter 持有 View 4、Presenter 持有 Model 辅助工具&#xff1a;ViewBinding 执行…

C++:模板进阶

C:模板进阶 前言一、非类型模板参数二、模板的特化2.1 概念2.2 类模板特化2.2.1 全特化2.2 偏特化 2.3 函数模板特化 四、模板分离编译4.1 什么是分离编译4.2 模板的分离编译4.3 解决方法 五、总结 前言 在C:模板初阶中&#xff0c;已经介绍过了模板的基本用法&#xff0c;接下…

三角形的外心、内心、中心、重心、垂心、中心、费马点

三角形的外心 即三角形的外接圆的中心。此时&#xff1a; A O B O C O AO BO CO AOBOCO 需要注意的有以下几点&#xff1a; 第一&#xff0c; A O D &#xff0c; B O E &#xff0c; C O F 不一定是直线&#xff0c;能否证明&#xff1f; \color{red}AOD&#xff0c;BOE…

2023总结与展望--Empirefree

今年一篇博客都没写过了&#xff0c;好像完全在忙在工作和生活上面了&#xff0c;珍惜自我&#xff0c;保持热情&#xff0c;2024对我好点 文章目录 &#x1f525;1. 年终总结1.1.学习工作计划1.2. 生活计划1.3 个人总结 &#x1f525;2. 未来展望 &#x1f525;1. 年终总结 1…

数据库一般会采取什么样的优化方法?

数据库一般会采取什么样的优化方法&#xff1f; 1、选取适合的字段属性 为了获取更好的性能&#xff0c;可以将表中的字段宽度设得尽可能小。 尽量把字段设置成not null 执行查询的时候&#xff0c;数据库不用去比较null值。 对某些省份或者性别字段&#xff0c;将他们定义为e…

Linux - 设置虚拟机和主机IP在同一网段(桥接)

1.查看主机ip地址等相关信息。 ipconfig -all 2.设置虚拟网络编辑器 打开虚拟网络编辑器 设置虚拟网络编辑器&#xff0c;设置为桥接模式。&#xff08;记得以管理员方式打开VMware&#xff09;。 3.修改虚拟机网卡文件 查看虚拟机ip,我们的目标是将其修改为与主机同一网段…

如何在MAC OS中的XCODE下添加 <bits/stdc++.h>

mac上使用的编译器是Clang&#xff0c;但是没有万能头文件bits/stdc.h\&#xff0c;本文介绍如何添加万能头文件 Xcode 版本&#xff1a;15.1 - 打开应用程序-Xcode-右键显示包内容 Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/includ…

Android—— MIPI屏调试

一、实现步骤 1、在kernel/arch/arm/boot/dts/lcd-box.dtsi文件中打开&dsi0节点&#xff0c;关闭其他显示面板接口&#xff08;&edp_panel、&lvds_panel&#xff09; --- a/kernel/arch/arm/boot/dts/lcd-box.dtsib/kernel/arch/arm/boot/dts/lcd-box.dtsi-5,14 …

Halcon区域生长的几种算法regiongrowing/regiongrowing_mean/watersheds

Halcon区域生长的几种算法 文章目录 Halcon区域生长的几种算法1. regiongrowing 算子2. regiongrowing_mean算子3. 分水岭算法 如果想要获得具有相似灰度的相连区域&#xff0c;可以使用区域生长法寻找相邻的符合条件的像素。区域生长法的基本思想是&#xff0c;在图像上选定一…

22 UVM Callbacks

回调用于改变组件或对象的行为而不修改其代码。请参阅SystemVerilog callback - VLSI Verify以更好地理解。UVM 中的phasing机制就是回调的一个简单示例。 1 UVM Callback Usage 允许即插即用机制以建立可重用的验证环境。基于钩子方法&#xff08;hook method&#xff09;调…