茴香豆:搭建RAG智能助理 | shmaur

shmaur
2024-06-03
-
-

一、实战目标

使用茴香豆完成 RAG 的部署

 

二、RAG

1、什么是RAG

RAG(Retrieval Augmented Generation)是一种结合了检索和生成的技术,通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追溯的推理过程等。提供更准确的回答、降低推理成本、实现外部记忆。

可以理解成一个搜索引擎,用户输入的是索引

可以应用于:问答系统、文本生成、信息检索、图片描述

其他相关RAG知识,点击查看

 

2、RAG 发展进程

RAG的概念是由MetaLewis等人在2020《Retrieval-Augmented Generation for Knowledge-Intensive NLp Tasks》中提出。

  • Naive  RAG:问答系统、信息检索
  • Advanced RAG:主要是摘要生成、内容推荐,主要对检索前后都进行了增强,在检索之前对用户的问题进行路由扩展和重写能力,对检索的信息进行重新排序,总结融合等处理,提高信息收集和处理效率。
  • Modular RAGModular RAG 范式将 RG 的基础部分和后续各种优化功能,模块化,可根据实际业务需求定制,完成多模态任务对话等更高级应用。

 

3、RAG原理与架构

基础三大部分:索引、检索、生成

RAG overview
图片来源于书生·浦语

RAG 的主要组成,依次是数据提取==>embedding(向量化)==>创建索引==>检索==>自动排序(Rerank)==>LLM归纳生成

1
图片来自网络

 

4、向量数据库

专门存储外部数据的地方,向量数据库主要是将文本及相关数据通过预训练的模型转换为固定长度的向量。

向量数据库是实现快速准确回答的基础。

判断相似度可以通过余弦相似度点乘方式来判断,然后检索的结果根据相似度的得分进行排序

向量数据库的优化:很重要就是向量表示优化

图片来自书生·浦语

5、RAG 常见优化方法

下面都是针对RG模块和流程来进行优化

下面两个是提高向量数据的质量,对RAG进行性能提升优化

嵌入式优化Embedding Optimization):通过结合稀疏解码器密集解锁器以及多任务方式来增强嵌入的性能。

索引优化Indexing Optimization):增强数据粒度,优化索引结构,添加源数据对其优化和混合检索等策略来提升索引质量。

 

查询优化Query Optimization):查询扩展和转换来使用户的原始问题更清晰,更适合索引任务。

上下文管理(Context Curation):通过重排和上下文选择压缩来减少检索的冗余信息,提供大模型的处理效率。

上面两个是Advanced RAG 范式中的前检索和后检索部分,retrieval 检索部分是优化的重点重点。

 

retrieval 检索部分优化

迭代检索Iterative Retrieval):根据检索结果多姿迭代检索知识,给大模型提供全面的知识基础。

递归检索Recursive Retrieval):根据迭代细化搜索查询改进搜索结果的深度和相关性,使用链式推理指导检索过程,根据检索结果细化推理过程。

自定应检索Adaptive Retreval):用flair self-RAG,让大模型能够自主的决定他所要检索的内容,最佳时机等因素。

LLM微调LLM Fine-tuning):也是常用的一种思路,可以根据场景和数据特征进行定向微调,也可以根据大模型对于检索和生成的参与进行有针对性微调。

6、RAG vs 微调 Fine-tuning

图片来自书生·浦语

 

7、RAG评估

经典评估指标:

准确率(Accuracy)

召回率(Recall)

F1 分数(F1 Score)

BLEU 分数(用于机器翻译和文本生成)

ROUGE分数(用于文本生成的评估)

8、RAG测试

评测框架:

基准测试:RGB、RECALL、CURD

评测工具:RAGAS、ARES、TruLens

 

总结 图片来自书生·浦语

 

三、茴香豆

1、茴香豆是做什么的

是一个基于LLMs的领域知识助手,由书生浦语团队开发的开源大模型

