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

基于LangChain + ChatGLM 搭建融合本地知识的问答机器人


在这里插入图片描述

1 背景介绍

在这里插入图片描述

近半年以来,随着ChatGPT的火爆,使得LLM成为研究和应用的热点,但是市面上大部分LLM都存在一个共同的问题:模型都是基于过去的经验数据进行训练完成,无法获取最新的知识,以及各企业私有的知识。因此很多企业为了处理私有的知识,主要借助以下两种手段来实现:

  • 利用企业私有知识,基于开源大模型进行微调
  • 基于LangChain集成向量数据库以及LLM搭建本地知识库的问答

我们将基于LangChain+ChatGLM搭建本地知识的问答机器人系统。该系统需要能够根据用户提供的问题,在本地的知识库(离线)中查找并返回相关答案。

本次项目以"某东商品衣服"为例,以衣服属性构建本地知识,测试问答效果。使用者可以自由更新本地知识,用户问题的答案也是基于本地知识生成的。

关于ChatGLM:

ChatGLM是由清华技术成果转化的公司智谱AI研发的支持中英双语的对话机器人,ChatGLM通过建立大规模的语言模型库,并在实时数据流中进行分析和生成,以实现高效、实时的文本生成和响应;该技术可以快速对大量数据进行处理和分析,通过深度学习模型实时分析用户问题或需求,提高工作效率。

2 项目介绍

在这里插入图片描述

该项目的基本原理:

  • 加载文件
  • 读取文件
  • 文本分割
  • 文本向量化
  • 问句向量化
  • 在文本向量中匹配出与问句向量相似的top_k个
  • 匹配出的文本作为上下文和问题一起添加到prompt中
  • 提交给LLM生成答案

该问答机器人的主要功能包括:

  • 基于本地知识库的问答:系统可以根据用户的提问,在本地的知识库中进行搜索,并返回相关的答案。
  • 多模型支持:项目支持使用不同的语言模型,可以根据需求选择合适的模型进行使用。
  • 离线私有化:可以将该问答系统部署在本地环境中,确保数据的安全性和隐私性。

3 项目流程

准备本地知识库:

  • 首先,你需要一个本地知识库。这可以是一个结构化的数据库,如SQLite、MySQL等,或者是一个非结构化的文档集合,如PDF文件、文本文件等。

  • 确保你的知识库包含了你想要机器人回答的问题的相关信息。

设置LangChain环境:

  • 安装LangChain库。如果你使用的是Python,可以通过pip install langchain来安装。

集成ChatGLM
构建问答逻辑
实现与本地知识库的交互
整合ChatGLM与LangChain

4 环境配置

在这里插入图片描述

4.1 安装依赖

  • 首先,确保你的机器安装了Python3.8-Python3.11
# 终端查看python的版本
python --version
  • 紧接着安装项目的依赖
# 安装全部依赖
pip install faiss-cpu
pip install langchain
pip install qianfan

4.2 模型下载

如需在本地或离线环境下运行本项目,需要首先将项目所需的模型下载至本地,通常开源 LLM 与 Embedding 模型可以从 HuggingFace 下载。

本项目中默认使用的 LLM 模型 THUDM/ChatGLM-6B 与 Embedding 模型 moka-ai/m3e-base

5 代码实现

在这里插入图片描述

5.1 自定义GLM类

  • 目的:使用LLMs模块封装ChatGLM,load本地模型。使用LLM模块封装我们的模型接口的一个好处是有利于后续跟LangChain的其他模块协同。

  • 代码路径:/Users/**/PycharmProjects/llm/langchain_apply/Knowledge_QA/model.py

  • 具体代码

  • 导入必备的工具包

from langchain.llms.base import LLM
from langchain.llms.utils import enforce_stop_tokens
from transformers import AutoTokenizer, AutoModel
from typing import List, Optional
  • 自定义GLM类
# 自定义ChatGLM2
class ChatGLM2(LLM):max_token: int = 4096temperature: float = 0.8top_p = 0.9tokenizer: object = Nonemodel: object = Nonehistory = []def __init__(self):super().__init__()@propertydef _llm_type(self) -> str:return "ChatGLM2"# 定义load_model方法,进行模型的加载def load_model(self, model_path=None):self.tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)self.model = AutoModel.from_pretrained(model_path, trust_remote_code=True).float()# 实现_call方法,进行模型的推理def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:response, _ = self.model.chat(self.tokenizer,prompt,history=self.history,max_length=self.max_token,temperature=self.temperature,top_p=self.top_p)if stop is not None:response = enforce_stop_tokens(response, stop)self.history = self.history + [[None, response]]return response

5.2 构建Faiss索引

  • 目的:构建向量库

  • 代码位置:/Users/**/PycharmProjects/llm/langchain_apply/Knowledge_QA/get_vector.py

  • 具体代码

  • 导入必备的工具包

from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS # 向量数据库
  • 定义main()方法

