任务链接:https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/Huixiangdou/task.md
文档链接:https://github.com/InternLM/Tutorial/tree/camp3/docs/L2/Huixiangdou
目录
0. 背景
茴香豆 是由书生·浦语团队开发的一款开源、专门针对国内企业级使用场景设计并优化的知识问答工具。在基础 RAG 课程中我们了解到,RAG 可以有效的帮助提高 LLM 知识检索的相关性、实时性,同时避免 LLM 训练带来的巨大成本。在实际的生产和生活环境需求,对 RAG 系统的开发、部署和调优的挑战更大,如需要解决群应答、能够无关问题拒答、多渠道应答、更高的安全性挑战。因此,根据大量国内用户的实际需求,总结出了三阶段Pipeline的茴香豆知识问答助手架构,帮助企业级用户可以快速上手安装部署。
1. Web 版茴香豆
1.1 茴香豆账户和密码
登录 OpenXLab浦源 - 应用中心,可以看到 Web 版茴香豆的知识库注册页面,在对应处输入想要创建的知识库名称和密码,该名称就是 Web 版茴香豆的账户和密码。
1.2 创建知识库
我们来创建一个民法典助手
问一个问题
1.3 通过配置正反例调优知识助手效果
茴香豆的架构中,除了利用 LLM 的功能判断问题相关性,也可以通过手动添加正例(希望模型回答的问题)和反例(希望模型拒答的问题)来调优知识助手的应答效果。
![]() | ![]() |
![]() | ![]() |
对于正例相似问题,茴香豆会在知识库中尽量搜寻相关解答,在没有相关知识的情况下,会推测答案,并在回答中提示我们该回答并不准确。这保证了回答的可追溯性;对于反例问题,茴香豆拒绝作答,这保证了在对话,尤其是企业级群聊中的闲聊、非问题和无关问题触发回答带来的回答混乱和资源浪费。
1.4 在微信群或飞书群内使用茴香豆助手
飞书教程:Docs
2. 茴香豆本地标准版搭建
2.1 安装茴香豆
# 环境创建
studio-conda -o internlm-base -t huixiangdou
conda activate huixiangdou
# 安装
cd /root
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 79fa810
# 安装依赖
# parsing `word` format requirements
apt update
apt install python-dev libxml2-dev libxslt1-dev antiword unrtf poppler-utils pstotext tesseract-ocr flac ffmpeg lame libmad0 libsox-fmt-mp3 sox libjpeg-dev swig libpulse-dev
# python requirements
pip install BCEmbedding cmake==3.30.2 lit==18.1.8 sentencepiece==0.2.0 protobuf==5.27.3 accelerate==0.33.0
pip install -r requirements.txt
# python3.8 安装 faiss-gpu 而不是 faiss
# 复制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
# 拷贝llm
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-7b /root/models/internlm2-chat-7b
2.2 更改配置文件
茴香豆的所有功能开启和模型切换都可以通过 /root/huixiangdou/config.ini 文件进行修改
执行下面的命令更改配置文件,让茴香豆使用本地模型
sed -i '9s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/huixiangdou/config.ini
sed -i '15s#.*#reranker_model_path = "/root/models/bce-reranker-base_v1"#' /root/huixiangdou/config.ini
sed -i '43s#.*#local_llm_path = "/root/models/internlm2-chat-7b"#' /root/huixiangdou/config.ini
2.3 知识库搭建
知识库搭建选用的是茴香豆和 MMPose 的文档,利用茴香豆搭建一个茴香豆和 MMPose 的知识问答助手。 repodir 文件夹用来储存知识库原始文档; workdir 文件夹用来存放原始文档特征提取到的向量知识库。
conda activate huixiangdou
cd /root/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
git clone https://github.com/open-mmlab/mmpose --depth=1 repodir/mmpose
# Save the features of repodir to workdir, and update the positive and negative example thresholds into `config.ini`
mkdir workdir
python3 -m huixiangdou.service.feature_store
运行结果
知识库创建成功后会有一系列小测试,检验问题拒答和响应效果,如图所示,关于“mmpose 安装”的问题,测试结果可以很好的反馈相应答案和对应的参考文件,但关于“std::vector 使用”的问题,因为属于 C++ 范畴,不再在知识库范围内,测试结果显示拒答,说明我们的知识助手工作正常。
和 Web 版一样,本地版也可以通过编辑正反例来调整茴香豆的拒答和响应,正例位于 /root/huixiangdou/resource/good_questions.json
文件夹中,反例位于/root/huixiangdou/resource/bad_questions.json
。
需要注意的是,每次更新原始知识文档和正反例,都需要重新运行 python3 -m huixiangdou.service.feature_store
命令进行向量知识库的重新创建和应答阈值的更新。
配置中可见,在运行过一次特征提取后,茴香豆的阈值从 -1.0 更新到了 0.33。 配置文件中的 work_dir
参数指定了特征提取后向量知识库存放的位置。如果有多个知识库快速切换的需求,可以通过更改该参数实现。
2.4 测试知识助手
2.4.1 命令行运行
conda activate huixiangdou
cd /root/huixiangdou
python3 -m huixiangdou.main --standalone
Example 中有两个问题:
1. 请问如何安装 mmpose ?
2. 请问明天天气如何?
显然第一个问题是可以在知识库中找到的,而第二个需要联网查询,让我们观察以下的输出:
前面拼接了一系列的 prompt,这里开始在文档中进行查询
经过一系列步骤,最终正确回答了问题
针对第二个问题
网络搜索功能没有开启,查询失败
2.4.2 Gradio UI 界面测试
启动 Gradio
python3 -m huixiangdou.gradio
启动成功
茴香豆助手搭建在远程服务器上,因此需要先建立本地和服务器之间的透传,透传默认的端口为 7860
,在本地机器命令行中运行如下命令:
ssh -CNg -L 7860:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p <你的ssh端口号>
Gradio 界面,来问它一个问题
结果
看一下命令行的输出
2.5 集成飞书&微信群聊(略)
本地版茴香豆的群集成和 Web 版一样,需要有公网 IP 的服务器,微信仅支持特定 Android 版本。
飞书集成:
-
pip install -r requirements-lark-group.txt
-
教程 HuixiangDou/docs/add_lark_group_zh.md at main · InternLM/HuixiangDou · GitHub
3 茴香豆高阶应用
3.1 开启网络搜索
开启网络搜索功能需要用到 Serper 提供的 API:
-
登录 Serper ,注册:
-
进入 Serper API 界面,复制自己的 API-key
编辑 /root/huixiangdou/config.ini,替换为自己的 API-key。其中 domain_partial_order
可以设置网络搜索的范围。
开启网络搜索,再问一个问题
可以看到,这里进行了一些搜索
最后生成了我们需要的答案
再问一个问题
我们知道,网络搜索的范围主要有以下网站,没有用来查询天气的网站
domain_partial_order = ["arxiv.org", "openai.com", "pytorch.org", "readthedocs.io", "nvidia.com", "stackoverflow.com", "juejin.cn", "zhuanlan.zhihu.com", "www.cnblogs.com"]
检查一下命令行,是有搜索的结果的,但是没有被最终放入 prompt 中
原因是分数没有超过阈值,说明这个问题与知识库的相似度太低