【大模型LLMs】RAG实战:基于LlamaIndex快速构建RAG链路
- RAG框架:LlamaIndex
- 大模型底座:Qwen2-7B-Instruct
- Embedding模型:bge-base-zh-v1.5
- Rerank模型:bge-reranker-base
- 数据集:cmrc2018(该数据集禁止商用)
1. 环境准备
安装LlamaIndex的相关依赖
pip install llama-index
pip install llama-index-llms-huggingface
pip install llama-index-embeddings-huggingface
pip install llama-index-postprocessor-flag-embedding-reranker
pip install FlagEmbedding
pip install datasets
从HuggingFace安装将要使用的LLMs以及embedding model,这里我们选择Qwen/Qwen2-7B-Instruct作为大模型底座,选择BAAI/bge-base-zh-v1.5作为embedding模型用于对文档进行向量化表征,选择BAAI/bge-reranker-base作为rerank模型用于对粗排后的参考信息进行重排序
这里介绍快速下载huggingface模型的命令行方法:
1. 首先安装依赖
pip install -U huggingface_hub
pip install -U hf-transfer
2. 设置环境变量(设置hf环境变量为1用于提升下载速度;设置镜像站地址)
export HF_HUB_ENABLE_HF_TRANSFER=1
export HF_ENDPOINT="https://hf-mirror.com"
3. 安装相应的模型(以Qwen2-7B-Instruct为例,前面是huggingface上的模型名,后面是本地下载的路径)
huggingface-cli download Qwen/Qwen2-7B-Instruct --local-dir ./Qwen2-7B-Instruct
huggingface-cli download BAAI/bge-base-zh-v1.5 --local-dir ./bge-base-zh-v1.5
huggingface-cli download BAAI/bge-reranker-base --local-dir ./bge-reranker-base
2. 数据准备
使用开源数据集 cmrc2018 构建本地知识库,该数据集由人类专家在维基百科段落上标注的近2万个真实问题组成,包含上下文(可以用于构建本地知识库)、问题和答案
我们读取cmrc的train数据集,并将question,answer以及context存储到本地data目录下的cmrc-eval-zh.jsonl文件下,代码如下:
import json
from tqdm import tqdm
from datasets import load_dataset
cmrc = load_dataset("cmrc2018")
with open("../data/cmrc-eval-zh.jsonl", "w") as f:
for train_sample in tqdm(cmrc["train"]):
qa_context_mp = {
"question": train_sample["question"],
"reference_answer": train_sample["answers"]["text"][0],
"reference_context": train_sample["context"]
}
f.write(json.dumps(qa_context_mp, ensure_ascii=False) + "\n")
3. RAG框架构建
在具体构建rag链路之前,我们初始化一个日志记录logger,用于记录运行过程中的信息
import logging
# 设置logger
logging.basicConfig(
level=logging.DEBUG,
filename='../out/output.log', # 替换成保存日志的本地目录
datefmt='%Y/%m/%d %H:%M:%S',
format='%(asctime)s - %(name)s - %(levelname)s - %(lineno)d - %(module)s - %(message)s'
)
logger = logging.getLogger(__name__)
3.1 数据读取 + 数据切块
读取第二节中构建的cmrc-eval-zh.jsonl文件,将reference_context字段读取出来保存到list中作为后续知识库的文本,另外将question-answer pair进行保存,用于后续模型的推理。然后构建llama_index.core的Document对象。如果是本地的txt文档知识库,也可以直接使用SimpleDirectoryReader方法
from llama_index.core import Document, SimpleDirectoryReader
def get_documents_q