书生浦语第二期第三节课笔记(茴香豆:搭建你的 RAG 智能助理)_rag回香豆-程序员宅基地

技术标签: 笔记  语言模型  机器学习  人工智能  自然语言处理  

一.RAG技术的概述

        RAG(Retrieval Augmented Generation)技术,通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追溯的推理过程等。提供更准确的回答、降低推理成本、实现外部记忆。

        LLM会产生误导性的 “幻觉”,依赖的信息可能过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。

        RAG 通过在语言模型生成答案之前,先从广泛的文档数据库中检索相关信息,然后利用这些信息来引导生成过程,极大地提升了内容的准确性和相关性。RAG 有效地缓解了幻觉问题,提高了知识更新的速度,并增强了内容生成的可追溯性,使得大型语言模型在实际应用中变得更加实用和可信

        RAG的基本结构有哪些呢?

  • 要有一个向量化模块,用来将文档片段向量化。

  • 要有一个文档加载和切分的模块,用来加载文档并切分成文档片段。

  • 要有一个数据库来存放文档片段和对应的向量表示。

  • 要有一个检索模块,用来根据 Query (问题)检索相关的文档片段。

  • 要有一个大模型模块,用来根据检索出来的文档回答用户的问题。

 

 二.向量数据库

        向量数据库(Vector-Database)是RAG技术中专门储存外部数据的地方,主要实现了将文本以及相关的数据,通过预训练的模型转换为固定长度的向量(vector),这些向量能够很好的捕捉到我们嵌入的文本与知识。向量数据库的作用是存储大量文本片段的向量表示,并且允许模型通过余弦相似度等适当的相似度度量方法检索这些向量来获取相关信息,以辅助文本生成或理解任务。

 三.RAG技术相关杂谈

  1. RAG技术最早是由Lewis等人于2020年提出的,他们将强化学习、注意力机制和生成模型相结合,用于自然语言处理任务中的文本生成与理解。RAG技术在文本生成、问答系统等任务中取得了显著的性能提升,成为了自然语言处理领域的研究热点之一。RAG技术已经从用于问答系统、信息检索Naive RAG,进化为可以摘要生成Advanced RAG,现在已经有可以完成多模态任务、对话系统Modular RAG。 
  2. RAG的常见优化方法:
  3. RAG技术vs微调技术:

        a.方法论

  • RAG技术:RAG技术是一种结合了强化学习、注意力机制和生成模型的综合性方法。它不仅仅是一个单一的模型或技术,而是将多个领域的研究成果相互整合而成的。
  • 微调技术:微调技术通常指的是在预训练模型的基础上,使用少量标注数据对模型进行微小调整,以适应特定任务或领域的需求

        b.数据需求:

  • RAG技术:RAG技术通常需要大量的未标注数据用于预训练模型,然后可以通过有监督或强化学习的方式进行进一步的调优。
  • 微调技术:微调技术通常需要少量的标注数据用于模型微调,这使得微调技术在数据稀缺的情况下也能取得不错的效果。

        c.模型结构:

  • RAG技术:RAG技术通常由多个组件组成,包括生成器、注意力机制、强化学习部分等,模型结构较为复杂。
  • 微调技术:微调技术通常是在预训练模型的基础上进行微小的参数调整,模型结构相对简单。

         d.性能表现:

  • RAG技术:RAG技术在一些自然语言处理任务中表现出色,如生成式问答、摘要生成等,尤其在处理开放域的文本理解和生成任务中表现优异。
  • 微调技术:微调技术在特定任务上可以取得很好的性能,特别是在有限标注数据的情况下,微调技术往往能够更好地利用数据,实现任务定制化的效果。

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

茴香豆简介:

        茴香豆是一个基于LLMs的领域知识助手,由书生浦语团队开发的开源大模型应用。

  • 专为时事通讯(IM)工具中群聊场景优化的工作流,提供及时而又准确的技术支持和自动问答程序。
  • 通过应用检索增强生成(RAG)技术,茴香豆能够理解和高效准确的回应与特定知识领域相关的复杂查询。
  • 茴香豆应用于信息量巨大的用户群组,可以进行讨论与解答相关问题,也可以充当智能客服。传统的NLP解决方案无法准确解析用户意图,且无法给用户提供满意的答案,而茴香豆这种领域知识助手可以准确识别并回答有意义的相关领域的问题剔除与不回复无用问题或信息

茴香豆的特性:

茴香豆的构建:

  • 茴香豆的知识库构建通常是个人与企业的相关技术知识文档,目前支持Markdown文件、word文档、ppt文件等常用的文件类型,可以设置积极和消极的标签控制助手的回答范围。
  • 茴香豆读取用户问题以及相关文档的平台,在国内一般是微信群和飞书群,国外是discord和slack等技术交流应用软件。
  • 茴香豆目前支持调用本地或远端大模型的API,如书生浦语、通义千问、ChatGPT。Kimi等

茴香豆的工作流:预处理部分会将用户的输入筛选,转换为合适的问询,然后模型对于问询进行相应的分析,对问询给出评分,根据得分判断该问题是否进入问答环节,如果确定要回答,则由大模型根据问询和检索到的知识内容进行回答。以下是茴香豆的工作流程图:

LLM scroing是一个很重要的角色,通过更改它的阈值可以使茴香豆是一个话痨形象还是一个专业技术大师的形象。

下面是应用茴香豆web版创建属于自己的知识领域回答助手

第一步:打开茴香豆web版网页

https://openxlab.org.cn/apps/detail/tpoisonooo/huixiangdou-web

 第二步:输入知识库名称与密码

第三步:选择自己本地的文档进行上传

上传成功会有绿色编号,然后叉掉。

刷新后即可开始询问上传成功的文档知识库的问题。

茴香豆提问可以支持图文输入,但是有时候他也会无法读取一些问题,例如:

当然,你也可以设置问题正反例的内容,来让他进行判别哪些问题该回复,哪些问题不该回复。

以上就是茴香豆web创建自己领域的知识问答助手的内容。

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

以下内容是在InternStudio的开发机上运行的

第一步--准备工作

填写开发机名称后,点击选择镜像使用 Cuda11.7-conda 镜像,然后在资源配置中,使用 30% A100 * 1的选项,然后立即创建开发机器。

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

studio-conda -o internlm-base -t InternLM2_Huixiangdou

在本地查看环境,结果如下:

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

conda activate InternLM2_Huixiangdou

创建一个文件,使用软连接命令复制本地share文件准备好的bce-embedding-base_v1和bce-reranker-base_v1还有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

第二步--下载安装茴香豆

首先安装茴香豆运行所需依赖。

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

git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440

第三步--使用茴香豆搭建 RAG 助手

        要先把已下载模型的路径替换 /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

        然后创建知识库,先下载huixiangdou语料:

cd /root/huixiangdou && mkdir repodir

git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou

        运行下面的命令,增加茴香豆相关的问题到接受问题示例中:

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

 第四步--运行茴香豆知识助手 

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

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

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

 以下是基于InternLM2-Chat-7B模型的茴香豆通过RAG技术训练后的答案:

可对比基础模型 InternLM2-Chat-7B 关于  huixiangdou 问题 的原始输出:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Gotwant/article/details/137504727

智能推荐

linux devkmem 源码,linux dev/mem dev/kmem实现访问物理/虚拟内存-程序员宅基地

文章浏览阅读451次。dev/mem: 物理内存的全镜像。可以用来访问物理内存。/dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。调试嵌入式Linux内核时,可能需要查看某个内核变量的值。/dev/kmem正好提供了访问内核虚拟内存的途径。现在的内核大都默认禁用了/dev/kmem,打开的方法是在 make menuconfig中选中 device drivers --> ..._dev/mem 源码实现

vxe-table 小众但功能齐全的vue表格组件-程序员宅基地

文章浏览阅读7.1k次,点赞2次,收藏19次。vxe-table,一个小众但功能齐全并支持excel操作的vue表格组件_vxe-table

(开发)bable - es6转码-程序员宅基地

文章浏览阅读62次。参考:http://www.ruanyifeng.com/blog/2016/01/babel.htmlBabelBabel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行// 转码前input.map(item => item + 1);// 转码后input.map(function (item) { return item..._让开发环境支持bable

FPGA 视频处理 FIFO 的典型应用_fpga 频分复用 视频-程序员宅基地

文章浏览阅读2.8k次,点赞6次,收藏29次。摘要:FPGA视频处理FIFO的典型应用,视频输入FIFO的作用,视频输出FIFO的作用,视频数据跨时钟域FIFO,视频缩放FIFO的作用_fpga 频分复用 视频

R语言:设置工作路径为当前文件存储路径_r语言设置工作目录到目标文件夹-程序员宅基地

文章浏览阅读575次。【代码】R语言:设置工作路径为当前文件存储路径。_r语言设置工作目录到目标文件夹

background 线性渐变-程序员宅基地

文章浏览阅读452次。格式:background: linear-gradient(direction, color-stop1, color-stop2, ...);<linear-gradient> = linear-gradient([ [ <angle> | to <side-or-corner>] ,]? &l..._background线性渐变

随便推点

【蓝桥杯省赛真题39】python输出最大的数 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析-程序员宅基地

文章浏览阅读1k次,点赞26次,收藏8次。第十三届蓝桥杯青少年组python编程省赛真题一、题目要求(注:input()输入函数的括号中不允许添加任何信息)1、编程实现给定一个正整数N,输出正整数N中各数位最大的那个数字。例如:N=132,则输出3。2、输入输出输入描述:只有一行,输入一个正整数N输出描述:只有一行,输出正整数N中各数位最大的那个数字输入样例:

网络协议的三要素-程序员宅基地

文章浏览阅读2.2k次。一个网络协议主要由以下三个要素组成:1.语法数据与控制信息的结构或格式,包括数据的组织方式、编码方式、信号电平的表示方式等。2.语义即需要发出何种控制信息,完成何种动作,以及做出何种应答,以实现数据交换的协调和差错处理。3.时序即事件实现顺序的详细说明,以实现速率匹配和排序。不完整理解:语法表示长什么样,语义表示能干什么,时序表示排序。转载于:https://blog.51cto.com/98..._网络协议三要素csdn

The Log: What every software engineer should know about real-time data's unifying abstraction-程序员宅基地

文章浏览阅读153次。主要的思想,将所有的系统都可以看作两部分,真正的数据log系统和各种各样的query engine所有的一致性由log系统来保证,其他各种query engine不需要考虑一致性,安全性,只需要不停的从log系统来同步数据,如果数据丢失或crash可以从log系统replay来恢复可以看出kafka系统在linkedin中的重要地位,不光是d..._the log: what every software engineer should know about real-time data's uni

《伟大是熬出来的》冯仑与年轻人闲话人生之一-程序员宅基地

文章浏览阅读746次。伟大是熬出来的  目录  前言  引言 时间熬成伟大:领导者要像狼一样坚忍   第一章 内圣外王——领导者的心态修炼  1. 天纵英才的自信心  2. 上天揽月的企图心  3. 誓不回头的决心  4. 宠辱不惊的平常心  5. 换位思考的同理心  6. 激情四射的热心  第二章 日清日高——领导者的高效能修炼  7. 积极主动,想到做到  8. 合理掌控自己的时间和生命  9. 制定目标,马..._当狼拖着受伤的右腿逃生时,右腿会成为前进的阻碍,它会毫不犹豫撕咬断自己的腿, 以

有源光缆AOC知识百科汇总-程序员宅基地

文章浏览阅读285次。在当今的大数据时代,人们对高速度和高带宽的需求越来越大,迫切希望有一种新型产品来作为高性能计算和数据中心的主要传输媒质,所以有源光缆(AOC)在这种环境下诞生了。有源光缆究竟是什么呢?应用在哪些领域,有什么优势呢?易天将为您解答!有源光缆(Active Optical Cables,简称AOC)是两端装有光收发器件的光纤线缆,主要构成部件分为光路和电路两部分。作为一种高性能计..._aoc 光缆

浏览器代理服务器自动配置脚本设置方法-程序员宅基地

文章浏览阅读2.2k次。在“桌面”上按快捷键“Ctrl+R”,调出“运行”窗口。接着,在“打开”后的输入框中输入“Gpedit.msc”。并按“确定”按钮。如下图 找到“用户配置”下的“Windows设置”下的“Internet Explorer 维护”的“连接”,双击选择“自动浏览器配置”。如下图 选择“自动启动配置”,并在下面的“自动代理URL”中填写相应的PAC文件地址。如下..._設置proxy腳本