**本文主要论证从零开始搭建爬虫->向量数据库->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以流的形式打印输出出来。
输出结果:
增加腾讯云向量数据库查询功能
输入部分改为:
最终成果: