书生·浦语训练营二期第三次笔记-茴香豆:搭建你的 RAG 智能助理

news2025/1/22 22:51:40

RAG学习文档1:
https://paragshah.medium.com/unlock-the-power-of-your-knowledge-base-with-openai-gpt-apis-db9a1138cac4
RAG学习文档2: https://blog.demir.io/hands-on-with-rag-step-by-step-guide-to-integrating-retrieval-augmented-generation-in-llms-ac3cb075ab6f
词嵌入相关理论文档:https://openai.com/blog/introducing-text-and-code-embeddings; 对应论文https://arxiv.org/abs/2201.10005
openai升级版的词嵌入API文档:https://openai.com/blog/new-embedding-models-and-api-updates

RAG技术

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

在这里插入图片描述
在这里插入图片描述
RAG的检索阶段和生成阶段进行分别评价

在这里插入图片描述

茴香豆简介

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

在这里插入图片描述

茴香豆部署

环境配置

进入开发机后,从官方环境复制运行 InternLM 的基础环境,命名为 InternLM2_Huixiangdou,在命令行模式下运行:

studio-conda -o internlm-base -t InternLM2_Huixiangdou

在这里插入图片描述
复制完成后,在本地查看环境。

conda env list

结果如下所示。
在这里插入图片描述

运行 conda 命令,激活 InternLM2_Huixiangdou python 虚拟环境:

conda activate InternLM2_Huixiangdou

下载基础文件

# 创建模型文件夹
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 

下载安装茴香豆

配环境的时候清华源崩了,换成阿里源

pip install --index-url https://mirrors.aliyun.com/pypi/simple/ 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
# 下载 repo
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440
#茴香豆工具在 Intern Studio 开发机的安装工作结束。如果部署在自己的服务器上,参考上节课模型下载内容或本节 3.4 配置文件解析 部分内容下载模型文件。

在这里插入图片描述

使用茴香豆搭建RAG助手

修改配置文件

用已下载模型的路径替换 /root/huixiangdou/config.ini 文件中的默认模型,需要修改 3 处模型地址,分别是:

  1. 命令行输入下面的命令,修改用于向量数据库和词嵌入的模型
sed -i '6s#.*#embedding_model_path = "/root/models/bce-embedding-base_v1"#' /root/huixiangdou/config.ini
- `sed -i` 表示直接修改文件内容,而不是输出到终端。
  • 6s 表示要替换第6行的内容。
  • # 用作分隔符,可以替代常用的 /,以避免与路径中的 / 冲突。
  • .* 匹配任意字符,表示替换整行的内容。
  • embedding_model_path = "/root/models/bce-embedding-base_v1" 是要替换的新内容,设置了用于向量数据库和词嵌入的模型路径。

这条命令的作用是将 /root/huixiangdou/config.ini 文件的第6行修改为 embedding_model_path = "/root/models/bce-embedding-base_v1",设置了向量数据库和词嵌入使用的模型路径。

  1. 用于检索的重排序模型
sed -i '7s#.*#reranker_model_path = "/root/models/bce-reranker-base_v1"#' /root/huixiangdou/config.ini

与第一条命令类似,这条命令将 /root/huixiangdou/config.ini 文件的第7行修改为 reranker_model_path = "/root/models/bce-reranker-base_v1",设置了用于检索的重排序模型的路径。

  1. 和本次选用的大模型
sed -i '29s#.*#local_llm_path = "/root/models/internlm2-chat-7b"#' /root/huixiangdou/config.ini

与前两条命令类似,这条命令将 /root/huixiangdou/config.ini 文件的第29行修改为 local_llm_path = "/root/models/internlm2-chat-7b",设置了本次选用的大模型的路径。
在这里插入图片描述
现在config.ini中的地址信息都被更改了:

在这里插入图片描述

创建知识库

使用 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 检索过程中使用的向量数据库:

# 创建向量数据库存储目录
cd /root/huixiangdou && mkdir workdir 

# 分别向量化知识语料、接受问题和拒绝问题中后保存到 workdir
python3 -m huixiangdou.service.feature_store --sample ./test_queries.json

向量数据库的创建需要等待一小段时间,过程约占用 1.6G 显存。

完成后,Huixiangdou 相关的新增知识就以向量数据库的形式存储在 workdir 文件夹下。

检索过程中,茴香豆会将输入问题与两个列表中的问题在向量空间进行相似性比较,判断该问题是否应该回答,避免群聊过程中的问答泛滥。确定的回答的问题会利用基础模型提取关键词,在知识库中检索 top K 相似的 chunk,综合问题和检索到的 chunk 生成答案。
运行截图:
在这里插入图片描述
拒答流程测试中,第一个问题“huixiangdou是什么?”顺利的通过了测试,检索模块也搜寻到了相关的语料。
在这里插入图片描述

第二个问题,被拒答模块成功的拒绝了:
但是我在跟着文档走的时候遇到了一个问题,提示
在这里插入图片描述
断言语句 assert (len(context) <= context_max_length) 用于确保上下文的长度(len(context))小于或等于允许的最大上下文长度(context_max_length)。如果条件不满足,就会引发 AssertionError。
我把retriver.py中的context_max_length变长了,之后可以实现和视频中一样的运行流程。
在这里插入图片描述
在这里插入图片描述

运行茴香豆知识助手

我们已经提取了知识库特征,并创建了对应的向量数据库。现在,让我们来测试一下效果:

命令行运行:

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

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

RAG 技术的优势就是非参数化的模型调优,这里使用的仍然是基础模型 InternLM2-Chat-7B, 没有任何额外数据的训练。面对同样的问题,我们的茴香豆技术助理能够根据我们提供的数据库生成准确的答案。

  1. 首先,通过命令 python3 -m huixiangdou.main --standalone 启动茴香豆程序。--standalone 参数表示以独立模式运行。

  2. 程序开始加载各种模型和配置:

    • 加载了一些自然语言处理的模型,如 SentenceTransformer 和 BCEmbedding 的 RerankerModel。
    • 加载了一些配置文件,如 config.ini,其中包含了模型路径、数据路径和日志路径等设置。
  3. 程序启动了一个 HTTP 服务,监听在 0.0.0.0:8888,等待客户端的请求。

在这里插入图片描述

  1. 收到一个问题 “huixiangdou 是什么?”,程序开始处理(使用Prompt和internlm2-7b进行交互):
    • 首先判断这是一个有主题的疑问句,得分(这里打分好像失败了,模型回复无法进行打分)。
    • 然后提取出问题的主题是 “huixiangdou 的含义或定义”。
    • 在知识库中搜索相关的材料,找到了 README.md 文件,判断问题和材料的相关度为8分。
    • 使用 InternLM2-chat-7b 模型根据材料生成了一个回答,解释了 HuixiangDou 的定义和特点。
    • 将问题、回答和相关材料返回给客户端。
      在这里插入图片描述
      在这里插入图片描述

最后,这是茴香豆返回的最终答案:
在这里插入图片描述

  1. 收到另一个问题 “茴香豆怎么部署到微信群”,程序再次处理:
    • 判断这是一个得分为8分的疑问句,主题是 “茴香豆的微信部署”。
    • 在知识库中找到了相关的 README_zh.md 文件,问题和材料的相关度为8分。
    • 使用 InternLM2-chat-7b 模型根据材料生成了一个详细的部署步骤说明。
    • 将问题、回答和相关材料返回给客户端。
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述

茴香豆返回的最终答案:
在这里插入图片描述

  1. 收到第三个问题 “今天天气怎么样?”,程序判断这个问题与知识库无关,直接返回空答案。
    (这里判断主题相似度的prompt好像缺失了,直接就返回了空答案。)
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1576313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Adobe InDesign 2024 v19.3 (macOS, Windows) - 版面设计和桌面出版软件

Adobe InDesign 2024 v19.3 (macOS, Windows) - 版面设计和桌面出版软件 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Ad…

Spring 如何优雅的灵活的Http重试

1、背景说明 在互联网时代&#xff0c; 不同系统之间大多数是通过http调用&#xff0c;调用过程中会超时、异常等过种问题。为了保证业务稳定&#xff0c;http 重试是常用方案。下面列举几种方案。 2、Http重试方案介绍 2.1 传统方案 1、使用传统的递归调用&#xff0c;实现方…

42.基于SpringBoot + Vue实现的前后端分离-服装销售平台管理系统(项目 + 论文)

项目介绍 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的交换和信息流通显得特别重要。因此&#xff0c;开发合适的服装销售平台成为企业必然要走的一步棋。开发合适的服…

让H5页面轻松打开第三方App,Xinstall助力实现无缝跳转

在移动互联网时代&#xff0c;H5页面因其跨平台、易传播的特性而被广泛应用&#xff0c;然而H5页面在打开第三方App时往往存在诸多不便。用户需要通过复杂的操作步骤才能实现跳转&#xff0c;这无疑降低了用户体验。为了解决这一难题&#xff0c;Xinstall应运而生&#xff0c;为…

达梦备份与恢复

达梦备份与恢复 基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例1 设置bak_path路径 --创建备份文件存放目录 su - dmdba mkdir -p /dm8/backup--修改dm.ini 文件…

【面试题】RocketMQ的工作流程?

RocketMQ是一种开源的分布式消息队列系统&#xff0c;它具有高吞吐量、低延迟和高可靠性的特点。下面是RocketMQ的简要工作流程&#xff1a; Producer&#xff08;生产者&#xff09;发送消息&#xff1a;消息的生产者将消息发送到RocketMQ。生产者将消息封装为一个消息对象&am…

DIY自己的AI

一、开源AI大语言模型 目前开源的AI大语言模型(LLM)已经非常的多了&#xff0c;以下是收集的一些LLM&#xff1a; LLaMA LLaMA&#xff08;Large Language Model Meta AI&#xff09;&#xff1a;LLaMA是由MetaAI的Facebook人工智能实验室&#xff08;FAIR&#xff09;发布的…

html5分步问卷调查表模板源码

文章目录 1.设计来源1.1 问卷调查11.2 问卷调查21.3 问卷调查31.4 问卷调查41.5 问卷调查51.6 问卷调查6 2.效果和源码2.1 完整效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/137454703 html5分…

2024/4/1—力扣—连续数列

代码实现&#xff1a; 思路&#xff1a;最大子数组和 解法一&#xff1a;动态规划 #define max(a, b) ((a) > (b) ? (a) : (b))int maxSubArray(int* nums, int numsSize) {if (numsSize 0) { // 特殊情况return 0;}int dp[numsSize];dp[0] nums[0];int result dp[0];fo…

【动态规划-状态压缩dp】【蓝桥杯备考训练】:毕业旅行问题、蒙德里安的梦想、最短Hamilton路径、国际象棋、小国王【已更新完成】

目录 1、毕业旅行问题&#xff08;今日头条2019笔试题&#xff09; 2、蒙德里安的梦想&#xff08;算法竞赛进阶指南&#xff09; 3、最短Hamilton路径&#xff08;《算法竞赛进阶指南》&模板&#xff09; 4、国际象棋&#xff08;第十二届蓝桥杯省赛第二场C A组/B组&#…

MySQL的基本查询

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容介绍了mysql的基本查询部分的知识&#xff0c;包括Crea…

日期时间相关的类

分界线jdk8 jdk8之前和之后分别提供了一些日期和时间的类&#xff0c;推荐使用jdk8之后的日期和时间类 Date类型 这是一个jdk8之前的类型&#xff0c;其中有很多方法已经过时了&#xff0c;选取了一些没有过时的API //jdk1.8之前的日期 Date Date date new Date(); // 从1970年…

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络…

白色磨砂质感html5页源码

白色磨砂质感html5页源码&#xff0c;简约的基础上加上了团队成员&#xff0c;自动打字特效音乐播放器存活时间 源码下载 https://www.qqmu.com/2980.html

实战搭建网易有道的QAnything(一) 前提准备工作

前言&#xff1a; 早上地铁上刷到了关于有道的QAnything的介绍&#xff0c;刚好也有搭建一个知识库的想法&#xff0c;既然有想法那就干起来&#xff0c;电脑的操作系统用的win11&#xff0c;显卡用了两块4060。 一、安装windows子系统 1. 开始-》运行-》控制面板 打开原始的控…

开启Java之旅——用Java实现简易的图书管理系统(24.4.7)

图书管理系统 一、设计思路 1、首先需要区分两类人&#xff0c;图书管理员和借书用户&#xff0c;不同的用户要展现不同的界面&#xff0c;利用继承和多态可以将其实现。 2、要将不同的操作封装起来&#xff0c;单独设计成为一个类&#xff0c;为了规范实现&#xff0c;需要…

【CicadaPlayer】demuxer_service中DASH的简单理解

DASH协议 dash 是属于demuxer模块的 MPEG-DASH是一种自适应比特率流技术,可根据实时网络状况实现动态自适应下载。和HLS, HDS技术类似, 都是把视频分割成一小段一小段, 通过HTTP协议进行传输,客户端得到之后进行播放;不同的是MPEG-DASH支持MPEG-2 TS、MP4(最新的HLS也支持…

【IPV6】--- IPV6过渡技术之6 over 4隧道配置

1. IPV4和IPV6有什么区别&#xff1f; 2. IPV6如何在设备上配置&#xff1f; 3. IPV4和IPV6如何跨协议实现通信&#xff1f; 1. IPV4和IPV6 --- IPV6技术 - IP协议第六版 - 128位二进制数 - 2^12843亿*43亿*43亿*43亿 --- IPV4技术 - IP协议第四版 - 192.1…

element-ui使用记录

element-ui的组件名就是类名 样式穿透&#xff08;用来修改没有类名的子组件样式&#xff09; 例如修改头部具名插槽的样式&#xff08;但是无法定位该元素&#xff09; 查看最后生成的html结构中对应的结构&#xff08;这里的头部有类名&#xff0c;可以直接对该类名进行样…

C#学习笔记9:winform上位机与西门子PLC网口通信_上篇

今日继续我的C#学习笔记&#xff0c;今日开始学习打开使用千兆网口来进行与西门子PLC的通信&#xff1a; 文章提供整体代码、解释、测试效果截图、整体测试工程下载&#xff1a; 主要包含的知识有&#xff1a;下载NuGet程序包、西门子PLC及通信协议、搭建虚拟的S7通信仿真环境…