【书生大模型实战营(暑假场)】进阶任务五 茴香豆:企业级知识库问答工具

本文主要是介绍【书生大模型实战营(暑假场)】进阶任务五 茴香豆:企业级知识库问答工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

进阶任务五 茴香豆:企业级知识库问答工具

  • 任务
  • 文档
  • 视频
  • 茴香豆

1 茴香豆基本介绍

茴香豆 是由书生·浦语团队开发的一款开源、专门针对国内企业级使用场景设计并优化的知识问答工具。在基础 RAG 课程中我们了解到,RAG 可以有效的帮助提高 LLM 知识检索的相关性、实时性,同时避免 LLM 训练带来的巨大成本。在实际的生产和生活环境需求,对 RAG 系统的开发、部署和调优的挑战更大,如需要解决群应答、能够无关问题拒答、多渠道应答、更高的安全性挑战。因此,根据大量国内用户的实际需求,总结出了三阶段Pipeline的茴香豆知识问答助手架构,帮助企业级用户可以快速上手安装部署。

茴香豆特点:

  • 三阶段 Pipeline (前处理、拒答、响应),提高相应准确率和安全性
  • 打通微信和飞书群聊天,适合国内知识问答场景
  • 支持各种硬件配置安装,安装部署限制条件少
  • 适配性强,兼容多个 LLM 和 API
  • 傻瓜操作,安装和配置方便

在这里插入图片描述

2 茴香豆本地标准版搭建实战

任务
尝试将茴香豆从源码部署到本地服务器(以 InternlmLM Studio 为例),并开发一款简单的知识助手 Demo。

2.1 环境配置和源码准备

首先,准备 huixiangdou 专用 conda 环境,并安装相关依赖,完成环境配置;并且从官方码仓拉取仓库,并进行文件安装。

# 创建茴香豆专用 conda 环境
studio-conda -o internlm-base -t huixiangdou# 激活环境
conda activate huixiangdou# 从茴香豆仓库拉取代码到服务器
cd /root
# 克隆代码仓库并进入 huixiangdou 文件夹
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==0.1.5 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

2.2 模型文件配置

茴香豆默认可以根据配置文件自动下载对应模型文件。但模型已经预载在开发机中,可以通过软连接直接配置模型文件。在这里我们选择的大模型是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

在这里插入图片描述

2.3 更改配置文件

茴香豆的功能管理和模型切换可通过 config.ini 文件进行修改,默认参数如下:

[feature_store]
# `feature_store.py` use this throttle to distinct `good_questions` and `bad_questions`
reject_throttle = -1.0
# text2vec model, support local relative path, huggingface repo and URL.
# for example:
#  "maidalun1020/bce-embedding-base_v1"
#  "BAAI/bge-m3"
#  "https://api.siliconflow.cn/v1/embeddings"
embedding_model_path = "maidalun1020/bce-embedding-base_v1"# reranker model, support list:
#  "maidalun1020/bce-reranker-base_v1"
#  "BAAI/bge-reranker-v2-minicpm-layerwise"
#  "https://api.siliconflow.cn/v1/rerank"
reranker_model_path = "maidalun1020/bce-reranker-base_v1"# if using `siliconcloud` API as `embedding_model_path` or `reranker_model_path`, give the token
api_token = ""
api_rpm = 1000
work_dir = "workdir"[web_search]
engine = "serper"
# web search engine support ddgs and serper
# For ddgs, see https://pypi.org/project/duckduckgo-search
# For serper, check https://serper.dev/api-key to get a free API key
serper_x_api_key = "YOUR-API-KEY-HERE"
domain_partial_order = ["arxiv.org", "openai.com", "pytorch.org", "readthedocs.io", "nvidia.com", "stackoverflow.com", "juejin.cn", "zhuanlan.zhihu.com", "www.cnblogs.com"]
save_dir = "logs/web_search_result"[llm]
enable_local = 1
enable_remote = 0
# hybrid llm service address
client_url = "http://127.0.0.1:8888/inference"[llm.server]
# local LLM configuration
# support "internlm/internlm2-chat-7b", "internlm2_5-7b-chat" and "qwen/qwen-7b-chat-int8"
# support local path, for example
# local_llm_path = "/path/to/your/internlm2_5"local_llm_path = "internlm/internlm2_5-7b-chat"
local_llm_max_text_length = 3000
# llm server listen port
local_llm_bind_port = 8888# remote LLM service configuration
# support "gpt", "kimi", "deepseek", "zhipuai", "step", "internlm", "xi-api" and "alles-apin"
# support "siliconcloud", see https://siliconflow.cn/zh-cn/siliconcloud
# xi-api and alles-apin is chinese gpt proxy
# for internlm, see https://internlm.intern-ai.org.cn/api/documentremote_type = "kimi"
remote_api_key = "YOUR-API-KEY-HERE"
# max text length for remote LLM.
# use 128000 for kimi, 192000 for gpt/xi-api, 16000 for deepseek, 128000 for zhipuai, 40000 for internlm2
remote_llm_max_text_length = 128000
# openai API model type, support model list:
# "auto" for kimi. To save money, we auto select model name by prompt length.
# "auto" for step to save money, see https://platform.stepfun.com/
# "gpt-4-0613" for gpt/xi-api,
# "deepseek-chat" for deepseek,
# "glm-4" for zhipuai,
# "gpt-4-1106-preview" for alles-apin or OpenAOE
# "internlm2-latest" for internlm
# for example "alibaba/Qwen1.5-110B-Chat", see https://siliconflow.readme.io/reference/chat-completions-1
remote_llm_model = "auto"
# request per minute
rpm = 500

