[InternLM训练营第二期笔记]3. “茴香豆“:零代码搭建你的 RAG 智能助理


该系列是上海AI Lab举行的书生 浦语大模型训练营的相关笔记部分。
该笔记是第三节课,学习RAG的基本概念,以及对于开源RAG应用“茴香豆”进行部署。


0. RAG(Retrieval Augmented Generation)是什么

我们知道,chatGPT3是离线的,也就是它只能掌握在训练的时候他掌握的知识,对于之后的知识以及一些特定的领域,它是不知道的,因此就会出现“大模型幻觉”现象,比如让他给出一些参考文献,但是他会胡编乱造,等等。

RAG技术,也就是检索增强生成,就是解决这个问题的,其能够让基础模型实现非参数知识更新,无需训练就可以掌握新领域的知识。

下面的图对以上内容做了总结:

在这里插入图片描述
那么RAG的工作原理是什么呢?

经典的RAG由三部分组成:索引(Indexing),检索(Retrieval)和生成(Generation)。其中,索引负责处理外部知识,即将网页、文档分割成chunk(chunk的意思就是小单元),并通过向量编码储存在数据库中。

检索部分负责接收用户提出的问题,并将问题也编码成向量,并将问题与数据库比对,找到最相关的 k k k个小单元chunk(top-k原则)。

最终,将问题与检索到的若干chunk一起输入到LLM中,获得最终的答案,这一步就是“生成”。

上面的工作原理可以总结成这个图:

在这里插入图片描述

在这个图中,向量数据库Vector-DB需要进一步解释一下。

在向量数据库中,所有的文本等通过其他的预训练模型转换为固定长度的向量(比如通过word embedding方法),然后问题query输入(同样进行编码)后,就根据dot product或者cosine similarity原则确定最相似的几个匹配。

在这里插入图片描述

具体的工作流程如下图:

在这里插入图片描述

  1. 如果我们问大模型,如何评价OpenAI的CEO奥特曼突然离职又加入?那么如果没有RAG的话,模型就会给出“我不知道”的回答,如图左边灰色方框所示。但事实上,能够回答“我不知道”而没有胡编乱造,已经不错了。
  2. 如果有RAG的话,模型会对问题进行编码,然后与向量数据库中的数据进行比对(右上角),这样就找到了最相关的若干个documents,如粉色右下角方框所示
  3. 然后将问题和文本结合,输入到LLM里,就可以得到合适的回答。

目前,RAG通常有三个范式:

  1. Naive RAG:就是前面介绍的,主要技术是问答系统与信息检索
  2. Advanced RAG:增加了前处理与后处理,后处理包括重排序、总结、融合等,使得模型能够适应摘要生成、内容推荐等任务
  3. Modular RAG:模块化,可以根据任务定制,具有多模态功能

在这里插入图片描述
大模型的优化方向有这些:

在这里插入图片描述
RAG和Fine tuning的区别?

在这里插入图片描述
如果我们将对外部知识的需求与模型适配的需求这两个维度做一个图:

在这里插入图片描述
从图中可以看到,提示工程对外部知识需求和模型适配需求都是比较低的,但它不能适应新的知识,以及特定人任务;微调对模型适配需求比较高,但外部知识需求不高,RAG则刚好相反。

这是评估RAG评估的metric和benchmark:

在这里插入图片描述

1. 实践1:在InternLM上进行茴香豆部署

首先新建开发机,由于要用到InternLM-chat-7B模型,因此我们选择30% * A100,cuda环境选择11.7的。

首先运行

studio-conda -o internlm-base -t InternLM2_Huixiangdou

进行环境安装,安装完成后激活:

conda activate InternLM2_Huixiangdou

然后cd到models目录下(之前完成的作业,已经建立过这个文件夹的),对依赖的模型创建软连接:


cd /root/models

ln -s /root/share/new_models/maidalun1020/bce-embedding-base_v1 /root/models/bce-embedding-base_v1
ln -s /root/share/new_models/maidalun1020/bce-reranker-base_v1 /root/models/bce-reranker-base_v1

