目录
实战:Intern Studio上部署茴香豆技术助手(基础作业)
RAG概述
定义:RAG(Retrieval-Augmented Generation),即"检索增强生成",主要用于提升语言模型在特定任务上的表现,尤其是需要广泛知识支持的任务。RAG概念最早由Meta的Lewis等人在2020年提出,它的核心思想是将传统的语言生成模型与外部知识库检索相结合。RAG技术为解决需要广泛知识支持的复杂语言任务提供了一种有效的解决方案。通过结合检索和生成,RAG模型能够在保持语言生成的流畅性和连贯性的同时,引入外部知识,提高回答的准确性和相关性。
解决问题:LLMs在处理知识密集型任务时可能遇到的挑战(生成幻觉、过时知识、缺乏透明可追溯的推理过程),提供更准确的回答、降低推理成本、实现外部记忆。
RAG工作原理、优势、应用
工作原理:
- 索引:预先构建向量数据库,通过将知识远分割成小块chunk,编码成向量,并存储在向量数据库中。(RAG模型的性能在很大程度上依赖于检索系统的性能)
- 检索:接收到用户的问题后,将问题编码成向量,并在向量数据库中查询到与之最相关的文档块(top-k chunk)(可以通过关键词匹配、语义相似度计算等方式实现)
- 生成:将检索到的文档块&原始问题一起作为提示(prompt)输入到LLM中,生成最终的回答。(通常是一个序列生成过程,可以使用像Transformer这样的预训练语言模型来实现。)
作用:让基础模型实现非参数知识更新,无需增训就能掌握新领域的知识,实现新增知识问答。
RAG的优势:
- 无增训就能实现知识丰富性:通过检索外部知识库,RAG模型能访问到更广泛的知识。
- 灵活应对不同任务,只需调整检索器和生成器即可。
- 可解释性,决策过程涉及到检索的文档:为模型的输出提供了一定程度的可解释性。
RAG的发展进程和应用:
- Naive RAG:问答系统、信息检索
- Advanced RAG:摘要生成、内容推荐
- Modular RAG:多模态任务,对话系统
关于向量数据库(Vector-DB)
- 数据存储:将文本及其他数据通过其他预训练模型,转换为固定长度的向量表示,这些向量能捕捉文本的语义信息。
- 相似性检索:根据用户的查询向量,在向量数据库中快速找到最相关的向量。计算余弦相似度或其他相似性度量来完成,按相似度得分来排序检索结果,最相关文档被用于后续文本生成。
- 向量表示的优化:向量表示对于检索效果的性能很关键。优化:使用更高级的文本编码技术,如句子嵌入/段落嵌入,以及对数据库进行优化以支持大规模向量搜索。
RAG 常见优化方法
- 索引优化:细粒度分割(chunk)、元数据
- 查询优化:查询扩展、转换;多查询
- 嵌入优化:结合稀疏和密集检索、多任务
- 上下文管理:重排(rerank)、上下文选择/压缩
- LLM微调:检索微调、生成微调、双重微调
- 迭代检索:根据初始查询 + 迄今为止生成的文本,进行重复搜索
- 递归检索:迭代细化搜索查询、链式推理(Chain-of-Thought)指导检索过程
- 自适应检索:Flare, Self-RAG、使用LLMs主动决定检索的最佳时机和内容
RAG 对比 微调(Fine-tuning)
RAG | 微调 | |
特点 | * 非参数记忆(无需训练),数据实时更新(外部知识库)。 * 能处理知识密集型任务,提供准确的事实性回答。 * 通过检索增强,生成更多样化的内容。 | * 参数记忆,通过在特定任务数据上训练,模型更好适应该任务。 * 需要大量标注数据来有效微调。 * 微调后模型可能过拟合,导致泛化能力下降。 |
使用场景 | 需要结合最新信息和实时数据的任务:如开放领域问答、实时新闻摘要等。 | 数据可用且需要模型高度专业化的任务,如特定领域的文本分析、情感分析、文本生成等。 |
优势 | 动态知识更新,处理长尾知识问题 | 模型性能针对特定任务优化 |
局限 | 依赖于外部知识库的质量和覆盖范围 | 需要大量标注数据,且对新任务适应性(泛化能力)较差。 |
RAG:外部知识要求高,模型自适应要求低
微调:外部知识要求低,模型自适应要求高
评估框架和基准测试
经典评估指标:准确率Accuracy,召回率Recall,F1分数,BLEU分数(用于机器翻译和文本生成)、ROUGE分数(用于文本生成)
RAG评测框架:
- 基准测试 - RGB、RECALL、CRUD
- 评测工具 - RAGAS、ARES、TruLens
RAG 总结
RAG 生态、三种范式、RAG优化方法、RAG关键问题(检索什么?何时检索?如何检索?)、RAG 发展前景、RAG评测(目标、评测维度、评测框架)
茴香豆 介绍
茴香豆是基于LLMs的领域知识助手,由书生浦语团队开发的开源大语言模型的应用。
专为即时通讯工具IM中的群聊场景优化的工作流,提供及时准确的技术支持和自动化问答服务。
应用RAG技术,茴香豆能理解和高效准确回应与特定知识领域相关的复杂查询。
应用场景 & 场景难点
应用场景:
- 智能客服:技术支持、领域知识对话
- IM工具中创建用户群组,讨论、解答相关问题。
- 场景特点:随着用户数量增加,答复内容高度重复,充斥着大量无意义的闲聊,人工回复成本高,影响工作效率。
场景难点:
- 群聊信息量大,内容多样。
- 用户问题通常与个人紧密相关,需要准确实时的专业知识解答。
- 传统NLP解决方案无法准确解析用户意图,且往往无法提供满意的答案。
- 需要在群聊中准确识别与回答相关问题的智能助手,同时避免造成消息过载。
茴香豆的核心特性
- 开源免费:BSD-3-Clasue,免费商用
- 高效准确:Hybrid LLMs,专为群聊优化
- 领域知识:应用RAG技术,专业知识快速获取
- 部署成本低:无需额外训练,可利用云端模型api,本地算力需求少
- 安全:完全本地部署,信息不上传,保护数据和用户隐私
- 扩展性强:兼容多种IM软件,支持多种开源LLMs和云端api
茴香豆的构建
茴香豆的工作流:
- 预处理
- 拒答工作流
- 应答工作流
群聊 → 输入语句预处理 → 查询 → 拒答工作流(如果不拒答) → 回答工作流 → 群聊回复
- 多来源检索:向量数据库、网络搜索结果、混合文件夹
- 混合大模型:本地LLM、远程LLM
- 多重评分,拒答工作流:回答有效,避免信息泛滥
- 安全检查:多种手段,确保回答合规
实战:Intern Studio上部署茴香豆技术助手(基础作业)
1、环境配置
创建开放机 → 配置基础虚拟环境InternLM2_Huixiangdou → 下载茴香豆所需的基础模型InternLM2-Chat-7B → 下载茴香豆的依赖环境 → 从茴香豆官方仓库下载茴香豆
1.配置基础虚拟环境InternLM2_Huixiangdou
Intern Studio 服务器上部署茴香豆
创建开发机:Cuda11.7-conda 镜像、30% * A100 计算资源
进入开发机后,从官方环境复制运行InternLM的基础环境,命名为InternLM2_Huixiangdou。这一步的时间比较长,需耐心等待。
# 命令行模式运行
studio-conda -o internlm-base -t InternLM2_Huixiangdou
# 在本地查看环境
conda env list
# 结果如下所示
# conda environments:
#
# base * /root/.conda
# InternLM2_Huixiangdou /root/.conda/envs/InternLM2_Huixiangdou
运行conda命令激活InternLM2_Huixiangdou python虚拟环境
conda activate InternLM2_Huixiangdou
注意!!!!后续都在InternLM2_Huixiangdou环境中进行。但凡重启都要再次激活InternLM2_Huixiangdou环境。
2.下载茴香豆所需的基础模型InternLM2-Chat-7B
复制茴香豆所需的模型文件,该教程涉及的模型已存放在Intern Studio开发机共享文件/share中,教程选用的基础模型是InternLM2-Chat-7B。
# 创建模型文件夹
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
3.下载茴香豆所需依赖 & 茴香豆
安装茴香豆运行所需的依赖
# 安装 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 b9bc427
至此,茴香豆工具在 Intern Studio 开发机的安装工作结束。
2、使用茴香豆搭建RAG助手
1.修改配置文件
用已下载模型的路径替换 /root/huixiangdou/config.ini 文件中的默认模型,需修改3处模型地址
① 如下命令行,修改用于向量数据库和词嵌入的模型
sed -i '6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/huixiangdou/config.ini
# 代码打开文件/root/huixiangdou/config.ini。在文件的第6行,查找匹配模式.*(即第6行的任何内容)。
# 将第6行的全部内容替换为embedding_model_path = "/root/models/bce-embedding-base_v1"。
# 直接在原文件上进行修改,不创建新的文件。
用于检索的重排列模型
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
修改好的配置文件如图:
2.创建知识库
使用 InternLM 的 Huixiangdou 文档作为新增知识数据检索来源,不重新训练/增训得情况下,打造一个 Huixiangdou 技术问答助手。
下载 Huixiangdou 语料:
cd /root/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
提取知识库特征,创建向量数据库。数据库向量化过程中应用了LangChain相关模块,默认嵌入和重新排序模型调用的网易BCE双语模型。如果没有在config.ini文件中指定本地模型路径,茴香豆将自动从HuggingFace拉取默认模型。
除了①语料知识的向量数据库,茴香豆建立②接受和③拒答两个向量数据库,用来在检索的过程中更加精确的判断提问的相关性,这两个数据库的来源分别是:
- 接受问题列表,希望茴香豆助手回答的示例问题
- 存储在
huixiangdou/resource/good_questions.json
中
- 存储在
- 拒绝问题列表,希望茴香豆助手拒答的示例问题
- 存储在
huixiangdou/resource/bad_questions.json
中 - 其中多为技术无关的主题或闲聊
- 如:"nihui 是谁", "具体在哪些位置进行修改?", "你是谁?", "1+1"
- 存储在
以下命令增加茴香豆相关的问题到接受问题示例中:
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检索过程中的向量数据库
涉及工作:将①外部知识语料、②接受问题示例、③拒答问题示例 这三种新增知识分别向量化后,保存到 workdir 文件夹中
# 创建向量数据库存储目录
cd /root/huixiangdou && mkdir workdir
# 分别向量化知识语料、接受问题和拒绝问题中后保存到 workdir
python3 -m huixiangdou.service.feature_store --sample ./test_queries.json
上述创建向量数据库 过程约占1.6G显存,需耐心等待一段时间。
检索过程的工作机制:
茴香豆会将input与接受&拒答列表的问题,在向量空间上进行相似性比较,判断是否应回答(拒答机制避免群聊中的问答泛滥)。接受回答问题 → 利用基础模型提取关键词,在知识库中检索 top k个相似的chunk,初始问题 + 检索到的chunk 一同用于生成答案。
3、运行茴香豆知识助手
完成知识库特征提取、创建对应向量数据库后,即可运行检验效果。
# 填入问题
sed -i '74s/.*/ queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py
# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone
报错一,缺少duckduckgo_search等模块。
解决办法是 pip install -r ./requirements.txt ,补全所需环境依赖。
报错二,config.ini文件中“local_llm_path”变量出现不止一次。
解决办法是 config.ini文件中多余的有冲突的“local_llm_path”变量注释掉。
成功运行结果截图:
“茴香豆怎么部署到微信群”问题 被判定为接受问题,进行回答。
“今天天气怎么样” 被判定为非相关问题,拒答。
“huixiangdou 是什么?” 被判定为not a question,一开始打2分,后来debug又打了8分,但最后也没有给出回答,不是很懂。
实战:茴香豆Web 对话 (基础作业)
茴香豆Web 网址:OpenXLab浦源 - 应用中心
外部知识库:各地婚假产假政策、员工体检须知及流程文档
多轮对话截图:
一个小bug:反例里添加了“今天星期几”应该拒答,但实际问“今天星期几”时还是会回答,不太懂。
进阶作业(选了茴香豆零编程集成到飞书)
因为没有测试手机和测试微信号,所以选择了茴香豆零编程集成到 飞书。
使用茴香豆Web版(即OpenXLab)进行部署,首先进入OpenXLab:OpenXLab浦源 - 应用中心
1、在OpenXLab创建一个茴香豆知识助手
1. 填写知识库名称、密码(如果不存在即自动创建)
2.创建成功后,上传知识文档、正反例问题(如果上传知识文档多次不成功,建议刷新一下)
2、飞书机器人设置
接下来,跟着“零开发集成飞书”的教程逐步设置,教程地址:茴香豆零编程接入飞书
①准备工作:
1. 进入飞书开放平台,创建企业自建应用
2. 添加机器人,作为群聊bot
② 飞书机器人配置
1. 进入“凭证与基础信息”栏目,复制应用凭证中 App ID和App Secret,填入到右侧OpenXLab表单的对应位置。
2. 进入“事件与回调”栏目下,点击“加密策略”页,将茴香豆Web(OpenXLab)中表单提供的加密策略复制填到对应地 Encrypt Key和Verification Token
3. 进入“事件配置”页,将茴香豆Web(OpenXLab)中表单提供的 事件回调地址 ,填入到“配置订阅方式”中,选择默认的【将事件发送至开发者服务器】即可,点击保存
4. 订阅事件:随后继续点击当前页面右下角的【添加事件】按钮,搜索【接收消息】事件,并申请开通对应权限
5. 权限配置:进入“权限管理”栏目,申请开通权限im:chat:readonly 和 im:message:send_as_bot(开通好后“权限状态”列会显示 已开通)
6. 点击上方黄色提示栏,发布当前应用版本,提升“已发布”即配置成功
3、在飞书群聊中添加机器人
具体操作参考在群组中使用机器人
(因为要在内部群/单聊场景中才能添加应用机器人,我选了单聊场景)
飞书“在群组中使用机器人”文档说明:
- 应用机器人只支持添加到内部群或用于单聊场景。
- 外部群仅支持通过桌面端添加自定义机器人;移动端不支持添加自定义机器人。
1. 选好单聊群后,群名后缀要先加上对应的suffix,之后再添加机器人(否则会无效)
2. “添加机器人” → 搜索想要的机器人,例如这里是“茴香豆CDA小助手”
3. 垂直领域问答小助手 响应结果:
作业要求