LLM之RAG实战(十一)| 使用Mistral-7B和Langchain搭建基于PDF文件的聊天机器人

火山方舟向量数据库大模型
![picture.image](https://p3-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/f8ff113618774ff7bc078d042d4e94f0~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1756842014&x-signature=NPcvuN1erChINvK26xaRupJ3sG4%3D)




在本文中,使用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!

参考文献:

[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

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
KubeZoo: 轻量级 Kubernetes 多租户方案探索与实践
伴随云原生技术的发展,多个租户共享 Kubernetes 集群资源的业务需求应运而生,社区现有方案各有侧重,但是在海量小租户的场景下仍然存在改进空间。本次分享对现有多租户方案进行了总结和对比,然后提出一种基于协议转换的轻量级 Kubernetes 网关服务:KubeZoo,该方案能够显著降低多租户控制面带来的资源和运维成本,同时提供安全可靠的租户隔离性。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论