LangChain + ChatGLM 实现本地知识库问答

您所在的位置:网站首页 怎么把很多数据分列在一起 LangChain + ChatGLM 实现本地知识库问答

LangChain + ChatGLM 实现本地知识库问答

2023-05-25 19:18| 来源: 网络整理| 查看: 265

最近有看到可以利用LangChain+OpenAI的API来实现一个问答系统,上一篇文章:ChatGLM 集成进LangChain工具。既然可以将ChatGLM 集成进LangChain,是不是我们可以在完全不使用OpenAI的情况下来是实现一个私有化的本地知识库问答系统的搭建呢?本文将介绍一种可行的方案。

步骤 ChatGLM集成进LangChain工具

可以参考笔者的上一篇文章:ChatGLM 集成进LangChain工具

生成Embedding

本文使用一篇公开的新闻数据(腾讯2022年第四季度营收1449.5亿元 调整后净利润297.1亿元)来做测试。

切分文本

参照Text Splitters文档,可以选择对应的文本切分器,如果是通用文本的话,建议选择RecursiveCharacterTextSplitter,代码如下:

from langchain.document_loaders import UnstructuredFileLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 导入文本 loader = UnstructuredFileLoader("./data/news_test.txt") # 将文本转成 Document 对象 data = loader.load() print(f'documents:{len(data)}') # 初始化加载器 text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0) # 切割加载的 document split_docs = text_splitter.split_documents(data) print("split_docs size:",len(split_docs))

打印结果如下:

documents:1 split_docs size: 31 chunk_size:每一个分片的最大大小 chunk_overlap:相邻的块之间的最大重叠。有一些重叠可以很好地保持块之间的一些连续性(类似于一个滑动窗口)。 生成embedding

目前有两种方式可以生成Embedding数据

直接使用OpenAIEmbeddings来生成Embedding数据 from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain import VectorDBQA from langchain.document_loaders import UnstructuredMarkdownLoader from langchain.embeddings.openai import OpenAIEmbeddings import IPython import os from dotenv import load_dotenv load_dotenv() os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY") os.environ["OPENAI_API_BASE"] = os.getenv("OPENAI_API_BASE") embeddings = OpenAIEmbeddings( ) 使用HuggingFaceEmbeddings来生成Embedding数据 from langchain.vectorstores import Chroma from langchain.embeddings.huggingface import HuggingFaceEmbeddings import IPython import sentence_transformers embedding_model_dict = { "ernie-tiny": "nghuyong/ernie-3.0-nano-zh", "ernie-base": "nghuyong/ernie-3.0-base-zh", "text2vec": "GanymedeNil/text2vec-large-chinese", "text2vec2":"uer/sbert-base-chinese-nli", "text2vec3":"shibing624/text2vec-base-chinese", } EMBEDDING_MODEL = "text2vec3" # 初始化 hugginFace 的 embeddings 对象 embeddings = HuggingFaceEmbeddings(model_name=embedding_model_dict[EMBEDDING_MODEL], ) embeddings.client = sentence_transformers.SentenceTransformer( embeddings.model_name, device='mps')

两种方式的差别:

OpenAIEmbeddings: 使用简单,并且效果比较好; 会消耗openai的token,特别是大段文本时,消耗的token还不少,如果知识库是比较固定的,可以考虑将每次生成的embedding做持久化,这样就不需要再调用openai了,可以大大节约token的消耗; 可能会有数据泄露的风险,如果是一些高度私密的数据,不建议直接调用。 HuggingFaceEmbeddings: 可以在HuggingFace上面选择各种sentence-similarity模型来进行实验,数据都是在本机上进行计算 需要一定的硬件支持,最好是有GPU支持,不然生成数据可能会非常慢 生成的向量效果可能不是很好,并且HuggingFace上的中文向量模型不是很多。 保存Embedding数据

有多种向量数据库选择,这里选择比较简单的Chroma,因为比较轻量,直接安装库就可使用。

from langchain.vectorstores import Chroma # 初始化加载器 db = Chroma.from_documents(split_docs, embeddings,persist_directory="./chroma/openai/news_test") # 持久化 db.persist()

持久化后,可以直接选择从持久化文件中加载,不需要再重新就可使用了,使用方式如下:

db = Chroma(persist_directory="./chroma/news_test", embedding_function=embeddings)

当然也可使用FAISS,使用方式也类似,

持久化 from langchain.vectorstores import FAISS db = FAISS.from_documents(split_docs, embeddings) db.save_local("./faiss/news_test") 加载已持久化向量 db = FAISS.load_local("./faiss/news_test",embeddings=embeddings) 试验效果 如果只想使用embedding来计算句子的相似度,可以直接类似下面这样使用: # 初始化 prompt 对象 question = "2022年腾讯营收多少" similarDocs = db.similarity_search(question, include_metadata=True,k=4) [print(x) for x in similarDocs]

最多返回匹配的前4条相似度最高的句子

如果想接入ChatGLM来帮忙做总结和汇总的话,可以如下使用: from langchain.chains import RetrievalQA import IPython qa = RetrievalQA.from_chain_type(llm=ChatGLM(temperature=0.1), chain_type="stuff", retriever=retriever) # 进行问答 query = "2022年腾讯营收多少" print(qa.run(query))

image.png

ChatGLM基于ChatGLM 集成进LangChain工具文章中的封装

最终效果可能并不是很好,这可能跟文本切分、embedding生成都有关系,需要再不断调节,但是整体思路和方案是可行的。

总结

本文使用LangChain+ChatGLM来实现一个简单的基于本地知识库的问答系统,可以在完全不使用openai提供的api来完成本地知识库问答系统的搭建,如果有需要做本地私有化知识库问答系统的,可以参考此方案。

参考

imClumsyPanda/langchain-ChatGLM

使用langchain配合chatglm搭建本地的知识库,但是langchain和chatglm是部署在一起的,耦合性比较高

ChatGLM 集成进LangChain工具



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3