目录

1. 相关视频和文档

2. 视频学习笔记

2.1 RAG的原理、架构、数据库、评估与测试

2.2 茴香豆的介绍、特点、架构

3. 课后作业

3.1 在茴香豆Web版中创建自己领域的知识问答助手

3.2 在 InternLM Studio上部署茴香豆技术助手

3.3 利用 Gradio 搭建网页 Demo


1. 相关视频和文档

2. 视频学习笔记

2.1 RAG的原理、架构、数据库、评估与测试

2.1.1 RAG是什么?

** 在大模型中结合RAG技术会有什么效果,这里可以举个例子:

某大语言模型 A 在训练时用到了2023年12月31日之前的数据。使用者在跟 A 进行交互对话时,如果问到的问题不涉及2024年的信息,例如一些知识点或者科学原理,A 应该能较好地给出回答(如果 A 本身的性能还不错)。但是如果问的问题涉及到2024年的信息了,例如问 A 关于某件在24年发生的事情的看法,或者是让它介绍一个24年才造出来的方法,它一般会回答不知道,或者它的知识库没涉及到这些信息。如果再多问几遍这个问题,它可能就会开始自己编造一些虚假的回复内容(这种现象也被称为大模型的“幻觉”)

如果将 RAG 技术与大模型 A 结合起来,A 就能通过外部数据学到更多的新知识,在面临上述情况时,A 就可以通过信息检索等方式给出一个合理的回答。但具体回复效果跟 A 本身的性能也有关系的,如果 A 本身的性能就不太好,那就算结合了 RAG 技术也不能确保能有很好的效果

2.1.2 RAG的原理

其中,Vector-DB(向量数据库)是RAG技术中专门用于储存外部数据的地方,主要有三个功能:

  • 数据存储:将文本及其他数据通过其他预训练的模型转换为固定长度的向量表示,这些向量能够捕捉文本的语义信息
  • 相似性检索:根据用户的查询向量,使用向量数据库快速找出最相关的向量的过程。通常通过计算余弦相似度或其他相似性度量来完成。检索结果根据相似度得分进行排序,最相关的文档将被用于后续的文本生成
  • 向量表示的优化:包括使用更高级的文本编码技术,如句子嵌入或段落嵌入,以及对数据库进行优化以支持大规模向量搜索

2.1.3 RAG技术与Fine-tuning的区别

  • RAG技术具有非参数记忆,可以利用外部知识库提供实时更新的信息,通过检索增强,可以生成更多样化的内容,能够处理知识密集型任务,提供准确的事实性回答。适用于需要结合最新信息和实时数据的任务,例如开放域问答、实时新闻摘要等。可以做到动态知识更新是它的优势,但这也代表它会有相应的局限性,例如依赖外部知识库的质量和覆盖范围
  • Fine-tuning,也就是微调,是具有参数记忆的,需要在特定的带标注数据上进行进一步训练以更好地适应特定任务,这也意味着微调有可能会使得模型的泛化性变差。适用于高度专业化的任务,例如特定领域的文本分类、文本生成等。可以针对特定任务进行优化是它的优势,但也具有一定局限性,例如微调过程需要大量带标注数据

2.1.4 RAG技术的评估框架和基准测试

2.2 茴香豆的介绍、特点、架构

2.2.1 茴香豆是什么

茴香豆是一个基于大语言模型的领域知识助手,由书生·浦语团队开发并开源。通过结合RAG技术,使得大模型能够理解问题并高效地给出准确的回答,满足特定知识领域相关的复杂查询要求。专门用于即时通讯工具中的群聊场景优化,可以提供及时准确的技术支持和自动化问答服务。(感觉可以类比购物APP中的AI客服?有时候经常会有买家问发什么快递、从哪里发货等高度重复性的问题,这个时候AI客服就可以派上用场了,可以比较快地响应回复。不过AI客服是一对一的交互,这里的茴香豆针对的是群聊中的问答场景)

2.2.2 茴香豆的架构

  • 知识库:企业内部或个人所在领域的专有技术文档,目前支持markdown、word、pdf、txt、ppt等格式
  • 前端:即获取用户问题以及做回复的平台,如微信、飞书等
  • 后端:即大语言模型,目前支持本地调用大模型或远端调用大模型的API,如书生·浦语、通义千问、ChatGPT等
  • 茴香豆本身,采用多来源检索,如向量数据库、网络搜索、知识图谱,支持混合大模型,会对回复内容进行安全检查和多重评分,确保回答内容合规有效,也有拒答工作流,避免信息泛滥

3. 课后作业

3.1 在茴香豆Web版中创建自己领域的知识问答助手

