茴香豆:搭建你的 RAG 智能助理——作业
详细视频:茴香豆:搭建你的 RAG 智能助理
详细教程:点这里
一、基础作业
1.1、在茴香豆 Web 版中创建自己领域的知识问答助手
1.1.1、题目
参考视频零编程玩转大模型,学习茴香豆部署群聊助手
1.1.2、要求
完成不少于 400 字的笔记 + 线上茴香豆助手对话截图(不少于5轮)
1.1.3、内容
因为 茴香豆 Web 版 网页已经部署好了,所以我们可以直接体验,这个作业需要做的就是上传自己的文件,让它成为我们个人的专属助手,以后有什么问题了,不用再自己慢慢找,而是直接问助手就好了,是很方便的。
因为自己之前看论文,会边看论文边写笔记,因此这次也是上传了自己的一份笔记作文作为测试。
这是一份pdf文件(文件名字瞎取的),这个pdf主要记录了我看过的论文以及自己对每篇论文的理解,现在开始测试:
- 第一轮对话
- 第二轮对话
- 第三轮对话
这里我打错字了,“一下” 打成了 “一些”,但不妨碍助手的理解。
- 第四轮对话
- 第五轮对话
到第五轮对话结束,我问的都是有关我的文章内容的问题,而助手也能很快地整理并回答我的问题,表现还是可以的。然后想测试一下,如果我问的问题无关我上传的文件,那会怎么样。
- 第六轮对话
显然,助手的回答有误,你一个电子宠物吃过了?出现这样的回答是极其不合理的,更何况还标注了“参考文档”,用参考文档中不存在的内容来回答,算不算一种“幻觉”?
但 web 版也提供了接受问题和拒答问题的设置,只要添加对应示例,能帮助模型更好地回答。
如上图所示,添加了两个反例,现在,再测试助手会怎么回答同一个问题。
- 第七轮对话
显然,这次助手的回答合理了很多,认识到自己并不能进食,并很快转移话题,提醒可以回答其他问题。但作为使用者的我来说并不是很满意,因为我想让助手知道,是就是是,不是就是不是,既然我给你的问题不是我文档中涉及的,你就应该回答我类似 “抱歉,并没有在知识库中找到相关内容,你可以提问其他问题” 等此类回复,尤其是标注了“参考文档”,如上文所说,如果你要回答的问题以及回答的内容都是在参考文档中不存在的,为什么还要给出不相关的回答呢?
觉得“你吃了吗”这种问题太普通了,我又提出了新的问题。
- 第八轮对话
这次的问题是 “你觉得清华大学怎么样”(截图没截上),小助手的回答更离谱了,就像是人工作过劳,开始胡言乱语,先是回答了文件中的内容,然后再给出一小段对清华的评价。
不知道为什么会出现这种情况,个人理解是,我让小助手评价,那么就像人类评价什么东西一样,会有思考这个过程,比如它有没有什么作用,它的意义之类的,然后结合思考,脑海里会有一个总结的过程,综上所述,我认为 xxxxxxx。
那么在小助手的角度,可能它会将我的问题转换,查询直接向量库,在知识向量库检索的时候,匹配 “思考”、“总结” 这样的字眼,最后检索出了论文里面涉及到这些字词的内容,并生成回答。而我的问题总共才几个字,“清华大学”这四个字是绝对不可以省略的,因为实在匹配不了,因此给出了模型本身自己的回答。
在后续我说 “你的回答在我的文档中并没有的时候”,小助手给出了我希望它在一开始就给出的回复,实事求是。
1.1.4、总结
综上所述, 茴香豆 Web 版 已经是一个相对成熟的工具了,在提供给大量文件输入知识向量库后,只要提问者提问相关问题,小助手是能够快速并且精确地给出回答的,很适合从业者或者学生,是一个很便利的 “搜索引擎”。
但缺点也不少,面对不相关问题时,小助手会出现胡乱回答的情况。从上文的实验,个人理解是,面对一个问题时,不是将一个句子看作一个整体,而是将一个句子拆分出若干内容,然后这每一部分再去匹配向量库,最后各个部分的回答结合在一起给出最终答复,即使出现不相关的内容,也要跳脱向量库强行给予回答。但既然是私人助手,我就希望它只为我服务,我个人认为这部分还是可以改进,当问题出现不相关的内容时,小助手直接明确答复“不知道”等内容,实事求是地表示“这不是我小助手的问题”,这是“你使用者不给我金刚钻还要我揽瓷器活的问题”。
1.2、在 InternLM Studio 上部署茴香豆技术助手
1.2.1、题目
根据教程文档搭建茴香豆技术助手,针对问题"茴香豆怎么部署到微信群?"进行提问
1.2.2、要求
完成不少于 400 字的笔记 + 截图
1.2.3、基础内容
因为教程都有,所以在这里就大概贴出自己的一些过程以及遇到的一些问题。
- 安装茴香豆运行所需依赖。
# 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
我没想到,在开始的配置环境这一步当中,就遇到了问题。
如上图所示,安装依赖中要求装了很多包,但后面实际运行发现并没有 pandas==2.2.1
这个版本的包,除此之外,命令行中的 scikit-learn==1.4.1.post1
也是没有的。但后面一步步做下来,发现没有这两个包不影响。
- 从茴香豆官方仓库下载茴香豆。
cd /root
# 下载 repo
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440
- 修改配置文件
用已下载模型的路径替换 /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
修改好的配置文件如下图所示:
- 创建知识库
本示例中,使用 InternLM 的 Huixiangdou 文档作为新增知识数据检索来源,在不重新训练的情况下,打造一个 Huixiangdou 技术问答助手。
首先,下载 Huixiangdou 语料:
cd /root/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
- 建立接受问题列表,希望茴香豆助手回答的示例问题
问题存储在 huixiangdou/resource/good_questions.json
中。
下图是没有修改以前的 good_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
下图是修改之后的 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
向量数据库的创建需要等待一小段时间,过程约占用 1.6G 显存。
完成后,Huixiangdou 相关的新增知识就以向量数据库的形式存储在 workdir
文件夹下。
检索过程中,茴香豆会将输入问题与两个列表中的问题在向量空间进行相似性比较,判断该问题是否应该回答,避免群聊过程中的问答泛滥。确定的回答的问题会利用基础模型提取关键词,在知识库中检索 top K
相似的 chunk
,综合问题和检索到的 chunk 生成答案。
- 运行茴香豆知识助手
我们已经提取了知识库特征,并创建了对应的向量数据库。现在,让我们来测试一下效果:
命令行运行:
# 填入问题
sed -i '74s/.*/ queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py
# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone
RAG 技术的优势就是非参数化的模型调优,这里使用的仍然是基础模型 InternLM2-Chat-7B, 没有任何额外数据的训练。面对同样的问题,我们的茴香豆技术助理能够根据我们提供的数据库生成准确的答案。
这个地方我不理解,就是按照教程包括视频演示来看,此时的助手应该是能够回答 “huixiangdou 是什么?”的问题的,但我的就一直报错,不能回答这个问题,看了中间运行结果,甚至都不能判断这个句子是个疑问句,直接打了 0 分,目前还不知道是什么情况。
相反,对于 “茴香豆怎么部署到微信群” 这个比较复杂的问题,助手给出了很好的回答,这也是其他大模型所不能很好解决的问题,而之所以能这样,还是因为有了 RAG 技术,再次感叹 RAG 技术的强大。
如上图所示,“今天天气怎么样?” 这个问题,虽然得分为 10 分,但依然被很好地拒绝回答了,这也正是茴香豆助手设置拒绝回答的问题,如果每个类似没有太大意义的问题都要回答,那微信群要被狠狠刷屏了。
1.2.4、进阶内容
1.2.4.1、加入网络搜索
- 注册 Serper 账号,获取 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"
其中 domain_partial_order
可以设置网络搜索的范围。
测试 “茴香豆怎么部署到微信群” 这个问题,发现生成结果和之前并没有什么差别,不知道是自己的打开方式不对还是最好也只能回答成这样了。
1.2.4.2、使用远程模型
茴香豆除了可以使用本地大模型,还可以轻松的调用云端模型 API。
目前,茴香豆已经支持 Kimi
,GPT-4
,Deepseek
和 GLM
等常见大模型API。
想要使用远端大模型,首先修改 /huixiangdou/config.ini
文件
enable_local = 0 # 关闭本地模型
enable_remote = 1 # 启用云端模型
接着,如下图所示,修改 remote_ 相关配置,填写 API key、模型类型等参数。我自己是使用的 Kimi 大模型,注册一个账号,获取 API,不麻烦,很快。
还是测试 “茴香豆怎么部署到微信群” 这个问题,好了,问题来了
直接报错,不知道发生了什么,经过检查也排除了是命令输错的问题,遂去看源码。但看了半天,并不能解决问题,只知道是因为上面设置了 enable_local = 0
才导致的报错。纯调用远端大模型不行,那就试着走混合模型的路子。
再测试用例,这下子可以了。
但很明显,效果是明显不如单纯地调用本地模型的。这个地方我也不理解,为什么混合效果反而会比单纯效果要差呢,正常来说,不应该两者取其精华,生成一个更好的答案吗,而且细看结果,发现还参杂着类似于 “茴香豆是什么”、“茴香豆的优势” 之类问题的回答,就是与 “部署到微信群” 是无关的,确实匪夷所思。
1.2.4.3、利用 Gradio 搭建网页 Demo
- 首先,安装 Gradio 依赖组件:
pip install gradio==4.25.0 redis==5.0.3 flask==3.0.2 lark_oapi==1.2.4
- 运行脚本,启动茴香豆对话 Demo 服务:
cd /root/huixiangdou
python3 -m tests.test_query_gradio
此时服务器端接口已开启。如果在本地服务器使用,直接在浏览器中输入 127.0.0.1:7860 ,即可进入茴香豆对话 Demo 界面。
针对远程服务器,如我们的 Intern Studio 开发机,我们需要先设置端口映射,转发端口到本地浏览器,然后即可进入对话界面。
“茴香豆是什么” 这个问题一如既往地回答不出来。。。
结果看上去比较费劲,这个界面也确实有点丑。。。
1.2.5、总结
跟着教程一步步部署茴香豆助手,总体还算顺利,自己也跟着代码学会了很多,以往对于这些代码都是无脑复制,但这次自己也会跟着理解,知道每一步代码都在做什么,单纯调用远程大模型失败时也看了源码,虽然没怎么看懂,但也大概了解代码的作用。
跟着教程,也让我更清晰、直观地感受到了 RAG 的作用,不需要重新训练,更改语料库,设置好接受问题和拒答问题,就能很好得成为个人助手。
目前来看,RAG 将输入转换为 embeddings
,即本地嵌入和重排序时需要大模型,分析和生成结果时也需要大模型,这次实践中分别使用了 网易 BCE 双语模型
以及 InternLM-chat-7B
,那么更改这三个模型,选择其他模型,会不会产生更好的效果,还有待实践。