增强型检索生成技术(RAG)与大型语言模型(LLM)的结合应用

在面对训练数据中未包含的主题,如近期事件或深网数据(即搜索引擎未索引的数据)时,大型语言模型(LLM)往往难以准确回答。此外,由于无法获取答案的确切来源,验证答案的准确性变得具有挑战性。这时,增强型检索生成(RAG)技术就显得尤为重要。RAG结合了LLM的生成能力和从外部数据源检索信息的能力,并且能够引用答案的确切来源,极大地提高了答案的可验证性和可靠性。本文将探讨如何通过增强型检索微调(Retrieval Augmented Fine-tuning)来提升RAG的性能。

学习目标

学习者将识别大型语言模型(LLM)的局限性,并理解增强型检索生成(RAG)如何通过整合外部数据来提高答案的准确性和可靠性。参与者将学习如何为LLM微调准备数据,包括数据分块、问题生成以及选择正确答案和干扰项上下文。学习者将熟悉配置RAFTDatasetPack参数,以从LLM生成最佳问题和答案。学习理解语义分割节点解析器如何处理数据分块以及余弦不相似度在提高模型理解中的重要性。

目录

  • 适应LLMRAG
  • 什么是增强型检索微调?
  • 如何为LLM微调准备数据?
  • 增强型检索微调的实现
  • 常见问题解答

适应LLMRAG

在RAG中,将数据分割成块,找到与查询最相似的前K个块,并将这些内容块呈现给LLM以生成答案。然而,这些前K个块可能包含与给定查询相关和不相关的混合内容。LLM应该能够在给定的块中找到与查询相关的内容以生成答案。因此,如果能够针对这一特定任务微调LLM,即在提示中同时给出相关和不相关内容以生成答案,它可以提高RAG的准确性。

什么是增强型检索微调?

如上图所示,仅基于训练数据生成查询答案类似于“闭卷”考试。而“开卷”考试则是使用外部数据生成答案,这正是RAG所做的。在新方法中,训练LLM如何有效使用外部数据。这种方法显著提高了RAG的性能。

如何为LLM微调准备数据?

让深入了解如何为LLM微调准备数据:分割样本数据将样本数据分成块。每个块代表生成问题的潜在信息或上下文。生成问题为每个数据块创建相应的问题。这些问题旨在使用块内的信息来回答。使用正确答案上下文生成答案“正确答案上下文”指的是包含回答给定问题所需确切信息的数据块。使用此上下文以及问题,使用思维链提示生成答案。选择干扰上下文除了正确答案上下文外,还选择一些随机数据块作为“干扰上下文”。这些模拟噪声和不相关信息,挑战模型专注于相关上下文。编译训练数据编译器包括问题、正确答案上下文、干扰上下文和生成的答案,以及模型应如何识别和使用相关上下文回答问题的明确指示,形成一个全面的训练数据集。微调模型利用这个数据集,模型进行微调,学习准确区分相关信息和不相关信息,并根据提供的上下文生成精确答案。

增强型检索微调的实现

让现在学习增强型检索微调的实现。最初,使用以下命令安装所需的库:

pip install llama-index pip install llama-index-packs-raft-dataset

然后,可以导入RAFTDataset:

from llama_index.packs.raft_dataset import RAFTDatasetPack

对于Q/A生成的数据准备过程,RAFTDatasetPack使用以下参数进行配置:

filepath: 指定用于生成问题和答案的文件路径。此文件作为数据集的主要内容源 llm: 定义用于生成问题和答案的大型语言模型(LLM)。如果未指定模型,则默认使用GPT-4。选择模型时要慎重考虑成本。 embed-model: 用于计算查询与其上下文之间相似度的嵌入模型,这对于选择相关上下文块至关重要。 num_questions_per_chunk: 它决定了每个数据块要创建的问题数量,直接影响训练数据集的全面性。 num_distract_docs: 设置每个问题用作干扰器的随机上下文块的数量,挑战模型识别相关信息 chunk_size: Llama-index使用SemanticSplitterNodeParser将数据集分割成块。因此,此参数无效。 default_breakpoint_percentile_threshold: 控制基于它们的不相似度合并块的阈值。值越高,块越少,块越大,影响用于训练的数据的粒度。

语义分割节点解析器

SemanticNodeParser通过在句子级别上剖析数据,最初将文本分成更小的片段或“块”。以下是该过程的展开方式:

初始块形成系统将数据的每个句子分成初始块。

余弦不相似度计算对于每对相邻块,解析器计算余弦不相似度,即(1-余弦相似度)。此度量基于它们在多维语义空间中的向量表示,量化块之间的差异。

步骤1:导入所需库

from llama_index.llms.openai import OpenAI from llama_index.embeddings.huggingface import HuggingFaceEmbedding

步骤2:使用环境变量文件加载OpenAI API密钥

import os OPENAI_API_KEY = os.environ['OPENAI_API_KEY']

步骤3:定义LLM和嵌入模型

llm = OpenAI(model="gpt-3.5-turbo") embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-small-en-v1.5") !wget --user-agent "Mozilla" "https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt" -O './paul_graham_essay.txt' # 创建RAFT数据集对象 raft_dataset = RAFTDatasetPack(file_path="./paul_graham_essay.txt", llm=llm, embed_model=embed_model, num_questions_per_chunk=1, num_distract_docs=2, chunk_size=1024, default_breakpoint_percentile_threshold=99) # 创建数据集 dataset = raft_dataset.run() # 保存数据集为jsonl格式 output_path = './raft_dataset' dataset.to_json(output_path + ".jsonl")

步骤5:加载数据集

with open('./raft_dataset.jsonl', 'r') as json_file: dataset = list(json_file) # 可以使用以下方式访问数据集 json.loads(dataset[0]).keys() # 输出 # dict_keys(['id', 'type', 'question', 'context', 'oracle_context', 'cot_answer', 'instruction']) json.loads(dataset[0])['question'] # 输出 # 'What were the two main things the author worked on before college?'

关键收获

Q1. 什么是增强型检索生成?
A.RAG是一种通过整合外部数据源来增强大型语言模型(LLM)的技术。这使得LLM能够提供更准确、可验证和最新的答案。特别是对于原始训练数据中未包含的主题的查询。
Q2. 微调如何在此示例中提高LLM性能?
A. 通过使用特定数据集对LLM进行微调,包括相关和不相关的上下文,显著提高了LLM优先考虑相关信息的能力。这个过程导致对复杂查询生成更精确和上下文准确的响应。
Q3. RAFT数据集是什么,它与RAG有何关联?
A. RAFT数据集专门设计用于在RAG设置中对LLM进行微调。它包括一个精心准备的数据集,包含问题、用于正确答案的正确答案上下文和干扰上下文,以挑战模型。该设置教导LLM如何有效利用外部数据以精确可靠的响应,利用RAG模型的优势。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485