初始化踩坑

Application

Paitesanshi/LLM-Agent-Survey (github.com)

method

RAG 是 Retrieval Augmented Generation 的缩写,意为检索增强生成。它是一个将大规模语言模型与来自外部知识源的检索相结合的框架,旨在改进问答能力。

  • RAG 的工作原理是通过工程化手段解决大语言模型知识更新困难的问题。其核心是利用外挂于语言模型的知识数据库(通常使用向量数据库)存储新数据、领域数据等。在知识问答过程中,RAG 通常分为索引、知识检索和基于内容的问答三个阶段。
  • 索引阶段:需要事先将文本数据进行处理,通过词嵌入等向量化技术,将文本映射到低维向量空间,并将向量存储到数据库中,构建起可检索的向量索引。
  • 知识检索阶段:当输入一个问题时,RAG 会对知识库进行检索,找到与问题最相关的一批文档。这需要依赖于第一阶段建立的向量索引,根据向量间的相似性进行快速检索。
  • 生成答案阶段:RAG 会把输入问题及相应的检索结果文档一起提供给语言模型,让语言模型充分把这些外部知识融入上下文,并生成相应的答案。
  • RAG 可以有效扩展大模型的知识库,在问答系统、对话系统等自然语言处理任务中有广泛的应用

微调

  1. 数据集
  2. 加载分词器和模型
  3. Tokenize_function 应用于整个数据集,并通过设置 batched=True 以批量方式来处理数据,加速处理过程
  4. 为了加快训练和测试的速度,我们可以从数据集中选取一部分样本作为训练集和测试集用于微调。使用 shuffle 函数对数据集进行随机打乱,通过 select函数选择训练数据集中的前 1000 个样本进行微调训练,测试数据集中的前 400 个样本进行微调测试。
  5. 定义微调参数
    1. 在我设计的这个案例里,使用了 transformers 库提供的 TrainingArguments 类,分别设置了输出目录、训练轮数(epoch)、批次大小(batch size)、学习率预热步数(warmup_steps)、权重衰减系数(weight_decay)以及日志输出的相关参数:
  6. 初始化 Trainer,将之前准备好的模型、训练参数、训练集、测试集以及分词器全部塞进 Trainer 里,然后调用 train 方法开始微调模型、评估模型,并保存微调后的模型:

  7. 预测。加载之前微调好的模型,使用 BertTokenizer 和 BertForSequenceClassification 的 from_pretrained 方法,分别加载预训练的分词器和我们自己微调好的模型。 Predict 函数:这个函数共需四个参数:texts(需要预测的文本)、tokenizer(分词器)、model(微调好的模型)以及 device(GPU 或 CPU)。
    函数内部首先判断读入的 texts 是单个文本还是文本列表。如果是单个文本,则将其转换为列表。然后,使用分词器对文本进行编码,将其转换为模型可接受的输入格式。这里使用了 padding、truncation 和 max_length 等参数,用于确保输入的一致性。接着将模型设置为评估模式(eval),并使用 torch.no_grad ()上下文管理器来禁用梯度计算,减少内存占用的同时加速推理过程。最后,将编码后的输入传递给模型,获取预测结果。为了看起来更直观,我把预测结果从数字标签转换为对应的文字描述(“负面评价”或“正面评价”),并返回结果列表。

PEFT

  • PEFT(Parameter-Efficient Fine-Tuning)是 hugging face 开源的一个参数高效微调大模型的工具,里面集成了4种微调大模型的方法,可以通过微调少量参数就达到接近微调全量参数的效果,使得在 GPU 资源不足的情况下也可以微调大模型。
  • 微调可以分为全微调和部分两个方法
    • 微调所有层:将预训练模型的所有层都参与微调,以适应新的任务。
    • 微调顶层:只微调预训练模型的顶层,以适应新的任务。
    • 冻结底层:将预训练模型的底层固定不变,只对顶层进行微调。
    • 逐层微调:从底层开始,逐层微调预训练模型,直到所有层都被微调。
    • 迁移学习:将预训练模型的知识迁移到新的任务中,以提高模型性能。这种方法通常使用微调顶层或冻结底层的方法