def main():# 定义向量模型路径EMBEDDING_MODEL = "moka-ai/m3e-base"# 第一步:加载文档loader = UnstructuredFileLoader("衣服属性.txt")# 将文本转成 Document 对象data = loader.load()print(f'documents:{len(data)}')# 第二部:切分文本text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=0)# 切割加载的 documentsplit_docs = text_splitter.split_documents(data)# print("split_docs size:",len(split_docs))# print(split_docs)# 第三步:初始化 hugginFace 的 embeddings 对象embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)# 第四步:将 document通过embeddings对象计算得到向量信息并永久存入FAISS向量数据库,用于后续匹配查询db = FAISS.from_documents(split_docs, embeddings)db.save_local("./faiss/product")return split_docsresult = main()
print(result)

在这里插入图片描述

5.3 实现QA本地知识库问答

  • 代码路径:/Users/ligang/PycharmProjects/llm/langchain_apply/Knowledge_QA/main.py
  • 代码实现
# coding:utf-8
# 导入必备的工具包
from langchain import PromptTemplate
from get_vector import *
from model import ChatGLM2
# 加载FAISS向量库
EMBEDDING_MODEL = "moka-ai/m3e-base"
embeddings = HuggingFaceEmbeddings(model_name=EMBEDDING_MODEL)
db = FAISS.load_local("faiss/product",embeddings)def get_related_content(related_docs):related_content = []for doc in related_docs:related_content.append(doc.page_content.replace("\n\n", "\n"))return "\n".join(related_content)def define_prompt():question = '我身高170,体重140斤,买多大尺码'docs = db.similarity_search(question, k=1)related_content = get_related_content(docs)PROMPT_TEMPLATE = """基于以下已知信息,简洁和专业的来回答用户的问题。不允许在答案中添加编造成分。已知内容:{context}问题:{question}"""prompt = PromptTemplate(input_variables=["context", "question"],template=PROMPT_TEMPLATE,)my_pmt = prompt.format(context=related_content,question=question)return my_pmtdef qa():llm = ChatGLM2()llm.load_model("/Users/**/PycharmProjects/llm/ChatGLM-6B/THUDM/chatglm-6b")my_pmt = define_prompt()result = llm(my_pmt)return resultif __name__ == '__main__':result = qa()print(result)

小结

主要介绍了基于LangChain+ChatGLM-6B模型实现本地知识库的问答实现原理+过程。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python进阶-部署Flask项目(以TensorFlow图像识别项目WSGI方式启动为例)

本文详细介绍了如何通过WSGI方式部署一个基于TensorFlow图像识别的Flask项目。首先简要介绍了Flask框架的基本概念及其特点,其次详细阐述了Flask项目的部署流程,涵盖了服务器环境配置、Flask应用的创建与测试、WSGI服务器的安装与配置等内容。本文旨在帮…

JAVA-LeetCode 热题 100 第56.合并区间

思路&#xff1a; class Solution {public int[][] merge(int[][] intervals) {if(intervals.length < 1) return intervals;List<int[]> res new ArrayList<>();Arrays.sort(intervals, (o1,o2) -> o1[0] - o2[0]);for(int[] interval : intervals){if(res…

【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?

问题&#xff1a; 波特率9600&#xff0c;发送 01 03 00 00 00 04 44 09 (8字节) 需要多少时间&#xff0c;如何计算&#xff1f; 在计算发送数据的时间时&#xff0c;首先要考虑波特率以及每个字符的数据格式。对于波特率9600和标准的UART数据格式&#xff08;1个起始位&…

AIRNet模型使用与代码分析(All-In-One Image Restoration Network)

AIRNet提出了一种较为简易的pipeline&#xff0c;以单一网络结构应对多种任务需求&#xff08;不同类型&#xff0c;不同程度&#xff09;。但在效果上看&#xff0c;ALL-In-One是不如One-By-One的&#xff0c;且本文方法的亮点是batch内选择patch进行对比学习。在与sota对比上…

JAVA-学习-2

一、类 1、类的定义 把相似的对象划分了一个类。 类指的就是一种模板&#xff0c;定义了一种特定类型的所有对象的属性和行为 在一个.java的问题件中&#xff0c;可以有多个class&#xff0c;但是智能有一个class是用public的class。被声明的public的class&#xff0c;必须和文…

Pytorch 实现目标检测一(Pytorch 23)

一 目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别。然而&#xff0c;很多时候图像里有多个我们感兴趣的目标&#xff0c;我们不仅想知 道它们的类别&#xff0c;还想得到它们在图像中的具体位置。在…

【前端】响应式布局笔记——自适应布局

自适应布局 自适应布局是不同设备对应不同的html(局部自适应)&#xff0c;通过判断设备的类型或控制局部的变化。 1、获取设备是移动端还是pc端 // 获取设备的信息let userAgent navigator.userAgent.toLowerCase();// 使用正则表达式来判断类型let device /ipad|iphone|m…

