基于 LangChain + GLM搭建知识本地库

一种利用 langchain 思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。

受GanymedeNil的项目document.ai和AlexZhangji创建的ChatGLM-6B Pull Request启发,建立了全流程可使用开源模型实现的本地知识库问答应用。现已支持使用ChatGLM-6B等大语言模型直接接入,或通过fastchat api形式接入Vicuna, Alpaca, LLaMA, Koala, RWKV等模型。

今天分享中Embedding默认选用的是GanymedeNil/text2vec-large-chinese,LLM默认选用的是ChatGLM-6B。依托上述模型,本项目可实现全部使用开源模型离线私有部署。

实现原理如下图所示,过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k个 -> 匹配出的文本作为上下文和问题一起添加到prompt中 -> 提交给LLM生成回答。

图片

从文档处理角度来看,实现流程如下:

图片

本项目未涉及微调、训练过程,但可利用微调或训练对本项目效果进行优化。核心部分代码为:

 执行初始化    
init_cfg(LLM_MODEL, EMBEDDING_MODEL, LLM_HISTORY_LEN)    
# 使用 ChatGLM 的 readme 进行测试    
vector_store = init_knowledge_vector_store("/home/mw/project/test_chatglm_readme.md")

中vector_store的初始化可以传递 txt、docx、md 格式文件,或者包含md文件的目录。更多知识库加载方式可以参考langchain文档,通过修改 init_knowledge_vector_store 方法进行兼容。

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

建了技术交流群&星球!想要本文源码、进交流群的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司,即可。然后就可以拉你进群了。

方式①、添加微信号:mlc2060,备注:技术交流
方式②、微信搜索公众号:机器学习社区,后台回复:技术交流

在这里插入图片描述

在这里插入图片描述

硬件需求

  • ChatGLM-6B 模型硬件需求

注:如未将模型下载至本地,请执行前检查$HOME/.cache/huggingface/文件夹剩余空间,模型文件下载至本地需要15GB存储空间。

图片

  • MOSS 模型硬件需求

注:如未将模型下载至本地,请执行前检查$HOME/.cache/huggingface/文件夹剩余空间,模型文件下载至本地需要70GB存储空间

图片

  • Embedding 模型硬件需求

    本项目中默认选用的Embedding 模型GanymedeNil/text2vec-large-chinese约占用显存3GB,也可修改为在CPU中运行。

Docker 部署

为了能让容器使用主机GPU资源,需要在主机上安装 NVIDIA Container Toolkit。具体安装步骤如下:

sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit-base
sudo systemctl daemon-reload 
sudo systemctl restart docker

安装完成后,可以使用以下命令编译镜像和启动容器:

docker build -f Dockerfile-cuda -t chatglm-cuda:latest .
docker run --gpus all -d --name chatglm -p 7860:7860  chatglm-cuda:latest#若要使用离线模型,请配置好模型路径,然后此repo挂载到Container
docker run --gpus all -d --name chatglm -p 7860:7860 -v ~/github/langchain-ChatGLM:/chatGLM  chatglm-cuda:latest

开发部署

软件需求

本项目已在 Python 3.8.1 - 3.10,CUDA 11.7 环境下完成测试。已在 Windows、ARM 架构的 macOS、Linux 系统中完成测试。

vue前端需要node18环境

从本地加载模型

请参考 THUDM/ChatGLM-6B#从本地加载模型

1. 安装环境

环境检查

# 首先,确信你的机器安装了 Python 3.8 及以上版本
$ python --version
Python 3.8.13# 如果低于这个版本,可使用conda安装环境
$ conda create -p /your_path/env_name python=3.8# 激活环境
$ source activate /your_path/env_name
$ pip3 install --upgrade pip# 关闭环境
$ source deactivate /your_path/env_name# 删除环境
$ conda env remove -p  /your_path/env_name

项目依赖

# 拉取仓库
$ git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git# 进入目录
$ cd langchain-ChatGLM# 项目中 pdf 加载由先前的 detectron2 替换为使用 paddleocr,如果之前有安装过 detectron2 需要先完成卸载避免引发 tools 冲突
$ pip uninstall detectron2# 检查paddleocr依赖,linux环境下paddleocr依赖libX11,libXext
$ yum install libX11
$ yum install libXext# 安装依赖
$ pip install -r requirements.txt# 验证paddleocr是否成功,首次运行会下载约18M模型到~/.paddleocr
$ python loader/image_loader.py

2. 设置模型默认参数

在开始执行 Web UI 或命令行交互前,请先检查 configs/model_config.py 中的各项模型参数设计是否符合需求。

如需通过 fastchat 以 api 形式调用 llm,请参考 fastchat 调用实现

3. 执行脚本体验 Web UI 或命令行交互

注:鉴于环境部署过程中可能遇到问题,建议首先测试命令行脚本。建议命令行脚本测试可正常运行后再运行 Web UI。

执行 cli_demo.py 脚本体验命令行交互:

$ python cli_demo.py

或执行 webui.py 脚本体验 Web 交互

$ python webui.py

或执行 api.py 利用 fastapi 部署 API

$ python api.py

或成功部署 API 后,执行以下脚本体验基于 VUE 的前端页面

$ cd views $ pnpm i$ npm run dev
VUE 前端界面如下图所示:
  • 对话界面

