chatglm2外挂知识库问答的简单实现
一、背景
大语言模型应用未来一定是开发热点,现在一个比较成功的应用是外挂知识库。相比chatgpt这个知识库比较庞大,效果比较好的接口。外挂知识库+大模型的方式可以在不损失太多效果的条件下获得数据安全。
二、原理
现在比较流行的一个方案是langchain+chatglm,这已经算是一个成品了,也可以考虑自己上手捏一下泥巴,langchain学习成本有点高,可以直接利用prompt来完成问问题会简单很多。具体方案我参考了这个文章:大模型外挂(向量)知识库 - 知乎 (zhihu.com) 基本的思路简化成这张图

简单的说就是根据用户问题,从知识库获取与“问题”相关的“文档片段”, 让大模型根据文档片段来回答“问题”。其实这种根据指定内容回答问题的模型也是挺成熟的,至少huggingface上就有很多,只不过那些模型是根据BERT模型+QA数据集微调好的。我们相信chatglm这类大模型理解问题和总结内容的能力一定更强。
这里就涉及到一个如何获取“问题”相关的“文档片段”的过程了,其实可以直接用文本检索方式,但传统的全文检索由于是词的匹配,因此对纯粹的问句效果可能不好。因此现在主流的方式是用向量匹配,就是把“问题”和知识库的文本都转成向量,再用向量的近似搜索获取更为相关的结果。
应用这种方式会很容易想到一个问题,也是上面知乎文章中提到的对称语义检索。即一定会把与“问题”接近的语句作为第一返回,它只是文字表述和问题一样,但并不是问题的答案。例如

也许这不是个问题,因为谁会在知识库里留下大量问句呢?或者你可以通过预处理把问题和大量正文绑定起来就不会匹配出“问题”了。所以使用向量的效果到底比纯粹的全文检索是否更好我也不清楚,毕竟检索效果还和预处理时候文本片段的切割、向量转换、向量最近邻查询效果 有关系。
三、实现
这里我直接使用了text2vec + chromadb简单实现。text2vec负责对文本转为向量, chromadb负责进行向量检索。
text2vec地址在shibing624/text2vec-base-chinese · Hugging Face ,预训练模型不算大
chromadb是一个新出的向量数据库,很多功能不完善,只是为了快速地体验一下向量存储检索功能,🔑 Getting Started | Chroma (trychroma.com)
本来功能是想做成一个独立于大模型服务的服务:

但是还是有点麻烦,最后还是选择直接在chatglm原生的客户端里直接加向量存储和检索的功能。就是直接在内存里完成,也就是下图绿色的部分就行了。

代码就增加三处。1. 知识库读取、转换、存chromadb;2. 问题转换、检索chromadb、获得文本片段;3. prompt改成“问题+文本片段”
#.....
import glob
import chromadb
from text2vec import SentenceModel#.....@st.cache_resource
def get_vectordb():model = SentenceModel('shibing624/text2vec-base-chinese')client = chromadb.Client()texts = []for filename in glob.glob(f"texts/*.txt"):with open(filename, encoding='utf-8') as f:texts.append(f.read())embeddings = model.encode(texts).tolist()collection = client.get_or_create_collection("testname")ids = [f'id{x+1}' for x in range(len(texts))]collection.add(ids=ids, embeddings=embeddings, documents=texts)return collection, modeldef query_related(text:str, model:SentenceModel, coll):embedding = model.encode(text).tolist()result = coll.query( query_embeddings=embedding, n_results=1)['documents']return result[0][0]#.....
collection, t2v = get_vectordb()#...改大max_length
max_length = st.sidebar.slider('max_length', 0, 32768, 32768, step=1
)#.....
if button:input_placeholder.markdown(prompt_text)related_text = query_related(prompt_text, t2v, collection)prompt_text = f"'''\n{related_text}\n''' \n请从上文提取信息并回答:“{prompt_text}”"
代码难度不大,一开始读取text2vec时候就把本地texts目录里的文本读取出来并转为向量。这里我是每一篇文本转一个向量,查询到最近似的也只保留首个文档。 可能按段落分割更好,如果是按段落,那么查询到多个文本片段可以按需要拼接起来。
我把代码开源在gitee上:llm_simple-kb-plugin: chatglm2外挂知识库的简单实现, 这是直接在web_demo2.py上修改的 (gitee.com)
四、结果
问个问题:“向量数据库是什么?” ,原版chatglm2的回答:

很显然是这些年与数据库信息相关内容的总结。
这是增加了相关文章以后的效果:

感觉chatglm2-6B的总结能力还是有点弱,我的文章列了12个向量数据库,这里并没有提取完,虽然它只会给10条,但是前3个不知道哪里推导出来的。
五、总结
实验出来效果比想象中还是要差,我猜测原因主要有两个,一是大模型参数不够,涌现不出来。二是涉及对信息加工的中间过程,越多参与的中间步骤造成的精度损失会成倍放大。目前看起来大模型应用要实现工业化要求,可能还是比想象中要难,这只是一个外挂知识库让大模型做总结的功能而已,但是未来想象空间还是很大的,我也相信如我开篇所说:大语言模型应用未来一定会是开发热点。
相关文章:
chatglm2外挂知识库问答的简单实现
一、背景 大语言模型应用未来一定是开发热点,现在一个比较成功的应用是外挂知识库。相比chatgpt这个知识库比较庞大,效果比较好的接口。外挂知识库大模型的方式可以在不损失太多效果的条件下获得数据安全。 二、原理 现在比较流行的一个方案是langcha…...
从0到1开发go-tcp框架【1-搭建server、封装连接与业务绑定、实现基础Router、抽取全局配置文件】
从0到1开发go-tcp框架【1-搭建server、封装连接与业务绑定、实现基础Router】 本期主要完成对Server的搭建、封装连接与业务绑定、实现基础Router(处理业务的部分)、抽取框架的全局配置文件 从配置文件中读取数据(服务器监听端口、监听IP等&a…...
建设银行秋招指南,备考技巧和考试内容详解
建设银行秋招简介 银行作为非常吃香的岗位,每年都有不少同学通过投递简历,进入笔试,再到面试成功,成功到银行就职,也有相当一部分同学因为信息差,符合条件却没有报名。无法进入银行工作。 建设银行的秋招…...
Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR
系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能。但是通过对 Cilium 不同模式的切换/功能的启用,可以进一步提升 Cilium 的网络性能。具体调优项包括不限于: 启用本地路由 (Native Rou…...
React的hooks---useReducer
useReducer 作为 useState 的代替方案,在某些场景下使用更加适合,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。 使用 useReducer 还能给那些会触发深更新的组件做性能优化,因为父组件可以向自…...
自然语言处理从入门到应用——LangChain:模型(Models)-[文本嵌入模型Ⅱ]
分类目录:《自然语言处理从入门到应用》总目录 本文将介绍如何在LangChain中使用Embedding类。Embedding类是一种与嵌入交互的类。有很多嵌入提供商,如:OpenAI、Cohere、Hugging Face等,这个类旨在为所有这些提供一个标准接口。 …...
Olap BI工具对比
背景 目前公司主要使用数据存储有MySQL、ES、Hive、HBase、TiDB等 MySQL用于存储应用的基本支撑数据,数据量少;ES和Hbase用于存储和查询调用记录,数据量多;Hive和TiDB用于DC上使用,数据量多。主要使用的数据分析平台…...
【iOS】Cocoapods的安装以及使用
文章目录 前言一、Cocoapods的作用二、安装Cocoapods三、使用Cocoapods总结 前言 最近笔者在仿写天气预报App时用到了api调用数据,一般的基本数据类型我们用Xcode中自带的框架就可以转换得到。但是在和风天气api中的图标的格式为svg格式。 似乎iOS13之后Xcode中可…...
OpenCvSharp (C# OpenCV) 二维码畸变矫正--基于透视变换(附源码)
导读 本文主要介绍如何使用OpenCvSharp中的透视变换来实现二维码的畸变矫正。 由于CSDN文章中贴二维码会导致显示失败,大家可以直接点下面链接查看图片: C# OpenCV实现二维码畸变矫正--基于透视变换 (详细步骤 + 代码) 实现步骤 讲解实现步骤之前先看下效果(左边是原图,右边…...
下级平台级联视频汇聚融合平台EasyCVR,层级显示不正确的原因排查
视频汇聚平台安防监控EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等…...
Android程序CPU使用大的异常分析
程序出现CPU使用过高的问题,如果能够重现,就比较好办了,可以top命令查看各线程的cpu使用,定位到线程。 以下是问国内某AI的答案 在Android应用中,如果某个应用消耗了大量的CPU资源,可以采取以下方法进行分…...
[数学建模] 0、关于数学建模的一点看法付费专栏食用说明
文章目录 1、前言2、数学建模学习索引2.1、建模知识点 3、实战建模论文索引3.1、国赛真题索引3.1.1、[数学建模] [2001年国赛模拟] 1. 血管的三维重建3.1.2、[数学建模] [2011年B国赛模拟] 2. 交巡警服务平台的设置与调度3.1.3、[数学建模][2012年A国赛模拟] 3. 葡萄酒的评价 3…...
2.oracle数据库自增主键
不同于mysql,oracle主键自增不能在建表时直接设置,其实也很简单 1.建表 CREATE TABLE test(id NUMBER NOT NULL,key1 VARCHAR2(40) NULL,key2 VARCHAR2(40) NULL);2.设置主键 alter table test add constraint test_pk primary key (id);3.新建序列tes…...
算法通关村第二关——链表加法的问题解析
题目类型 链表反转、栈 题目描述 * 题目: * 给你两个非空链表来表示两个非负整数,数字最高位位于链表的开始位置。 * 它们的每个节点都只存储一个数字。将这两个数相加会返回一个新的链表。 * 你可以假设除了数字0外,这两个数字都不会以0开头…...
mapboxGL中楼层与室内地图的结合展示
概述 质量不够,数量来凑,没错,本文就是来凑数的。前面的几篇文章实现了楼栋与楼层单体化的展示、室内地图的展示,本文结合前面的几篇文章,做一个综合的展示效果。 实现效果 实现 1. 数据处理 要实现上图所示的效果…...
使用Anaconda3创建pytorch虚拟环境
一、Conda配置Pytorch环境 1.conda安装Pytorch环境 打开Anaconda Prompt,输入命令行: conda create -n pytorch python3.6 输入y,再回车。 稍等,便完成了Pytorch的环境安装。我们可以利用以下命令激活pytorch环境。 conda…...
QT 常用数据结构整理
目录 QString篇 QString篇 //初始化bool bOk false;QString str "sd";QString strTemp(str);str QString("%1,%2").arg("11").arg("-gg");qDebug()<<str;str.sprintf("%s %d","ni",1);qDebug()<<…...
Fiddler使用教程|渗透测试工具使用方法Fiddler
提示:如有问题可联系我,24小时在线 文章目录 前言一、Fiddler界面介绍二、菜单栏1.菜单Fiddler工具栏介绍Fiddler命令行工具详解 前言 网络渗透测试工具: Fiddler是目前最常用的http抓包工具之一。 Fiddler是功能非常强大,是web…...
网站密码忘记了怎么办?chrome浏览器,谷歌浏览器。
有时候忘记了网站的密码,又不想“忘记密码”去一番折腾。如果你正好用的是 chrome 浏览器。 那么根本就没必要折腾,直接就能看到网站密码。 操作如下 1.在浏览器右上角点击三个小点: 2.点这三个点: 3.选择“显示密码”&#x…...
23款奔驰GLS450加装原厂香氛负离子系统,清香宜人,久闻不腻
奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶,可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出,并且在关闭后能够立刻散去。车内气味不会永久改变,香氛…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