数据并非都是正态分布:三种常见的统计分布及其应用

你有没有过这样的经历&#xff1f;使用一款减肥app&#xff0c;通过它的图表来监控自己的体重变化&#xff0c;并预测何时能达到理想体重。这款app预测我需要八年时间才能恢复到大学时的体重&#xff0c;这种不切实际的预测是因为应用使用了简单的线性模型来进行体重预测。这个…

服务部署:.NET项目使用Docker构建镜像与部署

前提条件 安装Docker&#xff1a;确保你的Linux系统上已经安装了Docker。如果没有&#xff0c;请参考官方文档进行安装。 步骤一&#xff1a;准备项目文件 将你的.NET项目从Windows系统复制到Linux系统。你可以使用Git、SCP等工具来完成这个操作。如何是使用virtualbox虚拟电…

国产操作系统上给virtualbox中win7虚拟机安装增强工具 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上给virtualbox中win7虚拟机安装增强工具 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在国产操作系统上给win7虚拟机安装virtualbox增强工具的文章。VirtualBox增强工具&#xff08;Guest Additions&a…

Liunx环境下redis主从集群搭建(保姆级教学)02

Redis在linux下的主从集群配置 本次演示使用三个节点实例一个主节点&#xff0c;两个从节点&#xff1a;7000端口&#xff08;主&#xff09;&#xff0c;7001端口&#xff08;从&#xff09;&#xff0c;7002端口&#xff08;从&#xff09;&#xff1b; 主节点负责写数据&a…

Rust-02-变量与可变性

在Rust中&#xff0c;变量和可变性是两个重要的概念。 变量&#xff1a;变量是用于存储数据的标识符。在Rust中&#xff0c;变量需要声明其类型&#xff0c;例如&#xff1a; let x: i32 5; // 声明一个名为x的变量&#xff0c;类型为i32&#xff08;整数&#xff09;&#…

安装MySQL Sample Database

本文安装的示例数据库为官方的Employees Sample Database。 操作过程参考其安装部分。 在安装前&#xff0c;MySQL已安装完成&#xff0c;环境为Linux。 克隆github项目&#xff1a; $ git clone https://github.com/datacharmer/test_db.git Cloning into test_db... remo…

【西瓜书】6.支持向量机

目录&#xff1a; 1.分类问题SVM 1.1.线性可分 1.2.非线性可分——核函数 2.回归问题SVR 3.软间隔——松弛变量 3.1.分类问题&#xff1a;0/1损失函数、hinge损失、指数损失、对率损失 3.2.回归问题&#xff1a;不敏感损失函数、平方 4.正则化

计算机组成原理之指令格式

1、指令的定义 零地址指令&#xff1a; 1、不需要操作数&#xff0c;如空操作、停机、关中断等指令。 2、堆栈计算机&#xff0c;两个操作数隐藏在栈顶和此栈顶&#xff0c;取两个操作数&#xff0c;并运算的结果后重新压回栈顶。 一地址指令&#xff1a; 二、三地址指令 四…

配置免密登录秘钥报错

移除秘钥&#xff0c;执行 ssh-keygen -R cdh2即可 参考&#xff1a;ECDSA主机密钥已更改,您已请求严格检查。 - 简书

Python爬虫入门与登录验证自动化思路

1、pytyon爬虫 1.1、爬虫简介 Python爬虫是使用Python编写的程序&#xff0c;可以自动访问网页并提取其中的信息。爬虫可以模拟浏览器的行为&#xff0c;自动点击链接、填写表单、进行登录等操作&#xff0c;从而获取网页中的数据。 使用Python编写爬虫的好处是&#xff0c;…

【数据结构】十二、八种常用的排序算法讲解及代码分享

目录 一、插入排序 1)算法思想 2&#xff09;代码 二、希尔排序 1&#xff09;算法思想 2&#xff09;代码 三、选择排序 1&#xff09;算法思想 2&#xff09;代码 四、堆排序 1&#xff09;什么是最大堆 2&#xff09;如何创建最大堆 3&#xff09;算法思想 4&a…

C# Excel操作类EPPlus

摘要 EPPlus 是一个流行的用于操作 Excel 文件的开源库&#xff0c;适用于 C# 和 .NET 环境。它提供了丰富的功能&#xff0c;能够轻松地读取、写入和格式化 Excel 文件&#xff0c;使得在 C# 中进行 Excel 文件处理变得更加简单和高效。EPPlus 不需要安装 Microsoft Office 或…

知乎网站只让知乎用户看文章,普通人看不了

知乎默认不显示全部文章&#xff0c;需要点击展开阅读全文 然而点击后却要登录&#xff0c;这意味着普通人看不了博主写的文章&#xff0c;只有成为知乎用户才有权力查看文章。我想这不是知乎创作者希望的情况&#xff0c;他们写文章肯定是希望所有人都能看到。 这个网站篡改…