【腾讯云云上实验室】从零开始搭建爬虫+向量数据库+LLM大模型构建企业私有化知识库

   日期:2024-12-26    作者:ch168 移动:http://oml01z.riyuangf.com/mobile/quote/39048.html

**本文主要论证从零开始搭建爬虫->向量数据库->LLM大模型知识库过程,文章中不依赖任何爬虫、LangChain、Chat GLM等框架,从最原始角度通俗易懂、直观的解读大模型与向量数据库结合过程,给大家提供现阶段热门企业大模型解决方案建设思路和方向。**

目前流行的中文开源大模型非ChatGLM(智普)、baichuan(百川)等莫属。虽然认知能力赶不上ChatGPT 3.5,但是它的开源吸引了广大的AI研究者。

当前LLM存在最大的问题在于:

1、研究成本高,如果搭建一个13B以及以上的模型,全量运行需要24GB以上显存,如果进行量化质量又达不到要求,前期研究就要投入大量成本并且如果有多个LLM项目并行开发就会遇到项目组之间抢资源问题;

2、训练成本高,回报率随机,对于广大进行“炼丹”的“仙人”们都知道,炼丹最大问题在于整理的训练集、训练轮数及各种参数可能导致炼出废丹,并且知识的日益更新,如果要更新知识就要重新训练;

3、胡乱说话(幻想),幻想就是你问一个问题,它有板有眼儿的给你回答,你不是专业人士可能就会被它的回答误导了。LLM的幻想并非真正的幻想,而是由其训练方式和数据源所决定的,LLM通过大量的互联网文本数据进行训练,这些数据包含了各种话题和语境。

以上就是目前LLM模型常见的问题,对于模型的研发者和使用者都是头痛问题。针对企业级AI应用,目前有个大家探索的方案就是向量数据库+LLM大模型结合,解决研究成本、训练及胡乱说话问题,通过知识库中准确的内容弥补数据的不足导幻想。

其原理就是将知识要点存储到向量数据库,在提问时通过分词或大模型对提问内容进行分解,从向量数据库提取出关键内容,然后再将内容喂给LLM模型,从而得到想要的答案,从而实现了AI数据库的可维护性,这个模型可以用于OpenAI API也可以用于LLM私有化模型。

接下来,我们从探索的角度来研究向量数据库+LLM大模型的应用(这里不使用LangChain 东西,因为他们封装很深不适合从原理上研究探索)

本次目标是搭建一个LLM知识问答系统:

1、搭建向量数据库(这里使用 腾讯云向量数据库Tencent Cloud VectorDB);

2、开发知识库采集及存储工具

(1) 编写爬虫工具,实现知识库数据爬取;

(2) 编写数据存储服务

3、开发LLM大模型对话功能,并将向量数据库知识库加入到大模型对话中来;

环境准备:

Python:3.10

LLM:ChatGLM 3

运行环境:Windows11 WSL2  Ubuntu22.04

开发工具:VsCode

创建一个独立的python虚拟环境,内容存储再venv中

激活venv执行:

确定要爬取的URL地址:

编写Crawling.py爬虫,爬取向量知识库内容

引入依赖包:

引用依赖:

定义相关变量:

获取栏目所及子栏目所有URL地址,这里通过textarea的J-qcSideNavListData CSS进行定位,并从文本中得到JSON没描述信息。

遍历爬取到的地址信息,来获取指定页面正文内容,这里对正文中的html标签需要去除,不然会有大量干扰内容:

至此,知识库动态获取部分完成,比较简单吧!

3.3.1创建腾讯云向量数据库

腾讯云向量数据库目前低配置可免费使用,只需要在控制台搜索:向量数据库

选择一个你所在最近地域,点击新建创建一个

创建一个免费的

进入实例,开启外网访问:

设置允许访问的IP地址,如果只是测试用那就写0.0.0.0/0,这样所有ip都能访问,也省得多IP网络去研究自己到底哪个外网IP要进白名单

得到外网IP:

获取密钥:

得到这些信息了就可以将信息写入到代码中了。

另外如果你想要查询录入的数据或者创建库和集合也可以点DMC登录到管理端进行查看:

登录DMC

查询数据

3.3.2开发向量存储

开始前需要注意:

1.【重要的事】向量对应的文本字段不要建立索引,会浪费较大的内存,并且没有任何作用。 2.【必须的索引】:主键id、向量字段vector这两个字段目前是固定且必须的,参考下面的例子; 3.【其他索引】:检索时需作为条件查询的字段,比如要按书籍的作者进行过滤,这个时候author字段就需要建立索引, 否则无法在查询的时候对author字段进行过滤,不需要过滤的字段无需加索引,会浪费内存; 4.向量数据库支持动态Schema,写入数据时可以写入任何字段,无需提前定义,类似MongoDB. 5.例子中创建一个书籍片段的索引,例如书籍片段的信息包括{id,vector,segment,bookName,page}, id为主键需要全局唯一,segment为文本片段,vector为segment的向量,vector字段需要建立向量索引,假如我们在查询的时候要查询指定书籍 名称的内容,这个时候需要对bookName建立索引,其他字段没有条件查询的需要,无需建立索引。 6.创建带Embedding的collection需要保证设置的vector索引的维度和Embedding所用模型生成向量维度一致,模型及维度关系:

创建TencentVDB.py文件

引入依赖包

关闭debug模式

创建一个class TencentVDB类,里面分块解释含义:

初始化链接tcvectordb的客户端,相关信息稍后在main传入

创建数据库和集合,这里也可以去腾讯云DMC中创建:

创建数据库和集合

Embedding可以选择多种

可根据实际情况选择需要使用的模型

以上模型枚举代码位置:venvLibsite-packages cvectordbmodelenum.py

调用爬虫并写入数据到向量数据库

调用:

执行后会输出:

如果提示:

code=1, message=There was an error with the embedding: token rate limit reached 说明采集内容过多,免费账户限流了,需要删除一些已存储的集合。

登录查看数据是否入库:

创建文件 requirements.txt

导入LLM依赖

下载ChatGLM3模型,国内下载地址:

三选一即可,32K主要是支持长文本内容对话,模型比较大十多个G 最好放到固态硬盘上,能降低加载时间

编码ChatGLM聊天对话,这里使用streamlit作为聊天对话UI框架

引入依赖包:

设定模型位置,我这里代码和THUDM目录在同一位置,也可以使用绝对路径指向下载好的模型文件夹

判断当前处理器是否Nvidia显卡,或者是否装了cuda驱动,如果没装请参考我这篇文章:

https://blog.csdn.net/cnor/article/details/129170865

进行cuda安装。

设置标题

获取model,判断使用cuda还是cpu来计算

编写页面左侧一些调节开关以及历史聊天记录内容处理,支持历史内容分析。

获取输入内容,使用model.stream_chat将数据内容发给transformers以流的形式打印输出出来。

输出结果:

增加腾讯云向量数据库查询功能

输入部分改为:

最终成果:


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号