参考资料:
Retrieval-Augmented Generation for Large Language Models: A Survey
https://github.com/InternLM/Tutorial/tree/camp2/huixiangdou
0 检索增强生成 (Retrieval-Augmented Generation, RAG)
0.1 RAG应用场景
将大模型应用于实际业务场景(**垂直领域大模型**)时发现通用的基础大模型基本无法满足实际业务需求,主要有以下几方面原因:
1、知识过时、不透明
2、幻觉
3、数据安全性
4、无法追踪推理过程
0.2 RAG 定义
检索增强生成 (Retrieval-Augmented Generation, RAG)是一种结合了检索和生成的技术,旨在通过利用外部数据库来大幅度提升LLM的性能,它通过语义相似性检索与用户输入信息相关的片段,并结合这些信息来生成更加准确、更加丰富的回答。
0.3 RAG基本框架
0.3.1 索引 Index
索引工作首先需要提取不同格式(PDF, HTML, Word, Code, Markdown, ... )的原始数据,并对原始数据进行清洗。然后讲这些数据转换成统一的纯文本格式。为了适应语言模型的上下文限制,文本被分割成更小、更易于处理的数据块。然后使用Embedding Model将这些数据块编码成向量,并存储在向量数据库中。
0.3.2 检索 Retrieve
在接收到用户的query后,RAG使用与index相同的Embedding Model将query同样转换成向量表示。然后,计算query编码向量和向量数据库中块向量之间的语义相似度。系统优先检索与query最相似的k个数据块,这些数据块在后面用作提示中的扩展上下文。
0.3.3 生成 Generation
将检索到的文档块与原始问题作为提示(prompt)输入到LLM中,生成最终的回答。在持续对话的情况下,任何现有的对话历史都可以整合到prompt中,从而使LLM能够更有效地进行多轮对话。
0.4 RAG vs Fine-tuing
0.4.1 RAG
- 非参数记忆,利用外部知识库提供实时更新的信息。
- 能够处理知识密集型任务,提供准确的事实性回答。
- 通过检索增强,可以生成多样化内容。
使用场景:适用于需要结合最新信息和实时数据的任务。
优势:动态知识更新,处理长尾知识
局限:依赖于外部知识库的质量和覆盖范围。依赖大模型能力。
0.4.2 Fine-tuning
- 参数记忆,通过在特定任务数据上训练,模型可以更好地适应该任务。
- 通常需要大量标注数据来进行有效微调。
- 微调后的模型可能会过拟合,导致模型性能下降。
使用场景:适用于数据可用切需要模型高度专业化的任务。
优势:模型针对特定任务进行优化。
局限:需要大量标注的数据,且对新任务的适应性比较差。
在第三讲中,北辰老师选用了茴香豆应用,其中包含了RAG技术,可以快速、高效的搭建自己的知识领域助手。
1 环境配置
1.1 配置基础环境
进入开发机后,从官方环境复制运行 InternLM 的基础环境,并命名为 InternLM2_Huixiangdou,在 Ternminal 中输入:
studio-conda -o internlm-base -t InternLM2_Huixiangdou
然后激活虚拟环境
conda activate InternLM2_Huixiangdou
1.2 下载基础文件
# 创建模型文件夹
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
1.3 下载茴香豆相关依赖
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
# 下载 repo
git clone https://github.com/internlm/huixiangdou && cd huixiangdou
git checkout 447c6f7e68a1657fce1c4f7c740ea1700bde0440
2 使用茴香豆搭建RAG助手
2.1 修改配置文件
首先将模型配置文件中的默认路径替换成自己的模型路径。
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
sed命令可依照脚本的指令来处理、编辑文本文件。
- 6s 文件的表示第6行,
- # 表示一个分隔符,
- .* 表示匹配任意个字符,替换整行内容。
将 /root/huixiangdou/config.ini 的第6行替换成 embedding_model_path = "/root/models/bce-embedding-base_v1"
将 /root/huixiangdou/config.ini 的第7行替换成 reranker_model_path = "/root/models/bce-reranker-base_v1"
将 /root/huixiangdou/config.ini 的第29行替换成 local_llm_path = "/root/models/internlm2-chat-7b"
2.2 数据准备
下载 Huixiangdou 语料
cd /root/huixiangdou && mkdir repodir
git clone https://github.com/internlm/huixiangdou --depth=1 repodir/huixiangdou
建立接受和拒答两个向量数据库,茴香豆会通过这两个数据库进行判断提问的相关性。
- huixiangdou/resource/good_questions.json
- huixiangdou/resource/bad_questions.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 生成答案。
2.3 运行茴香豆知识助手
# 填入问题
sed -i '74s/.*/ queries = ["huixiangdou 是什么?", "茴香豆怎么部署到微信群", "今天天气怎么样?"]/' /root/huixiangdou/huixiangdou/main.py
# 运行茴香豆
cd /root/huixiangdou/
python3 -m huixiangdou.main --standalone