东湖之滨 发表于 2024-8-2 09:09:39

利用Embeeding、向量数据库和LangChain构建本地知识库

本文将讲述怎样在本地摆设大模型服务,并利用Embeeding、向量数据库和LangChain构建本地知识库
本地摆设LLM

通常利用LangChain会去调用OpenAI的服务,但是我们在利用OpenAI服务时,但经常会碰到很多阻力,比如付费、网络不稳固等。因此我们可以在下载一个较小的大模型到本地,并将其摆设成OpenAI服务,这样也便于我们利用LangChain去直接调用。
首先需要下载FastChat:
        pip3 install "fschat" -i https://pypi.tuna.tsinghua.edu.cn/simple
摆设很简单,只要开启三个终端分别运行以下命令
启动控制器:
        python -m fastchat.serve.controller --host 0.0.0.0
启动worker,model-path 要指定模型的路径
        python -m fastchat.serve.model_worker --model-path /to/path/ --host 0.0.0.0
最后执行命令:
        python -m fastchat.serve.openai_api_server --host 0.0.0.0
这样就可以将模型启动为一个OpenAI服务
这里用的是千问7B大模型,可以执行如下代码进行下载:
        from modelscope.hub.snapshot_download import snapshot_download

        model_dir = snapshot_download('qwen/Qwen-7B-Chat', cache_dir='./to/path')
Embeeding

Embedding 技能已经作为「基本操纵」广泛应用于推荐、广告、搜索等互联网核心范畴中。Embedding 是用一个低维稠密向量来表示一个对象,使得这个向量可以或许表达相应对象的某些特性,同时向量之间的距离能反应对象之间的相似性。我们要基于大模型搭建本地知识库,那就必须要用到Embeeding了,将文本数据转化成向量,只有转化成向量,才便于盘算机处置惩罚。将这些向量存到数据库后,我们可以将要提的问题同样适用Embeeding转化为向量,然后就行语义相似度查询,获取相关的知识信息。
利用如下代码就可以轻松的将语言转化为向量:
        from sentence_transformers import SentenceTransformer

       

        model = SentenceTransformer('all-mpnet-base-v2')
向量数据库

上文提到,我们会将语句转化为的向量存储到数据库中,这个数据库就是向量数据库。向量数据库主要用于图像检索、音频检索、文本检索等范畴,其主要特点是可以或许高效地存储和检索大规模的向量数据,它用了专门的数据结构和算法来处置惩罚向量之间的相似性盘算和查询。 通过构建索引结构,向量数据库可以快速找到最相似的向量,以满足各种应用场景中的查询需求。
我们将一些文档信息,也就是知识,分块存到向量数据库中,对于用户的问题,利用 Embedding 的相似度进行语义搜索的技能。然后,我们将和问题语义最接近的前几条内容,作为提示语的一部门给到 AI,就相当于给AI配备一套知识库。
LangChain

最后后利用LangChain组装上述所有的功能,实现大模型外挂知识库:
        from langchain.chat_models import ChatOpenAI

        from langchain.text_splitter import RecursiveCharacterTextSplitter

        from langchain.document_loaders import TextLoader

        from langchain.document_loaders import PyPDFLoader

        from langchain.document_loaders import Docx2txtLoader

        from langchain.embeddings import ModelScopeEmbeddings

        from langchain.vectorstores import Qdrant

        from langchain.retrievers.multi_query import MultiQueryRetriever

        from langchain.chains import RetrievalQA

       

        import os

       

        # 连接本地部署的OpenAI服务

        model = ChatOpenAI(

          streaming=True,

          verbose=True,

          callbacks=[],

          openai_api_key="none",

          openai_api_base="http://127.0.0.1:8000/v1",

          model_name="Qwen-7B-Chat",

          temperature=0

        )

       

        # 加载Documents

        base_dir = './files' # 文档的存放目录

        documents = []

        for file in os.listdir(base_dir):

          # 完整的文件路径

          file_path = os.path.join(base_dir, file)

          if file.endswith('.pdf'):

                loader = PyPDFLoader(file_path)

                documents.extend(loader.load())

          elif file.endswith('.docx'):

                loader = Docx2txtLoader(file_path)

                documents.extend(loader.load())

          elif file.endswith('.txt'):

                loader = TextLoader(file_path)

                documents.extend(loader.load())

       

        text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=10) # 文档分割器

        chunked_documents = text_splitter.split_documents(documents)

       

        # 创建 embeedings

        model_id = "damo/nlp_corom_sentence-embedding_chinese-base"

        embeddings = ModelScopeEmbeddings(

          model_id=model_id)

       

        # 加载文档到向量数据库

        vectorstore = Qdrant.from_documents(

          documents=chunked_documents, # 以分块的文档

          embedding=embeddings, # 用OpenAI的Embedding Model做嵌入

          location=":memory:",# in-memory 存储

          collection_name="documents") # 指定collection_name

       

        # 构建一个MultiQueryRetriever

        retriever_from_llm = MultiQueryRetriever.from_llm(retriever=vectorstore.as_retriever(), llm=model)

       

        # 实例化一个RetrievalQA链

        qa_chain = RetrievalQA.from_chain_type(model, retriever=retriever_from_llm)

        result = qa_chain("填入你的问题")

       

        print(result)
在上面代码中,首先连接本地摆设的OpenAI服务,创建出了model,随后利用 RecursiveCharacterTextSplitter 进行文天职割,设置一个文档块大小为200,重叠字符长度为10。之后初始化Embeeding模型,并利用Qdrant作为向量数据库,读如文档数据并进行Embeeding将自然语言存储成向量。之后查询器利用了MultiQueryRetriever,其特点是利用语言模型从差异的视角为给定的用户输入查询天生多个查询。 然后利用这些查询来检索一组相关文档。下一步,利用RetrievalQA构建了一个Chain,作用是先检索后天生,即检索增强天生。
到这里就完成构建了。
怎样系统的去学习AI大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的本领和经验解答大家在人工智能学习中的很多困惑,以是在工作繁忙的情况下还是对峙各种整理和分享。
但苦于知识传播途径有限,很多互联网行业朋侪无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习头脑导图、佳构AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
所有资料 ⚡️ ,朋侪们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~
   
页: [1]
查看完整版本: 利用Embeeding、向量数据库和LangChain构建本地知识库