# 复制大模型参数(下面的模型,根据作业进度和任务进行**选择一个**就行)
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-7b /root/models/internlm2-chat-7b

然后,安装其他的依赖:

pip install protobuf==4.25.3 accelerate==0.28.0 aiohttp==3.9.3 auto-gptq==0.7.1 bcembedding==0.1.3 beautifulsoup4==4.8.2 einops==0.7.0 faiss-gpu==1.7.2 langchain==0.1.14 loguru==0.7.2 lxml_html_clean==0.1.0 openai==1.16.1 openpyxl==3.1.2 pandas==2.2.1 pydantic==2.6.4 pymupdf==1.24.1 python-docx==1.1.0 pytoml==0.1.21 readability-lxml==0.8.1 redis==5.0.3 requests==2.31.0 scikit-learn==1.4.1.post1 sentence_transformers==2.2.2 textract==1.6.5 tiktoken==0.6.0 transformers==4.39.3 transformers_stream_generator==0.0.5 unstructured==0.11.2

随后将茴香豆clone下来:

git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440

之后,要将刚刚下载的模型路径更改到config.ini里,注意,这里我为了路径清晰,把茴香豆下载到/root/models下了,因此和官方命令不同:

# 向量数据库和word embedding模型
sed -i '6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/models/huixiangdou/config.ini

# 重排序模型
sed -i '7s#.*#reranker_model_path = "/root/models/bce-reranker-base_v1"#' /root/models/huixiangdou/config.ini

# LLM
sed -i '29s#.*#local_llm_path = "/root/models/internlm2-chat-7b"#' /root/models/huixiangdou/config.ini

然后vim config.ini查看一下是否修改成功:

在这里插入图片描述

随后,我们需要下载语料库:

cd /root/models/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou

茴香豆的默认word embedding和重排序模型用的是网易的BCE模型。
为了在检索的过程中更加精确的判断提问的相关性,向量库中同时有接受问题列表和拒答问题列表。

现在,我们增加茴香豆相关的问题到接受问题示例中:

mv resource/good_questions.json resource/good_questions_bk.json  # 将原始的进行备份

# 写入新的
echo '[
    "mmpose中怎么调用mmyolo接口",
    "mmpose实现姿态估计后怎么实现行为识别",
    "mmpose执行提取关键点命令不是分为两步吗,一步是目标检测,另一步是关键点提取,我现在目标检测这部分的代码是demo/topdown_demo_with_mmdet.py demo/mmdetection_cfg/faster_rcnn_r50_fpn_coco.py checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth   现在我想把这个mmdet的checkpoints换位yolo的,那么应该怎么操作",
    "在mmdetection中,如何同时加载两个数据集,两个dataloader",
    "如何将mmdetection2.28.2的retinanet配置文件改为单尺度的呢?",
    "1.MMPose_Tutorial.ipynb、inferencer_demo.py、image_demo.py、bottomup_demo.py、body3d_pose_lifter_demo.py这几个文件和topdown_demo_with_mmdet.py的区别是什么,\n2.我如果要使用mmdet是不是就只能使用topdown_demo_with_mmdet.py文件,",
    "mmpose 测试 map 一直是 0 怎么办?",
    "如何使用mmpose检测人体关键点?",
    "我使用的数据集是labelme标注的,我想知道mmpose的数据集都是什么样式的,全都是单目标的数据集标注,还是里边也有多目标然后进行标注",
    "如何生成openmmpose的c++推理脚本",
    "mmpose",
    "mmpose的目标检测阶段调用的模型,一定要是demo文件夹下的文件吗,有没有其他路径下的文件",
    "mmpose可以实现行为识别吗,如果要实现的话应该怎么做",
    "我在mmyolo的v0.6.0 (15/8/2023)更新日志里看到了他新增了支持基于 MMPose 的 YOLOX-Pose,我现在是不是只需要在mmpose/project/yolox-Pose内做出一些设置就可以,换掉demo/mmdetection_cfg/faster_rcnn_r50_fpn_coco.py 改用mmyolo来进行目标检测了",
    "mac m1从源码安装的mmpose是x86_64的",
    "想请教一下mmpose有没有提供可以读取外接摄像头,做3d姿态并达到实时的项目呀?",
    "huixiangdou 是什么?",
    "使用科研仪器需要注意什么?",
    "huixiangdou 是什么?",
    "茴香豆 是什么?",
    "茴香豆 能部署到微信吗?",
    "茴香豆 怎么应用到飞书",
    "茴香豆 能部署到微信群吗?",
    "茴香豆 怎么应用到飞书群",
    "huixiangdou 能部署到微信吗?",
    "huixiangdou 怎么应用到飞书",
    "huixiangdou 能部署到微信群吗?",
    "huixiangdou 怎么应用到飞书群",
    "huixiangdou",
    "茴香豆",
    "茴香豆 有哪些应用场景",
    "huixiangdou 有什么用",
    "huixiangdou 的优势有哪些?",
    "茴香豆 已经应用的场景",
    "huixiangdou 已经应用的场景",
    "huixiangdou 怎么安装",
    "茴香豆 怎么安装",
    "茴香豆 最新版本是什么",
    "茴香豆 支持哪些大模型",
    "茴香豆 支持哪些通讯软件",
    "config.ini 文件怎么配置",
    "remote_llm_model 可以填哪些模型?"
]' > /root/models/huixiangdou/resource/good_questions.json

