1、RAG的概述:
RAG(Retrieval Augmented Generation)技术,通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追溯的推理过程等。提供更准确的回答、降低推理成本、实现外部记忆。主要应用在问答系统、文本生成、信息检索以及图片描述上。(视为一个搜索引擎,在外部知识库中搜索相关知识)、下图为工作原理
向量数据库是RAG中专门存储外部知识库的地方,是实现快速回答的基础
RAG的工作示例
RAG常见优化方法
1、嵌入式优化(Embedding Optimization):结合稀疏和密集检索,面向多任务
2、索引优化(Indexing Optimization):细粒度分割(Chunk)、元数据
以上两种方法用于提高向量数据库的质量
3、查询优化(Query Optimization):查询拓展、转换以及多查询,使原始用户的问题更清晰
4、上下文的管理(Context Curation):重排(rerank)、上下文选择/压缩(减少冗余信息,提高大模型处理效率)选择小一些的语言模型来进行标记,或者训练信息提取器和压缩器
以上两种方法在之前Advanced RAG的前检索和后检索部分
在Retrieve部分,常见的三种方式分别为:
迭代检索(Iterative Retrieval):根据初始查询和迄今为止生成的文本进行重复搜索
递归检索(Recursive Retrieval):迭代细化搜索查询、链式推理(Chain-of-Thought)指导检索过程
自适应检索(Adaptive Retrieval):Flare、Self-RAG,使用LLMs主动决定检索的最佳时机和内容
LLM微调:检索微调、生成微调、双重微调
RAG vs 微调(Fine-tuning)
两个方面来比较:任务对外部知识的需求、任务对模型适配度的需求
涉及对抗噪音的鲁棒性、句答能力、信息融合能力、真实性、回答问题的相关度、总结能力、纠错能力等
二、茴香豆的介绍
拒答工作流的目的:应用于不同的场景和知识领域,应用在不同的应答频率 应答范围
实战:1、使用茴香豆WEB版创建自己领域的知识问答助手
在Web上创建知识库 并上传文档
2、在 InternLM Studio
上部署茴香豆技术助手
首先打开技术文档,进行环境配置,创建开发机 选择30%A100的GPU
进入开发机后,配置conda环境从官方环境复制运行 InternLM 的基础环境,命名为 InternLM2_Huixiangdou
,在命令行模式下运行:studio-conda -o internlm-base -t InternLM2_Huixiangdou
查看本地环境是否安装完成
激活安装的环境
下载基础文件
复制茴香豆所需模型文件,为了减少下载和避免 HuggingFace 登录问题,所有作业和教程涉及的模型都已经存放在 Intern Studio
开发机共享文件中。本教程选用 InternLM2-Chat-7B 作为基础模型。
创建model文件夹
复制BCE模型
复制大模型参数(下面的模型,根据作业进度和任务进行**选择一个**就行)
下载安装茴香豆
安装茴香豆运行所需依赖。
从茴香豆官方仓库下载茴香豆。
使用茴香豆搭建 RAG 助手
修改配置文件
用已下载模型的路径替换 /root/huixiangdou/config.ini
文件中的默认模型,需要修改 3 处模型地址,分别是:
命令行输入下面的命令,修改用于向量数据库和词嵌入的模型
用于检索的重排序模型
和本次选用的大模型
检查修改好的配置文件
创建知识库
本示例中,使用 InternLM 的 Huixiangdou 文档作为新增知识数据检索来源,在不重新训练的情况下,打造一个 Huixiangdou 技术问答助手。
首先,下载 Huixiangdou 语料:
提取知识库特征,创建向量数据库。数据库向量化的过程应用到了 LangChain 的相关模块,默认嵌入和重排序模型调用的网易 BCE 双语模型,如果没有在 config.ini
文件中指定本地模型路径,茴香豆将自动从 HuggingFace 拉取默认模型。
除了语料知识的向量数据库,茴香豆建立接受和拒答两个向量数据库,用来在检索的过程中更加精确的判断提问的相关性,这两个数据库的来源分别是:
- 接受问题列表,希望茴香豆助手回答的示例问题
- 存储在
huixiangdou/resource/good_questions.json
中
- 存储在
- 拒绝问题列表,希望茴香豆助手拒答的示例问题
- 存储在
huixiangdou/resource/bad_questions.json
中 - 其中多为技术无关的主题或闲聊
- 如:"nihui 是谁", "具体在哪些位置进行修改?", "你是谁?", "1+1"
- 存储在
运行下面的命令,增加茴香豆相关的问题到接受问题示例中:
再创建一个测试用的问询列表,用来测试拒答流程是否起效:
在确定好语料来源后,运行下面的命令,创建 RAG 检索过程中使用的向量数据库:
向量数据库的创建需要等待一小段时间,过程约占用 1.6G 显存。
完成后,Huixiangdou 相关的新增知识就以向量数据库的形式存储在 workdir
文件夹下。
检索过程中,茴香豆会将输入问题与两个列表中的问题在向量空间进行相似性比较,判断该问题是否应该回答,避免群聊过程中的问答泛滥。确定的回答的问题会利用基础模型提取关键词,在知识库中检索 top K
相似的 chunk
,综合问题和检索到的 chunk
生成答案。
运行茴香豆知识助手
我们已经提取了知识库特征,并创建了对应的向量数据库。现在,让我们来测试一下效果:
命令行运行:
关于问题的回答
生成的链接可用:
茴香豆进阶(选做)
加入网络搜索
茴香豆除了可以从本地向量数据库中检索内容进行回答,也可以加入网络的搜索结果,生成回答。
开启网络搜索功能需要用到 Serper 提供的 API:
使用远程模型
茴香豆除了可以使用本地大模型,还可以轻松的调用云端模型 API。
目前,茴香豆已经支持 Kimi
,GPT-4
,Deepseek
和 GLM
等常见大模型API。
想要使用远端大模型,首先修改 /huixiangdou/config.ini
文件中
启用远程模型可以大大降低GPU显存需求,根据测试,采用远程模型的茴香豆应用,最小只需要2G内存即可
利用 Gradio 搭建网页 Demo
启动Demo服务