在终端执行以下命令更改配置文件,让茴香豆使用本地模型:

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

修改后,配置文件部分改变,茴香豆将使用本地模型:
在这里插入图片描述

注意!配置文件默认的模型和下载好的模型相同。如果不修改地址为本地模型地址,茴香豆将自动从 huggingface hub 拉取模型。如果选择拉取模型的方式,需要提前在命令行中运行 huggingface-cli login 命令,验证 huggingface 权限。

2.4 知识库创建

完成配置文件后,搭建知识库,除了茴香豆和 MMPose 的文档,这里还选取多个 github 上开源的机器学习,深度学习,大模型相关的开源资料。我们在 huixiangdou 文件加下创建 repodir 文件夹,用来储存知识库的原始文档。再创建一个文件夹 workdir 用来存放原始文档特征提取到的向量知识库。运行以下指令将完成知识库的构建以及从原始文档提取为向量知识库。我们期望可以得到一个了解茴香豆,MMPose,机器学习,深度学习和大模型知识的问答助手。

conda activate huixiangdoucd /root/huixiangdou && mkdir repodirgit clone https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes.git --depth=1 repodir/Coursera-ML-AndrewNg-Notes
git clone https://github.com/d2l-ai/d2l-zh.git --depth=1 repodir/d2l-zh
git clone https://github.com/amusi/Deep-Learning-Interview-Book.git --depth=1 repodir/Deep-Learning-Interview-Book
git clone https://github.com/unclestrong/DeepLearning_LHY21_Notes.git --depth=1 repodir/DeepLearning_LHY21_Notes
git clone https://github.com/datawhalechina/leedl-tutorial.git --depth=1 repodir/leedl-tutorial
git clone https://github.com/datawhalechina/so-large-lm.git --depth=1 repodir/so-large-lm
git clone https://github.com/datawhalechina/self-llm.git --depth=1 repodir/self-llm# 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

在这里插入图片描述

可以看到,知识库创建过程中进行了一系列小测试,检验问题拒答和响应效果。对于在知识库内的问题,进行了有依据的回答;不在知识库内的问题则选择了拒答,一定程度上提高了茴香豆的稳定性。

本地板也可以编辑正例和反例来调整茴香豆的拒答和响应,正反例位置如:

在这里插入图片描述

在应用中需要注意的是,每次更新只是文档和正反例,都必须重新运行 python3 -m huixiangdou.service.feature_store 命令,以进行向量知识库的重新创建和应答阈值的更新。更新也会直接反映在配置文件中:
在这里插入图片描述

2.5 茴香豆知识助手测试

2.5.1 在终端命令行部署茴香豆

运行以下指令,可以在终端测试目前的茴香豆知识助手。这种基于命令行的方式可以看到对话的结果及中间过程,便于确认知识库是否覆盖需求,正反例设计是否合理。

conda activate huixiangdou
cd /root/huixiangdou
python3 -m huixiangdou.main --standalone

在询问对话中,可以发现茴香豆在知识库中检索出了类相关的知识内容,并根据这些知识文档进行了回复,命令行中的输出也可以看出茴香豆向知识库的搜索:
在这里插入图片描述
在这里插入图片描述

2.5.2 Gradio 部署茴香豆

茴香豆也用 Gradio 搭建了一个 Web UI 的交互界面,可以支持本地茴香豆助手的测试效果。我们运行以下指令,然后进行端口映射,便可以与在 Web 界面的 Gradio 支持的茴香豆助手进行交互:

conda activate huixiangdou
cd /root/huixiangdou
python3 -m huixiangdou.gradio

这里有一个小插曲,即按照运行后指定的 7860 端口去访问,始终无法显示 Web UI:

在这里插入图片描述
在这里插入图片描述
我们根据社区大佬的解决方案

把开发机的7860端口映射到本地的7870端口试一试能否在笔记本的7870访问。还不行的话,就建议所有终端都kill了,然后重新启动huixiangdou的gradio界面

我们使用以下指令进行映射后,成功在本地的 7870 端口进行了访问:

ssh -CNg -L 7870:127.0.0.1:7860 root@ssh.intern-ai.org.cn -p <开发机端口号>

然后我们便可以在 Gradio 界面与大模型进行对话,发现在禁用网页搜索时,茴香豆也能在回复时很好的抽取知识库对应的内容,给出可靠的回答:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这篇关于【书生大模型实战营(暑假场)】进阶任务五 茴香豆:企业级知识库问答工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116243

相关文章

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

基于Python打造一个全能文本处理工具

《基于Python打造一个全能文本处理工具》:本文主要介绍一个基于Python+Tkinter开发的全功能本地化文本处理工具,它不仅具备基础的格式转换功能,更集成了中文特色处理等实用功能,有需要的... 目录1. 概述:当文本处理遇上python图形界面2. 功能全景图:六大核心模块解析3.运行效果4. 相

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll