Langchain-ChatGLM:基于本地知识库问答

news2024/12/25 1:16:26

文章目录

  • ChatGLM与Langchain简介
    • ChatGLM-6B简介
      • ChatGLM-6B是什么
      • ChatGLM-6B具备的能力
      • ChatGLM-6B具备的应用
    • Langchain简介
      • Langchain是什么
      • Langchain的核心模块
      • Langchain的应用场景
  • ChatGLM与Langchain项目介绍
    • 知识库问答实现步骤
    • ChatGLM与Langchain项目特点
  • 项目主体结构
    • 项目效果优化方向
    • 项目后续开发计划
  • ChatGLM与Langchain项目实战过程
    • 实战(一)
    • 实战(二)

项目地址:https://github.com/imClumsyPanda/langchain-ChatGLM

ChatGLM与Langchain简介

ChatGLM-6B简介

ChatGLM-6B是什么

ChatGLM-6B地址:https://github.com/THUDM/ChatGLM-6B
ChatGLM-6B 是⼀个开源的、⽀持中英双语的
对话语⾔模型,基于 General Language
Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。

ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

更新 v1.1 版本 checkpoint, 训练数据增加英⽂
指令微调数据以平衡中英⽂数据⽐例,解决英
⽂回答中夹杂中⽂词语的现象。

ChatGLM-6B具备的能力

  • 自我认知(可以对自己进行介绍,优点缺点等)
  • 提纲写作(比如:帮我写一个介绍ChatGLM的博客提纲)
  • 文案写作(根据一段话来生成一段文案)
  • 信息抽取(抽取一段文本的人物,时间,地点等实体信息)
  • 角色扮演(指定ChatGLM为一个角色,进行对话)

ChatGLM-6B具备的应用

大语言模型通常基于通识知识进行训练的,而在
⾯向某些领域的具体场景时,常常需要借助模型微调提示
词⼯程
提升语言模型应用效果:
常见的场景如:

  • 垂直领域知识的特定任务(金融领域,法律领域)
  • 基于垂直领域知识库的问答

模型微调与提示词工程的区别:

模型微调:针对预训练好的语言模型,在特定任务的数据集上进行进一步的微调训练,需要有标记好的特定任务的数据。

提示工程:核心是设计自然语言提示或指定,引导模型完成特定任务,适合需要明确输出的任务。

Langchain简介

Langchain是什么

LangChain 是一个用于开发由语言模型驱动的应用程序的框架。他主要拥有 3个能力:

  • 可以调用LLM模型
  • 可以将 LLM 模型与外部数据源进行连接
  • 允许与 LLM 模型进行交互

Langchain的核心模块

Langchain的核心模块如下:

  • Modules:支持的模型类型和集成,如:openai,huggingface等;
  • Prompt:提示词管理、优化和序列化,支持各种自定义模板;
  • Memory:内存管理(在链/代理调用之间持续存在的状态);
  • Indexes:索引管理,方便加载、查询和更新外部数据;
  • Agents:代理,是一个链,可以决定和执行操作,并观察结果,直到指令完成;
  • Callbacks:回调,允许记录和流式传输任何链的中间步骤,方便观察、调试和评估。

Agents代理执行过程如下:
在这里插入图片描述

Langchain的应用场景

  • 文档问答
  • 个人助理
  • 查询表格
  • 与API交互
  • 信息提取
  • 文档总结

ChatGLM与Langchain项目介绍

知识库问答实现步骤

基于Langchain思想实现基于本地知识库的问答应用。实现过程如下:
1、加载文件
2、读取文本
3、文本分割
4、文本向量化
5、问句向量化
6、在文本向量中匹配出与问句向量最相似的top k个
7、匹配出的文本作为上下文和问题一起添加到prompt中
8、提交给LLM生成回答。
在这里插入图片描述
还有另一个版本(本质是一样的)
在这里插入图片描述

ChatGLM与Langchain项目特点

  • 依托 ChatGLM 等开源模型实现, 可离线部署
  • 基于 langchain 实现,可快速实现接入多种数据源
  • 在分句、文档读取等方面,针对中文使用场景优化
  • 支持pdf、 txt、 md、 docx等⽂件类型接⼊,具备命令行demo、 webui 和 vue 前端。

项目主体结构

  • models: llm的接⼝类与实现类,针对开源模型提供流式输出⽀持。
  • loader: 文档加载器的实现类。
  • textsplitter: 文本切分的实现类。
  • chains: 工作链路实现,如 chains/local_doc_qa 实现了基于本地⽂档的问答实现。
  • content:用于存储上传的原始⽂件。
  • vector_store:用于存储向量库⽂件,即本地知识库本体。
  • configs:配置文件存储。