教程(零编程玩转大模型,学习茴香豆部署群聊助手_哔哩哔哩_bilibili)中展示了创建“电信办卡优惠”相关的问答助手的过程,也简单展示了如何将助手部署到微信群以及使用效果。但感觉实际操作起来会有一些障碍:一方面是找不到比较合适的知识文档,另一个就是要在微信群聊中测试效果(目前没有合适的微信群或者说使用场景)。所以打算简单做一下创建问答助手这部分的作业,选择的知识文档是 European Radiology 期刊的投稿要求,看看问答助手能达到一个怎样的水平

3.1.1 登录网站,创建知识库

网址:OpenXLab浦源 - 应用中心,注册和登录选项都在右上角

3.1.2 上传知识文档

上传的是 European Radiology 期刊官网上的两个文档,主要是告诉投稿者怎么进入系统、投稿过程怎么操作、以及对于手稿有哪些要求,需要说明的是,两个文档都是全英的,且 EM-Author-English.pdf文档中含有一些图片,在上传过程中也发现这个文档的处理过程会稍微慢一些

3.1.3 测试结果示例

使用体验:做了一些简单测试,小助手的回答都是正确的,响应过程也比较流畅。在这个测试中,感觉小助手起到的作用类似于在文献阅读器中使用查找功能

3.2 在 InternLM Studio上部署茴香豆技术助手

3.2.1 创建开发机,配置基础环境

创建开发机的过程可参照第二课学习记录的3.1.1:学习笔记:书生·浦语实战营第二期第二课-CSDN博客,本次实验需要 30% A100。创建完成后启动开发机并进入,打开JupyterLab的Terminal,从官方环境复制运行 InternLM 的基础环境并命名为InternLM2_Huixiangdou(需要时间,耐心等待)。复制完成后,激活环境

studio-conda -o internlm-base -t InternLM2_Huixiangdou
conda activate InternLM2_Huixiangdou

3.2.2 下载基础文件

复制茴香豆所需模型文件,为了减少下载和避免 HuggingFace 登录问题,所有作业和教程涉及的模型都已经存放在 Intern Studio 开发机共享文件中,此处选 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.2.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

cd /root
# 下载 repo
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440

3.2.4 修改配置文件

用已下载模型的路径替换 /root/huixiangdou/config.ini 文件中的默认模型,需要修改 3 处模型地址,分别是:用于向量数据库和词嵌入的模型、用于检索的重排序模型、本次选用的大模型

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

3.2.5 创建知识库

本实验中,使用 InternLM 的 Huixiangdou 文档作为新增知识数据检索来源,在不重新训练的情况下,打造一个 Huixiangdou 技术问答助手

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

提取知识库特征,创建向量数据库。数据库向量化的过程应用到了 LangChain 的相关模块,默认嵌入和重排序模型调用的网易 BCE 双语模型。除了语料知识的向量数据库,茴香豆建立接受和拒答两个向量数据库,用来在检索的过程中更加精确的判断提问的相关性,这两个数据库的来源分别是:接受问题列表,即希望茴香豆助手回答的示例问题,存在huixiangdou/resource/good_questions.json 中;拒绝问题列表,希望茴香豆助手拒答的示例问题,其中多为技术无关的主题或闲聊,存在 huixiangdou/resource/bad_questions.json 中。运行下面的命令,增加茴香豆相关的问题到接受问题示例中:

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

完成后,Huixiangdou 相关的新增知识就以向量数据库的形式存储在 workdir 文件夹下,检索过程中,茴香豆会将输入问题与两个列表中的问题在向量空间进行相似性比较,判断该问题是否应该回答,避免群聊过程中的问答泛滥。确定的回答的问题会利用基础模型提取关键词,在知识库中检索 top K 相似的 chunk,综合问题和检索到的 chunk 生成答案

3.2.6 对茴香豆知识RAG小助手进行测试

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

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

前两个问题能很好的回复,第三个问题在拒答列表,小助手拒绝回答

使用体验:最明显的一点是交互体验不是很友好,看起来费劲,另外就是响应速度没有Web版的快

3.3 利用 Gradio 搭建网页 Demo

3.3.1 安装 Gradio 依赖组件

pip install gradio==4.25.0 redis==5.0.3 flask==3.0.2 lark_oapi==1.2.4

3.3.2 启动茴香豆对话 Demo 服务

cd /root/huixiangdou
python3 -m tests.test_query_gradio 

在运行过程中,要对端口环境配置本地 PowerShell 。使用快捷键组合 Windows + R 打开指令界面,并输入powershell按下回车键,输入以下命令,实现从本地使用 ssh 连接 studio 的端口

# 需要将下方端口号 41421 替换成自己开发机的端口号
ssh -CNg -L 7860:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p 41421

** 补充说明:开发机的端口号及密码的查询方式:

3.3.3 进入网页,进行测试

完成3.3.2之后,在本地浏览器打开网址:127.0.0.1:7860,界面如下:

测试结果示例如下,不知道为啥是这个结果,难道是被拒答了?

使用体验:测试过程比3.2要更友好一些,但结果有些问题;感觉还是最喜欢Web版

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