RAG
RAG概述
-
RAG(Retrieval Augmented Generation)技术,通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追溯的推理过程等。提供更准确的回答、降低推理成本、实现外部记忆。
-
RAG主要有以下方面的应用:
-
问答系统
-
文本生成
-
信息检索
-
图片描述
-
RAG工作原理
-
根据上述工作原理图我们不难看出,RAG主要由三大部分构成:索引、检索、生成。首先我们需要将知识源(pdf,web网页)分割成小块,embedding成向量再放入到Vector_DB中;当用户进行提问,RAG接收到用户提问,将问题转换为embedding,并在Vector_DB中找到与之最相关的文档块(top-k,chunks)。最后将检索到的文档块与原始问题一起作为prompt输入到LLM中,生成最终的回答。
-
RAG 能够让基础模型实现非参数知识更新,无需训练就可以掌握新领域的知识。本次课程选用的茴香豆应用,就应用了 RAG 技术,可以快速、高效的搭建自己的知识领域助手。
RAG常见优化方法
-
嵌入优化(Embedding Optimization):结合稀疏和密集检索,多任务。
-
索引优化(Indexing Optimization):细粒度分割,元数据。
-
查询优化(Query Optimization):查询扩展、转换,多查询。
-
上下文管理(Context Curation):重排(rerank),上下文选择/压缩。
-
迭代检索(Iterative Retrieval):根据初始查询和迄今为止生成的文本进行重复搜索。
-
递归检索(Recursive Retrieval):迭代细化搜索查询,链式推理指导检索过程。
-
自适应检索(Adaptive Retrieval):Flare、Self-RAG,使用LLMs主动决定检索的最佳时机和内容。
-
LLM微调(LLM Fine-tuning):检索微调、生成微调、双重微调。
RAG与微调(Fine-tuning)的对比
-
RAG
-
非参数记忆,利用外部知识库提供实时更新的信息。
-
能够处理知识密集型任务,提供准确的事实性回答。
-
通过检索增强,可以生成更多样化的内容。
-
-
使用场景:
-
适用于需要结合最新信息和实时数据的任务:开放域回答、实时新闻摘要等。
-
-
优势:动态知识更新,处理长尾知识问题。
-
局限:依赖于外部知识库的质量和覆盖范围。依赖大模型能力
-
Fine-tuning
-
参数记忆,通过在特定任务数据上训练,模型可以更好地适应该任务。
-
通常需要大量标注数据来进行有效微调。
-
微调过的模型可能存在overfit,导致泛化能力下降。
-
-
适用场景:
-
适用于数据可用且需要模型高度专业化的任务,如特定领域的文本分类、情感分析、文本生成等。
-
-
优势:模型性能针对特定任务优化。
-
局限:需要大量的标注数据,对新任务的适应性较差。
茴香豆介绍
-
茴香豆是一个基于LLMS的领域知识助手,由书生浦语团队开发的开源大模型应用。
-
专为即时通讯工具中的群聊场景优化的工作流,提供及时准确的技术支持和自动化问答服务。
-
通过应用检索增强生成RAG技术,理解和高效准确地回应与特定知识领域相关的复杂查询。
-
-
应用场景:智能客服、即时通讯中创建的群组(微信群飞书群等)。
-
茴香豆的核心特性:
-
开源免费:遵循BSD-3-Clause,免费商用。
-
高效准确:Hybrid LLMs专为群聊优化。
-
领域知识:应用RAG技术,专业知识快速获取。
-
部署成本低:无需额外训练,可利用云端API,本地算力需求少。
-
安全性高:完全本地部署,信息不上传,保护用户与数据的隐私。
-
扩展性强:兼容多种IM软件,支持多种开源LLMs和云端API
-
-
茴香豆构建
-
茴香豆工作流
使用茴香豆开发所需环境
-
购买开发机 链接:https://studio.intern-ai.org.cn/console/instance/new
使用cuda11.7或12.2镜像(本人亲测两种环境都可以)
本次任务使用使用 30% A100 * 1
型号开发机
-
创建conda的虚拟环境
# 这里需要进入开发机选择terminal窗口进行bash命令输入
studio-conda -o internlm-base -t studio-conda -o internlm-base -t InternLM2_Huixiangdou
# 安装完成之后,切换到 InternLM2_Huixiangdou虚拟环境中
studio-conda -o internlm-base -t 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环境依赖包
# 安装茴香豆所需要的python依赖包
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克隆huixiangdou Repo
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
# 切换分支
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440
使用茴香豆搭建RAG
修改配置文件
# 通过sed -i来修改 config.ini 的默认配置
# 用于向量数据库和词嵌入的模型
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
创建知识库
# 下载huixiangdou语料
# 创建目录
cd /root/huixiangdou && mkdir repodir
# git克隆huixiangdou语料库, (限制克隆深度,加快克隆速度,只克隆最近一次的commit)
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
-
提取知识库特征,创建Vector_DB。数据库向量化的过程应用到了
LangChain
的相关模块,默认嵌入和重排序模型调用的网易 BCE 双语模型,如果没有在config.ini
文件中指定本地模型路径,茴香豆将自动从 HuggingFace 拉取默认模型。 -
除了语料知识的Vector_DB,huixiangdou还建立了接受和拒绝两个Vector_DB,主要用于更佳精确地判断提问的相关性:
-
接受问题列表,希望茴香豆助手回答的示例问题:
-
存储在
huixiangdou/resource/good_questions.json
中。
-
-
拒绝问题列表,希望茴香豆助手拒答的示例问题:
-
存储在
huixiangdou/resource/bad_questions.json
中 -
其中多为技术无关的主题或闲聊(例如:ninhao,你是谁,1+1=?等)
-
-
-
添加接受问题示例
cd /root/huixiangdou
# 做好默认接受问题json的备份
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
-
Vector_DB的创建需要等待一小段时间,过程约占用 1.6G 显存。创建完成之后,Huixiangdou 相关的新增知识就以向量数据库的形式存储在
workdir
文件夹下。 -
检索过程中,茴香豆会将输入问题与两个列表中的问题在向量空间进行相似性比较,判断该问题是否应该回答,避免群聊过程中的问答泛滥。确定的回答的问题会利用基础模型提取关键词,在知识库中检索
top K
相似的chunk
,综合问题和检索到的chunk
生成答案。
运行茴香豆知识助手
-
启动huixiangdou服务
# 填入测试所需要的问题
sed -i '74s/.*/ queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py
# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone
-
RAG 技术的优势就是非参数化的模型调优,这里使用的仍然是基础模型
InternLM2-Chat-7B
, 没有任何额外数据的训练。面对同样的问题,我们的茴香豆技术助理能够根据我们提供的数据库生成准确的答案(包含作业截图):
茴香豆进阶操作
加入网络搜索
-
茴香豆除了可以从本地向量数据库中检索内容进行回答,也可以加入网络的搜索结果,生成回答。
-
开启网络搜索功能需要用到 Serper 提供的 API,登录到 Serper,注册;进入 Serper API 界面,复制自己的 API-key:
-
替换
/huixiangdou/config.ini
中的 ${YOUR-API-KEY} 为自己的API-key:
[web_search]
# check https://serper.dev/api-key to get a free API key
x_api_key = "${YOUR-API-KEY}"
domain_partial_order = ["openai.com", "pytorch.org", "readthedocs.io", "nvidia.com", "stackoverflow.com", "juejin.cn", "zhuanlan.zhihu.com", "www.cnblogs.com"]
save_dir = "logs/web_search_result"
使用远程模型
-
茴香豆除了可以使用本地大模型,还可以轻松的调用云端模型 API。目前,已支持
Kimi
,GPT-4
,Deepseek
和GLM
等常见大模型API,想要使用远端大模型,还是得去修改/huixiangdou/config.ini
。
-
启用远程大模型,可以大大降低GPU的显存需求,采用远程模型部署茴香豆应用最小值需要2G内存。需要注意的是,这里启用的远程模型,只用在问答分析和问题生成,依然需要本地嵌入、重排序模型进行特征提取。所以在本地创建Vector_DB需要大约2G显存。
-
同样可以同时开启本地和远程两种模式,这种混合部署方式详见 技术报告,效果更好。
-
茴香豆 Web 版 在 OpenXLab 上部署了混合模型的 Demo,可上传自己的语料库测试效果(包含作业截图)。
利用 Gradio 搭建网页 Demo
-
安装Gradio依赖的python组件
pip install gradio==4.25.0 redis==5.0.3 flask==3.0.2 lark_oapi==1.2.4
-
运行脚本启动huixiangdou对话Demo服务:
cd /root/huixiangdou
python3 -m tests.test_query_gradio
-
SSH设置端口映射远程连接到开发机
ssh -CNg -L 7860:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p <你的端口号>
-
打开网页127.0.0.1:7860 ,进行测试(包含作业截图):
文档参考
https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/readme.md
总结
本次作业相比于上次,稍微复杂一点,从中也遇到一些问题,但是最终的结果还是完成了,希望在后面的学习中再接再厉。