chatglm2外挂知识库问答的简单实现

news2024/9/29 9:29:47

一、背景

大语言模型应用未来一定是开发热点,现在一个比较成功的应用是外挂知识库。相比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, model


def 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个不知道哪里推导出来的。

五、总结

实验出来效果比想象中还是要差,我猜测原因主要有两个,一是大模型参数不够,涌现不出来。二是涉及对信息加工的中间过程,越多参与的中间步骤造成的精度损失会成倍放大。目前看起来大模型应用要实现工业化要求,可能还是比想象中要难,这只是一个外挂知识库让大模型做总结的功能而已,但是未来想象空间还是很大的,我也相信如我开篇所说:大语言模型应用未来一定会是开发热点。

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

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

相关文章

OpenLayers入门,OpenLayers使用瓦片加载事件实现瓦片加载进度条,进度条根据瓦片加载数量自动更新进度,加载完毕后隐藏进度条

专栏目录: OpenLayers入门教程汇总目录 前言 本章主要讲解OpenLayers如何使用瓦片加载事件(tileloadstart)、瓦片加载完成事件(tileloadend)以及瓦片加载错误事件(tileloadend)。 并通过OpenLayers使用瓦片加载事件通过实现瓦片加载进度条的案例,实现进度条根据瓦片加…

vue3 vant上传图片

在 Vue 3 中使用 Vant 组件库进行图片上传,您可以使用 Vant 的 ImageUploader 组件。ImageUploader 是 Vant 提供的图片上传组件,可以方便地实现图片上传功能。 以下是一个简单的示例,演示如何在 Vue 3 中使用 Vant 的 ImageUploader 组件进行…

解决Font family [‘sans-serif’] not found问题

序言 以下测试环境都是在 anaconda3 虚拟环境下执行。 激活虚拟环境 conda activate test_python_env 或 source activate test_python_env工具: WinSCP Visual Studio Code 这里笔者使用 WinSCP 工具连接,编辑工具是 Visual Studio Code 一、字体…

【Python数据分析】Python基本数据类型

🎉欢迎来到Python专栏~Python基本数据类型 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:Python学习专栏 文章作者技术和水平有限,如果文中出现错误,希望…

C\C++内存管理

目录 1.C/C内存分布2.C语言中动态内存管理方式3.C中动态内存管理3.1new/delete内置类型3.2new和delete操作自定义类型 4.operator new与operator delete函数4.2重载operator new与operator delete(了解) 5.new和delete的实现原理5.1内置类型5.2 自定义类…

Vue 3:玩一下web前端技术(六)

前言 本章内容为VUE请求后端技术与相关技术讨论。 上一篇文章地址: Vue 3:玩一下web前端技术(五)_Lion King的博客-CSDN博客 下一篇文章地址: (暂无) 一、请求后端技术 1、使用Mock.js模…

【业务功能篇60】Springboot + Spring Security 权限管理 【终篇】

4.4.7 权限校验扩展 4.4.7.1 PreAuthorize注解中的其他方法 hasAuthority:检查调用者是否具有指定的权限; RequestMapping("/hello")PreAuthorize("hasAuthority(system:user:list)")public String hello(){return "hello Sp…

基于BSV的高性能并行CRC硬件电路生成器

01、引 言 循环冗余校验码,即Cyclic Redundancy Check (CRC), 是一种在各种通信系统中广泛应用的检错机制。CRC算法的工作原理和哈希函数类似,具体来说,其对任意长度的数据计算出一段唯一的标识(校验和), 然后根据这个…

#typescript 使用file-saver模块#

场景:前端使用file-saver模块做导出文档的时候,出现两个错误 1:npm run build 提示找不到模块,如图 解决方法: 先卸载,不管是否安装都先要卸载 ,然后安装: npm uninstall file-saver npm…

AD21原理图的高级应用(二)层次原理图设计

(二)层次原理图设计 1.层次原理图概述2.层次化原理图的应用2.1 自上而下的层次化原理图2.2 自下而上的层次化原理图 3.生成层次设计表 对于大规模的电路系统,需要将其按功能分解为若干个电路模块,用户可以单独绘制好各个功能模块,再将它们组合起来继续处…

DevOps-Jenkins

Jenkins Jenkins是一个可扩展的持续集成引擎,是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。 官网 应用场景 场景一 研发人员上传开发好的代码到github代码仓库需要将代码下载nginx服务器部署手动下载再…

数据结构:快速的Redis有哪些慢操作?

redis 为什么要这莫快?一个就是他是基于内存的,另外一个就是他是他的数据结构 说到这儿,你肯定会说:“这个我知道,不就是 String(字符串)、List(列表)、 Hash&#xff08…

【雕爷学编程】MicroPython动手做(13)——掌控板之RGB三色灯2

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

Spring使用注解进行对象装配(DI)

文章目录 一. 什么是对象装配二. 三种注入方式1. 属性注入2. 构造方法注入3. Setter注入 三. 三种注入方式的优缺点四. 综合练习 通过五大类注解可以更便捷的将对象存储到 Spring 中,同样也可以使用注解将已经储存的对象取出来,直接赋值到注解所在类的一…

守护进程——后台服务进程

文章目录 什么是终端进程组会话关系相关函数守护进程创建步骤应用 什么是终端 echo $$:可以查看当前进程的进程号 进程组 会话》进程组》首进程 会话 关系 >:重定向 |:管道 wc -l:查找 &:在后台去运行 SID:会…

小学期笔记——天天酷跑3

画笔的载体是图层 图层的载体是窗体 效果: ------------------- 效果: ---------------------- 实现一个接口可以理解成添加一个能力 接口可以理解为能力的集合 对于abstract(判断:没有方法体),尽量使用…

linux系统上安装kail

1.虚拟机安装 加入kail镜像 kail系统的安装 2.更新kail的源 注释原本的源,加入阿里云的源 #阿里云 #deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib #deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib 参考&…

【计算机网络】11、网桥(bridge)、集线器(hub)、交换机(switch)、路由器(router)、网关(gateway)

文章目录 一、网桥(bridge)二、集线器(hub)三、交换机(switch)四、路由器(router)五、网关(gateway) 对于hub,一个包过来后,直接将包转发到其他口。 对于桥&…

【C++ 程序设计】实战:C++ 变量实践练习题

目录 01. 变量:定义 02. 变量:初始化 03. 变量:参数传递 04. 变量:格式说明符 ① 占位符 “%d” 改为格式说明符 “%llu” ② 占位符 “%d” 改为格式说明符 “%f” 或 “%e” 05. 变量:字节数统计 06. 变量&a…

[containerd] 在Windows上使用IDEA远程调试containerd, ctr, containerd-shim

文章目录 1. containerd安装2. 源码编译3. 验证编译的二进制文件是否含有调试需要的信息3.1. objdump工具验证3.2. file工具验证3.3. dlv工具验证 4. debug 1. containerd安装 [Ubuntu 22.04] 安装containerd 2. 源码编译 主要步骤如下: 1、从github下载containe…