目录
1. 项目概述
本项目借助Nvidia NIM 平台实现RAG智能对话机器人,以及智能图表分析机器人。
2. 技术方案与实施步骤
2.1 模型选择
实现RAG智能对话机器人,选择了“mistralai/mixtral-8x7b-instruct-v0.1”模型。mixtral-8x7b,属于Mixtral AI 公司发布的中等模型,对于实现RAG的功能,在推理速度和准确度上,有比较好的综合表现。
对于RAG,需要对文档进行向量化处理,并进行存储,使用的向量化模型为NIM 中提供的ai-embed-qa-4。
对向量化数据进行存储,则需要用到向量化数据库。主流的向量数据库比较如下。
在此我们选择开源的FAISS数据库。
2.2. 数据的构建
数据库构建过程如下。
我们获取的信息为网页信息,首先我们需要将网页信息加载,并进行预处理,如删除脚本和样式标签,只保留纯文本。
然后将其分块。分块的大小应适中,太大会导致大量内存的占用,太小会导致由于过于碎片化,而降低推理精度。
分块完成后,利用Nvidia NIM提供的向量化模型,将数据向量化,并进行存储。
2.3 功能整合
Agent智能体,一个整合了IO,存储,推理等功能的结合体,如下图所示。我们可以首先构建智能体的各个部件,然后利用langchain将各个部件连接起来。
项目中,使用两个Agent,整合功能结构如下:
3. 实施步骤
3.1 环境搭建
环境搭建首先参考
2024 NVIDIA开发者社区夏令营环境配置指南(Win & Mac)_csdn 2024nvidia开发者-CSDN博客
此外,因为我们要构建UI界面,故还需安装gradio。打开Anaconda Prompt(如下所示)。
进入工作环境,并利用pip安装gradio,即
pip install gradio
同时,我们要处理PDF文档,还需安装PyMuPDF,即
pip install PyMuPDF
然后我们需要进入NVIDIA NIM | phi-3-vision-128k-instruct, 点击Get API Key按钮,生成API Key,如下图所示。
将获取的key 放置于下图所示位置
3.2 代码实现
首先加载模型,然后构建IO链
我们还可以使用其他NIM中提供的LLM模型和embedding模型进行测试,部分可用的模型如下
Embeddings
[Model(id='nvidia/embed-qa-4', model_type='embedding'),
Model(id='nvidia/nv-embed-v1', model_type='embedding'),
Model(id='nvidia/nv-embedqa-e5-v5', model_type='embedding'),
Model(id='nvidia/nv-embedqa-mistral-7b-v2', model_type='embedding'),
Model(id='snowflake/arctic-embed-l', model_type='embedding')]
大模型
[Model(id='01-ai/yi-large', model_type=None),
Model(id='adept/fuyu-8b', model_type=None),
Model(id='aisingapore/sea-lion-7b-instruct', model_type=None),
Model(id='baai/bge-m3', model_type=None),
Model(id='baichuan-inc/baichuan2-13b-chat', model_type=None),
Model(id='bigcode/starcoder2-15b', model_type=None),
Model(id='bigcode/starcoder2-7b', model_type=None),
Model(id='deepseek-ai/deepseek-coder-6.7b-instruct', model_type=None),
Model(id='google/codegemma-1.1-7b', model_type=None),
......
]
多模态机器人,我们将文字和图片文档结合,进行处理,主要构建代码如下。
3.3 测试与调优
对比使用RAG与不使用RAG,来比较测试效果。我们可以以Nvidia nemo为例,在不加载RAG时,结果如下。从结果可知,大模型并没有给出正确的答案。
在加载RAG后,结果如下,从结果可知,大模型给出了正确的答案。
对于多模态机器人,我们对中间过程进行测试。
查看图片
利用Microsoft Phi 3 vision 大模型获取图片描述
我们也可以使用大模型来生产代码
我们可以使用大模型对表格进行修改,如将”UK”替换为”United Kingdom”,”Netherlander” 替换为”Holland”
同样,我们可以执行大模型生成的Python代码,生成图片
3.4 集成与部署
我们需要将上述中的模块以智能体的方式进行集成,如下所示:
在部署时,我们需要构建前端UI界面。Gradio提供了一个非常方便的构建功能,如下所示。
为了增强智能机器人灵活性,我们可以开放RAG资源输入,代码如下。
测试效果如下
对于多模态机器人,集成Agent后代码如下。
集成UI代码界面如下:
对智能体进行测试结果如下
输入PNG文件
输入PDF文件
4. 项目成果与展示
4.1 应用场景展示
我们可以使用上述方法,利用我们所拥有的知识库,构建一个智能助手,客服机器人,AI助教,面试机器人,等等功能。
4.2 功能演示
如下图所示,构建一个关于Pytorch的帮助助手。
Tell me about Pytorch
为了使智能助手更加灵活,增加RAG资源输入,形成一个通用AI助手,如下所示
多模态的实现效果如下
5. 问题与解决方案
5.1 问题分析
项目过程中,遇到的几个问题,一方面来自于环境搭建,另一方面来自于对于代码的理解,还有就是大模型的幻觉问题。
一是,搭建项目环境时,由于网络原因,经常会超时,或者由于软件包之间的兼容问题,从而导致各种各样的问题。
二是,对于代码的理解和使用了解的不够深入,导致使用时发生错误。
三是,对于使用的数据的数据预处理不当,导致进行向量编码时,发生错误
四是,对于大模型的使用不当,导致未能获得期待的结果
5.2 解决措施
对于前两个问题,解决方案,一是查询使用手册,二是询问老师或同学。
具体来说,有几点需要注意:
在搭建环境时,pip 和conda不宜混用
在搭建环境时,如果遇到安装超时,可以考虑换源
在运行代码时,如果遇到错误,应仔细查看报错信息,找到错误的根源,然后寻找解决方案
询问老师或其他同学时,需要尽量把遇到的错误描述清楚,如在什么环境下,进行了什么操作,或者运行了什么,导致了错误。
对于后两个问题,则需要充分了解所使用的LLM模型,向量化模型和数据库的能力,针对模型和数据库的能力,对数据进行相应的处理,可以考虑换用模型,或者对数据进行进一步处理
例如,在RAG智能机器人项目中,当前的数据处理方式,对于文本较多的网页比较适合,如果有较多图片的,则处理能力较弱。同时,网页要求为开源资源,如果是要求登录的,则无法进行处理。
在多模态机器人中,所选的模型,可以识别比较简单的PDF型图片表格,但是对于复杂的PDF型图片表格,则识别能力较弱。
6. 项目总结与展望
6.1 项目评估
本项目完成了RAG智能机器人和多模态机器人两个项目,使用智能体Agent和Gradio构建了UI界面,完成了基本功能,如对话,检索增强,
由于时间有限,本项目仍然有可以优化的地方。
RAG智能机器人,目前只传入了固定的RAG资源,灵活性不足。
多模态机器人,对于复杂的PDF文档识别能力有待提高。
6.2 未来方向
RAG智能机器人,继续灵活性和可重用性,比如传入PDF文件。
多模态机器人,提高对复杂的PDF文档识别能力。
多模态机器人,增加其他模态的输入和输出,如语音,视频等等。
7. 附件与参考资料
7.1 附件
Jupyterlab文件
task1.ipynb
task1_update.ipynb (RAG输入增强功能)
task2.ipynb
economic-assistance-chart.pdf
economic-assistance-chart.png
7.2 参考资料
Nvidia官方培训网站