视频链接:茴香豆:搭建你的 RAG 智能助理_哔哩哔哩_bilibili
基础作业 - 完成下面两个作业
1. 在茴香豆 Web 版中创建自己领域的知识问答助手
- 参考视频零编程玩转大模型,学习茴香豆部署群聊助手
- 完成不少于 400 字的笔记 + 线上茴香豆助手对话截图(不少于5轮)
- (可选)参考 代码 在自己的服务器部署茴香豆 Web 版
2.在 InternLM Studio
上部署茴香豆技术助手
- 根据教程文档搭建
茴香豆技术助手
,针对问题"茴香豆怎么部署到微信群?"进行提问 - 完成不少于 400 字的笔记 + 截图
进阶作业 (作业难度非常难, 不用纠结,请先学完后续的课程内容再来做此处的进阶作业~)
A.【应用方向】 结合自己擅长的领域知识(游戏、法律、电子等)、专业背景,搭建个人工作助手或者垂直领域问答助手,参考茴香豆官方文档,部署到下列任一平台。
- 飞书、微信
- 可以使用 茴香豆 Web 版 或 InternLM Studio 云端服务器部署
- 涵盖部署全过程的作业报告和个人助手问答截图
B.【算法方向】尝试修改 good_questions.json
、调试 prompt 或应用其他 NLP 技术,如其他 chunk 方法,提高个人工作助手的表现。
- 完成不少于 400 字的笔记 ,记录自己的尝试和调试思路,涵盖全过程和改进效果截图
大作业项目选题
A.【工程方向】 参与贡献茴香豆前端,将茴香豆助手部署到下列平台
- Github issue、Discord、钉钉、X
B.【应用方向】 茴香豆RAG-Agent
- 应用茴香豆建立一个 ROS2 的机器人Agent
C.【算法方向】 茴香豆多模态
- 参与茴香豆多模态的工作
基础作业:
一、在茴香豆 Web 版中创建自己领域的知识问答助手
1、检索增强生成(Retrieval Augmented Generation, RAG)基本概念
RAG 是一种结合了检索和生成的技术,它通过从数据源(外部知识库)中检索信息来辅助大语言模型(Large Language Model, LLM)生成答案。简而言之,RAG 结合了搜索技术和大语言模型的提示词功能,即向模型提出问题,通过检索与用户输入相关的信息片段,并以搜索算法找到的信息作为背景上下文,这些查询和检索到的上下文信息都会被整合进发送给大语言模型的提示中,从而生成更准确、更丰富的回答。
RAG可以有效解决LLM生成幻觉,提供过期知识以及缺乏透明和可追溯的推理过程等问题,提供更准确丰富的回答,降低成本,尤其是模型微调成本以及实现外部记忆。可以应用于问答系统、文本生成、信息检索以及图片描述等各个方面。
RAG 对于LLM来说就像学生的开卷考试一样。在开卷考试中,学生可以携带参考材料,例如课本或笔记,可以用来查找相关信息来回答问题。开卷考试背后的想法是,测试的重点是学生的推理能力,而不是他们记忆特定信息的能力。
同样,事实知识与LLM的推理能力分离,并存储在外部知识源中,可以轻松访问和更新:
- 「参数知识」:在训练期间学习到的知识,隐式存储在神经网络的权重中。
- 「非参数知识」:存储在外部知识源中,例如向量数据库。
RAG类似于为模型提供教科书,使其能够根据特定查询检索信息。适用于模型需要回答特定查询或处理特定信息检索任务的场景,而微调(FT)则类似于让学生通过广泛学习来内化知识,适用于模型需要复制特定结构、风格或格式的情况。FT可以通过加强基础模型知识、调整输出和教授复杂指令来提高模型性能和效率,但不适合整合新知识或快速迭代新用例。RAG 和 FT,并不是相互排斥的,它们可以互补,从不同层面增强模型的能力。在某些情况下,它们的联合使用可能会产生最佳性能。涉及 RAG 和 FT 的优化过程可能需要多次迭代才能达到令人满意的结果。
RAG最早是由Meta(Facebook)Lewis等人在2020年提出(Patrick Lewis, Ethan Perez, Aleksandra Piktus, Fabio Petroni, Vladimir Karpukhin, Naman Goyal, Heinrich Kuttler, Mike Lewis, Wen-tau Yih, Tim ¨ Rocktaschel, et al. Retrieval-augmented generation for ¨ knowledge-intensive nlp tasks. Advances in Neural Information Processing Systems, 33:9459–9474, 2020.)RAG发展时间较短,但是发展迅猛。
原始RAG(Naive RAG)是最早的研究范式,主要包括建立索引,检索,生成三部分,用于问答系统、信息检索等场景。高级RAG(Advanced RAG)针对原始RAG的不足之处进行了有针对性的改进。这些改进涉及检索生成的质量、索引的优化、检索过程的优化等多个方面,可以用于摘要生成、内容推荐等场景。模块化RAG(Modular RAG)结构打破了传统的原始RAG框架(索引、检索和生成),提供了更大的多样性和整个过程的灵活性。它整合了各种方法来扩展功能模块,例如在相似性检索中加入搜索模块,以及在检索器中应用微调方法。此外,特定问题的出现促使重构的RAG模块和迭代方法的出现。模块化RAG范式正成为RAG领域的主流,允许采用序列化管道或跨多个模块的端到端训练方法,可以用于多模态任务、对话系统等场景。
2、RAG工作原理
RAG中有三个重要概念,一是索引(Indexing),通过先分块(chunk)对知识源中一系列相关文档进行索引,生成块的嵌入,编码成向量后将其存储到向量存储(Vector-DB)中,在推断时,查询也以类似的方式嵌入。二是检索(Retrieval),接收到用户问题后,将问题也编码成向量,在Vector-DB中通过将查询与索引向量进行比较来获取最相关的文档块。三是生成(Generation),相关文档与原始提示问题相结合,作为附加上下文。然后将合并的文本和提示传递给响应生成模型,然后作为系统的最终输出准备给用户。
3、向量数据库(Vector-DB)
Vector-DB是一类以向量为基本数据类型的数据库系统,以向量作为数据存储的基本单元。每个向量都具有唯一的标识符,并可存储在一个连续的向量空间中。向量通常由一组有序数构成,用于表示具有多个属性的实体,如文本、图像和音频等。在Vector-DB中,广泛采用高维索引技术,通过多级索引结构将向量空间划分为多个超平面,实现对大规模高维向量数据的迅速定位和访问。Vector-DB有如下特征:多级结构的高维索引,相似性查询(余弦相似度或欧氏距离等),向量聚合(将多个向量合并为一个新的向量。这种操作用于计算多个向量的组合或平均值,为用户提供更全面的结果。),高效存储(压缩技术和编码方案等),高扩展性(能够处理大规模数据集并支持高并发访问。采用分布式架构和并行计算技术,实现大规模数据处理和高效查询)等。
4、RAG流程示例
上图是经典的RAG工作流程,它主要由三个基本步骤组成:
1、索引:文档库被划分为较短的片段,使用编码器构建矢量索引。
2、检索:根据给定的问题和块与相关文档片段之间的相似性检索出相关的文档片段。
3、生成:使用检索到的上下文作为条件,根据问题生成答案
5、RAG常见优化方法
嵌入优化和索引优化是用于提升Vector-DB质量,查询优化和上下文管理即前文提到的Advanced RAG中前检索和后检索部分。检索部分的优化,包括迭代、递归、自适应检索,这七种方法都是针对RAG模块和流程进行的优化。而大模型(LLM)也是RAG技术的重要组成部分,所以对LLM的微调(FT)也是RAG优化的常见思路,可以根据场景和数据特征,对LLM进行定向FT,也可以根据LLM对于检索和生成的参与,进行有针对性的FT。
6、RAG评估框架和基准测试
7、RAG总结
线上茴香豆助手对话
茴香豆完整工作流如下:
首先创建KnowBase和Password
然后上传相关文件(机动车交通事故责任强制保险条款.pdf)
对话测试:
二、在 InternLM Studio
上部署茴香豆技术助手
1、配置开发机
2、studio-conda -o internlm-base -t InternLM2_Huixiangdou
3、ALL DONE后conda activate InternLM2_Huixiangdou
4、下载基础文件
cd /root && mkdir models
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
5、下载安装茴香豆
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
6、使用茴香豆搭建 RAG 助手
首先修改配置文件
cp config.ini config.ini.bak
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
然后创建知识库,下载语料
cd /root/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
接着增加茴香豆相关的问题到接受问题示例中
再创建一个测试用的问询列表,用来测试拒答流程是否起效:
在确定好语料来源后,运行下面的命令,创建 RAG 检索过程中使用的向量数据库:
最后运行茴香豆知识助手
问题1:huixiangdou 是什么?
问题2:茴香豆怎么部署到微信群?
问题3:今天天气怎么样?