图片

  • 知识问答界面

图片

  • bing搜索界面

图片

WebUI 界面如下图所示:

  • 对话Tab界面

图片

  • 知识库测试Beta Tab界面

图片

  • 模型配置Tab界面

图片

Web UI 可以实现如下功能:

  1. 运行前自动读取configs/model_config.py中LLM及Embedding模型枚举及默认模型设置运行模型,如需重新加载模型,可在 模型配置 Tab 重新选择后点击 重新加载模型 进行模型加载;

  2. 可手动调节保留对话历史长度、匹配知识库文段数量,可根据显存大小自行调节;

  3. 对话 Tab 具备模式选择功能,可选择 LLM对话 与 知识库问答 模式进行对话,支持流式对话;

  4. 添加 配置知识库 功能,支持选择已有知识库或新建知识库,并可向知识库中新增上传文件/文件夹,使用文件上传组件选择好文件后点击 上传文件并加载知识库,会将所选上传文档数据加载至知识库中,并基于更新后知识库进行问答;

  5. 新增 知识库测试 Beta Tab,可用于测试不同文本切分方法与检索相关度阈值设置,暂不支持将测试参数作为 对话 Tab 设置参数。

  6. 后续版本中将会增加对知识库的修改或删除,及知识库中已导入文件的查看。

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

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

相关文章

网络安全-真实ip获取伪造与隐藏挖掘

目录 真实ip获取应用层网络层网络连接TOAproxy protocol ip伪造应用层网络层TOA攻击proxy protocol 隐藏代理 挖掘代理多地ping历史DNS解析记录国外主机解析域名网站RSS订阅网络空间搜索引擎 总结参考 本篇文章学习一下如何服务如何获取真实ip,隐藏自己的ip&#xf…

【AI】人类视觉感知特性与深度学习模型(1/2)

目录 一、关于人类视觉感知 1.1 视觉关注 1.自上而下(Top-down)的视觉关注 ​编辑 2.自下而上(Bottom-up)的视觉关注 3.区别和记忆点 1.2 视觉掩盖 1.常见的视觉掩盖效应 2.恰可识别失真(Just Noticeable Dif…

DsPdf:GcPdf 7.0 for NET Crack

DsPdf:GcPdf 7.0 用于全面文档控制的功能丰富的 C# .NET PDF API 库 PDF 文档解决方案(DsPdf,以前称为 GcPdf)可让您快速、高效地生成文档,且无需依赖任何内存。 在 C# .NET 中生成、加载、编辑和保存 PDF 文档 支持多种语言的全…

QGIS003:【08选择工具栏】-按范围选择、按属性选择、按位置选择

摘要:QGIS工程工具栏包括按范围选择、按属性选择、按位置选择、取消选择等选项,本文介绍各选项的基本操作。 实验数据: 链接:https://pan.baidu.com/s/15GfuR15CxA2OQzURjmjwaQ?pwd=u8sf 提取码:u8sf 一、按范围选择 有矩形框选、多边形选择、手绘选择以及按半径扩展…

Java学习,一文掌握Java之SpringBoot框架学习文集(1)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

Django Rest Framework(DRF)框架搭建步骤,包含部分错误解决

一、初步搭建项目 1.使用PyCharm 2021创建Djiango项目,配置如下(假设应用名叫djiango_python) Python (3.6, 3.7, 3.8, 3.9, 3.10, 3.11)> 当前版本 3.8.6Django &a…

自动驾驶学习笔记(二十四)——车辆控制开发

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 控制算法 控制标定 控制协议…

【数据结构】详细剖析线性表

顺序表与链表的比较 导言一、线性表二、线性表的存储结构三、顺序表和链表的相同点四、顺序表与链表之间的差异五、存储结构的选择六、静态顺序表的基本操作七、无头结点单链表的基本操作结语 导言 大家好,很高兴又和大家见面啦!!&#xff0…

普中STM32-PZ6806L 使用FlyMcu串口烧录程序

简介 我的串口下载电路坏掉了, 所以研究了下如何通过USB转TTL进行程序的下载, 为后续Bootloader部分做准备;连接 我的板几乎是十年前买的, 所以电路与现有网上的资料有些差异, 所以仅供参考 USB 转 TTL线 与开发板 连接, 如图图中 ①, 需要去掉第一个…

Android14新特性 开启前台service服务

1. Android14新特性 1.1. 场景 在Android14(targetSDK34)系统手机开启前台service服务崩溃 ATAL EXCEPTION: mainProcess: com.inspur.lbrd, PID: 15634java.lang.RuntimeException: Unable to create service com.inspur.lbrd.service.KeepAliveServi…

软件工程PPT 笔记摘录(2)

分析软件需求 UML 提供了用例图来分析和描述用例视角的软件需求模型 UML 提供了交互图和状态图来描述行为视角的软件需求模型 UML 提供了类图来描述和分析业务领域的概念模型 顺序图:强调消息传递的时间序 通信图:突出对象间的合作 类图&#xff0…

使用docker build构建image

文章目录 环境步骤准备例1:基本用法例2:缓存layer例3:Multi-stage例4:Mountcache mountbind mount 例5:参数例6:Export文件例7:测试 参考 环境 RHEL 9.3Docker Community 24.0.7 步骤 在Dock…