可以看出来,都是一些比较有价值的问题范例。

再创建一个测试用的问询列表,用来测试拒答流程是否起效:

echo '[
"huixiangdou 是什么?",
"你好,介绍下自己"
]' > ./test_queries.json

随后创建向量数据库:

# 创建向量数据库存储目录
cd /root/models/huixiangdou && mkdir workdir 

# 分别向量化知识语料、接受问题和拒绝问题中后保存到 workdir
python3 -m huixiangdou.service.feature_store --sample ./test_queries.json

耐心等待即可。

其实一开始运行的时候,会报Assertion Error:

在这里插入图片描述
这里我们把retriever.py相应位置的context_max_length改大即可。

在这里插入图片描述

接下来,我们直接运行:

sed -i '74s/.*/    queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/models/huixiangdou/huixiangdou/main.py

python3 -m huixiangdou.main --standalone

针对茴香豆怎么部署到微信群,得到的回答:
在这里插入图片描述
此外,我们可以发现,对不相关的问题今天天气怎么样,模型做出了UNRELATED的判断,并且拒绝回答:
在这里插入图片描述

2. 实践2:体验茴香豆Web版

直接打开网页茴香豆Web,我上传的是一篇论文,格式为pdf:

在这里插入图片描述
问了五个问题,最后一个问题不相关。可以看到效果是非常好的(读论文的效果感觉比ChatGLM好,看来茴香豆有个强大的后端~)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 实践3:进阶作业——将茴香豆通过Web部署到飞书

我的研究方向是多目标跟踪,所以我在Web端直接上传了若干篇中英文综述论文,可以说应该涵盖的非常全了:

在这里插入图片描述
随后设置一些正例和反例:
在这里插入图片描述

在这里插入图片描述

由于微信版本的限制,接下来按照教程(教程)[https://aicarrier.feishu.cn/docx/H1AddcFCioR1DaxJklWcLxTDnEc]部署到飞书。

我创建了名为MOT问答bot,然后在应用能力里面,点添加机器人:

在这里插入图片描述

然后点凭证与基础信息,将app id和secret复制到web端的这里:
在这里插入图片描述

然后,将茴香豆Web端的加密策略,放到事件与回调下的加密策略中:

在这里插入图片描述
之后,将Web端的请求地址,复制到事件与回调下面的请求地址中:
在这里插入图片描述
在这里插入图片描述
然后在这个页面点击添加事件,添加”接收消息“

在这里插入图片描述
然后在权限管理下,开通im:chat:readonly, im:message.group_msg和im:message:send_as_bot三个权限,然后发布版本即可:

在这里插入图片描述
然后直接在飞书中建群,群里只有自己就行,别忘了给群名加后缀:

在这里插入图片描述

运行效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值