项目效果优化方向

  • 模型微调:一个是对embedding模型的基于垂直领域的数据进行微调;一个是对LLM模型及进行基于垂直领域的微调;
  • 文档加工:一种是使用更好的文档拆分的方式(如项目中已经集成的达摩院的语义识别的模型及进行拆分);一种是改进填充的方式,判断中心句上下文的句子是否和中心句相关,仅添加相关度高的句子;另一种是文本分段后,对每段分别及进行总结,基于总结内容语义及进行匹配;
  • 借助不同模型的能力:在 text2sql、text2cpyher 场景下
    需要产生代码时,可借助不同
    模型能力。

项目后续开发计划

  • 扩充数据源:增加库表、图谱、网页等数据接入;
  • 知识库管理:完善知识库中增删改查功能,并支持更多向量库类型;
  • 扩充文本划分方式:针对中文场景,提供更多文本划分与上下文扩充方式;
  • 探索Agent应用:利用开源LLM探索Agent的实现与应用。
    参考:https://liaokong.gitbook.io/llm-kai-fa-jiao-cheng/

ChatGLM与Langchain项目实战过程

实战(一)

https://github.com/imClumsyPanda/langchain-ChatGLM
由于之前已经对ChatGLM进行过部署,所以考虑可以直接在原有环境中安装新的所需的包即可,同样也可以使用之前下载好的模型文件:ChatGLM部署

但看了下requirements.txt文件后还有不少需要安装的包,索性直接新建一个python3.8.13的环境(模型文件还是可以用的)

conda create -n langchain python==3.8.13

拉取项目

git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git

进入目录

cd langchain-ChatGLM

安装requirements.txt

conda activate langchain
pip install -r requirements.txt

当前环境支持装langchain的最高版本是0.0.166,无法安装0.0.174,就先装下0.0.166试下。
修改配置文件路径:

vi configs/model_config.py

将chatglm-6b的路径设置成自己的。
“chatglm-6b”: {
“name”: “chatglm-6b”,
“pretrained_model_name”: “/data/sim_chatgpt/chatglm-6b”,
“local_model_path”: None,
“provides”: “ChatGLM”

修改要运行的代码文件:webui.py,

vi webui.py

将最后launch函数中的share设置为True,inbrowser设置为True。
执行webui.py文件

python webui.py

在这里插入图片描述
可能是网络问题,无法创建一个公用链接。可以进行云服务器和本地端口的映射,参考:https://www.cnblogs.com/monologuesmw/p/14465117.html
在这里插入图片描述
对应输出:
在这里插入图片描述
占用显存情况:大约15个G
在这里插入图片描述

实战(二)

待更…

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

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

相关文章

php7新特性详细介绍(二)

一、PHP 7 异常 PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。 assert() 配置 | 配置项默认值可选值zend.assertions11 - 生成和执行代码 (开发模式) 0 - 生成代码,但在执…

智警杯excel和sql实训盲点

目录 excel基础操作: excel函数:智警杯赛前学习1.2--excel统计函数_lulu001128的博客-CSDN博客知识点https://blog.csdn.net/lulu001128/article/details/130936259?spm1001.2014.3001.5501 excel报表实战: excel数据透视及绘图&#xff…

Amino框架无锁算法实现并发线程安装组件(一)

Amino是无锁并行框架,线程安装,该框架封装了无锁算法,提供了可用于线程安全的一些数据结构,同时还内置了一些多线程调度模式。使用Amino进行软件开发有以下的优势: 1.对死锁的问题免疫 2.确保系统并发的整体进度 3.降低高并发下无锁竞争带…

java设计模式之:建造者模式

文章目录 建造者模式介绍建造者模式适用场景案例场景一坨坨代码实现重构代码 与工厂模式区别建造者模式优缺点总结 该说不说几乎是程序员都知道或者了解设计模式,但大部分小伙伴写代码总是习惯于一把梭。好的代码不只为了完成现有功能,也会考虑后续扩展。…

springboot自动配置源码解析

概述 使用springboog的时候引入starter就自动为我们加载,例如我们引入 spring-boot-starter-web 之后,就自动引入了 Spring MVC 相关的 jar 包,从而自动配置 Spring MVC 。 自动装配原理 SpringBootApplication SpringBootApplication: Spri…

Java的引用

一、概述 其实java有4种引用,4种可分为强、软、弱、虚。我们将从这四个方面入手进行介绍。 二、强引用 首先看到我们有一个类叫M,在这个类里我重写了一个方法叫finalize(),我们可以看到这个方法是已经被废弃的方法,为什么要重写…

【jupyter】Jupyter Notebook如何导入导出文件

目录 0.系统:windows 1.打开 Jupyter Notebook 2.Jupyter Notebook导入文件 3.Jupyter Notebook导出文件 0.系统:windows 1.打开 Jupyter Notebook 1)下载【Anaconda】后,直接点击【Jupyter Notebook】即可在网页打开 Jupyte…

用户研究干货——这一篇就够啦

一、基本概念: ①工作内容:用户研究的首要目的是帮助企业定义产品目标用户群,明确、细化产品概念,并通过对用户的任务操作特性、知觉特征、认知心理特征的研究,使用户的实际需求成为产品设计的导向,使产品…

建面超72万㎡,南山红花岭旧改规划公示,配套近15万㎡宿舍

近日,深圳市南山区城市更新和土地整备局发布关于桃源街道红花岭工业南区更新单元(暂定名)03-01、02-02地块《建设工程规划许可证》及总平面图的公告。 此次批复的红花岭工业南区02-02、03-01块,总建面超72万㎡,用地单…

nginx+tomcat 负载均衡、动静分离集群

文章目录 一、NginxTomcat负载均衡的组合原因1.1 Nginx实现负载均衡的原理1.2 Nginx实现负载均衡的主要配置项1.3 NginxTomcat负载均衡的组合的优点1.4 NginxTomcat负载均衡的实验设计 二、动静分离部署2.1 部署TOMCAT后端服务器2.2部署nginx服务器2.3安装nginx动态服务器 一、…

java中try-with-resources自动关闭io流

在传统的输入输出流处理中,我们一般使用的结构如下所示,使用try - catch - finally结构捕获相关异常,最后不管是否有异常,我们都将流进行关闭处理: try {//todo } catch (IOException e) {log.error("read xxx f…

《Lua程序设计》--学习1

前言&#xff1a; --> 表示一条语句的输出或表达式求值的结果 -- 单行注释 > 标注 一些代码需要在交互模式下输入 如果需要打印表达式求值的结果&#xff0c;必须在每个表达式前加上一个等号 <--> 表示两者完全等价 语言基础 我们将Lua语言执行的每一…

html选择器

基本选择器 基本选择器 : 标签选择器 , 类选择器 , ID选择器 标签选择器 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEed…

小企业软件项目流程六步法

小企业软件项目流程六步法&#xff0c;很有效 软件项目的沟通成本是巨大的 软件生产是非常特殊的一套流程 没有过程控制&#xff0c;最终一定失控或废弃 趣讲大白话&#xff1a;输入垃圾&#xff0c;输出也是垃圾 【趣讲信息科技188期】 **************************** 软件行业…

九、(补充文章四)Arcgis实现深度学习训练样本数据的批量制作——只靠原图+shp如何批量制作样本图片

之前写了一些个深度学习系列文 其中先是单张样本的制作方法 最后通过构造模型批量处理 大大提高了生成样本的速度 四、Arcgis实现深度学习河流训练样本数据的制作(使用软件批量获取样本图片)——对已经获取到的完整面状样本数据进行处理 但是这个方法不仅仅需要shp和原图 还需要…

在不到200行的HTML代码中,实现老板要求为他的孩子绘制一个童话乐园:七彩彩虹、微笑笑脸和魔法树

文章目录 准备工作1.绘制七彩彩虹2.绘制微笑笑脸3.绘制多变的魔法树 结语 欢迎来到童话乐园&#xff01;这里有一些有趣的绘图功能&#xff0c;让你在代码的世界中感受童话般的乐趣。本篇博文将介绍如何使用代码来绘制七彩彩虹、微笑笑脸和魔法树。让我们一起来探索吧&#xff…

vector 练习

目录 一、创建动态二维数组的方法 0x01 C语言法 0x02 C法 二、 杨辉三角 三、电话号码的数字组合 一、创建动态二维数组的方法 0x01 C语言法 int** p (int**)malloc(sizeof(int*) * M);//创建M行的数组,每一行都是一个数组 for(size_t i 0;i < M;i) {p[i] (int*)mal…

Redis主从集群与哨兵集群

一、Redis 哨兵集群原理 Redis 哨兵集群是一种高可用性的解决方案&#xff0c;用于监控 Redis 实例的状态并在实例出现故障时自动进行故障转移。 Redis 哨兵集群由多个哨兵实例组成&#xff0c;每个哨兵实例都运行在独立的服务器上。每个哨兵实例都会周期性地向 Redis 实例发…

Linux内存初始化-启动阶段的内存初始化

本文代码基于ARM64平台, Linux kernel 5.15 在加载kernel 之前&#xff0c; kernel对于系统是有一定要求的&#xff0c;明确规定了boot阶段必须要把MMU关闭&#xff1a; arch/arm64/kernel/head.S/** Kernel startup entry point.* ---------------------------** The require…

路径规划算法:基于松鼠优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于松鼠优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于松鼠优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法松鼠…