专为即时通讯(IM)工具中的群聊场景优化的工作流,提供及时准确的技术支持和自动化问答服务。

通过应思检索增强生成(RAG)技术,茴香豆能够理解和高效准确的回应与特定知识领域相关的复杂查询。

 

2、茴香豆应用场景

智能客服:技术支持、领域知识对话

IM工具中创建用户群组,讨论、解答相关的问题

随着用户数量的增加,答复内容高度重复,充斥大量无意义和闲聊,人工回复,成本高,影响工作效率。

茴香豆通过提供自动化的问答支持帮助维护者减轻负担,同时确保用户问题得到有效解答。

 

3、茴香豆场景难点

群聊中的信息量巨大,且内容多样,从技术讨论到闲聊应有尽有。

用户问题通常与个人紧密相关,需要准确的实时的专业知识解答。

传统的NLP解决方案无法准确解析用户意图且往往无法提供满意的答案。

要一个能够在群聊中准确识别与回答相关问题的智能助手,同时避免造成消息过载

 

4、茴香豆的特点

1、开源免费(免费商用)

2、高效准确(专为群聊优化)

3、领域知识(专业知识快速获取)

4、部署成本低(无需额外训练,可利用云端API,本地算力需求少)

5、安全性(完全本地部署,信息不上传)

6、扩展性强(兼容多种IM软件,支持多种开源LLMs和云端API)

 

5、茴香豆的架构

图片来自书生·浦语

 

6、茴香豆工作流

图片来自书生·浦语

 

7、茴香豆构建步骤

图片来自书生·浦语

 

四、实战茴香豆(作业)

 

从官方环境复制运行 InternLM 的基础环境,命名为 InternLM2_Huixiangdou

studio-conda -o internlm-base -t InternLM2_Huixiangdou 

conda env list  #查看环境

conda activate InternLM2_Huixiangdou  # 激活

下载基础文件

# 创建模型文件夹
cd /root && mkdir models

# 复制BCE模型
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

下载安装茴香豆

# 安装 python 依赖
# pip install -r requirements.txt

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

## 因为 Intern Studio 不支持对系统文件的永久修改,在 Intern Studio 安装部署的同学不建议安装 Word 依赖,后续的操作和作业不会涉及 Word 解析。
## 想要自己尝试解析 Word 文件的同学,uncomment 掉下面这行,安装解析 .doc .docx 必需的依赖
# apt update && apt -y install python-dev python libxml2-dev libxslt1-dev antiword unrtf poppler-utils pstotext tesseract-ocr flac ffmpeg lame libmad0 libsox-fmt-mp3 sox libjpeg-dev swig libpulse-dev

#下载
cd /root
# 克隆代码仓库
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout ded0551

修改配置文件

sed -i '6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/huixiangdou/config.ini   # 修改用于向量数据库和词嵌入的模型
sed -i '7s#.*#reranker_model_path = "/root/models/bce-reranker-base_v1"#' /root/huixiangdou/config.ini   # 用于检索的重排序模型
sed -i '29s#.*#local_llm_path = "/root/models/internlm2-chat-7b"#' /root/huixiangdou/config.ini  #  本次选用的大模型

创建知识库

cd /root/huixiangdou && mkdir repodir

git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou

增加茴香豆相关的问题到接受问题示例中

cd /root/huixiangdou
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/huixiangdou/resource/good_questions.json

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

cd /root/huixiangdou

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

创建RAG检索过程中的向量数据库

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

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

 

运行期间报错了,根据错误提示,单独安装一下这个依赖

pip install -U duckduckgo_search

接着又报错了,发现是变量重名

注释掉不需要的

继续运行,安装完成

运行知识助手

# 填入问题
sed -i '74s/.*/    queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?", "你可以做什么?","你的实现原理是什么?","你怎么部署到飞书群?"]/' /root/huixiangdou/huixiangdou/main.py

# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone

 

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录关闭