如果你一直在跟着Fanstuck博主的脚步探索AI大模型的相关内容,从最初的大模型Prompt工程解析,DeepSeek全面解析,到实际的私有化大模型开发部署,再到深入NL2SQL、知识图谱大模型和ChatBI等更高阶应用.我是Fanstuck,致力于将复杂的技术知识以易懂的方式传递给读者,热衷于分享最新的行业动向和技术趋势。如果你对大模型的创新应用、AI技术发展以及实际落地实践感兴趣,那么请关注Fanstuck。
大模型微调(Fine-Tuning)和检索增强生成(RAG,Retrieval-Augmented Generation)是两种在模型应用中常见的技术。它们分别通过不同的方式提升模型在特定任务上的性能。大模型微调通过对已有的预训练模型进行再训练,使其更好地适应特定的应用场景;而RAG则通过引入外部的知识源,通过检索和生成相结合的方式,提高模型的回答质量和准确性。
例如,在一些需要特定领域知识的应用中,像法律文书解读或者医学知识问答,微调可以帮助模型更好地理解行业术语和专业表达。而对于一些开放性的问题,RAG则能通过搜索外部资料,实时更新模型的知识库,从而为用户提供更为精确的答案。
本篇文章将详细解释大模型微调和RAG检索增强的技术特点和应用场景,通过深入的对比帮助读者理解二者的区别,帮助大家在不同的应用场景中做出更合适的选择。
大模型微调(Fine-Tuning)是指在已有的大规模预训练模型的基础上,使用小规模的特定任务数据进行再次训练,调整模型参数,使其更好地适应特定任务或领域的需求。这一过程类似于一个已经掌握基础知识的人,通过针对性的学习和训练,进一步提升在某一专业领域的能力。
简单来说,大模型微调就是在通用的大模型(如GPT、DeepSeek等)已经具备一定知识的基础上,让模型能够更精确地处理特定领域或特定任务的数据,从而提高其在实际应用中的表现。微调就像是让大模型“专精”某个领域或任务,而不是“面面俱到”。它能帮助模型从通用的“百科全书”升级为某个具体任务的“专家”。
微调的过程通常分为以下几个步骤:
可能大家一开始没有经历过大模型微调没有一个过程概念会感觉有点难以理解,抽象。我们以一个详细的项目场景进行大模型微调,帮助大家理解大模型微调的过程和具体使用方法。
我们选择了DeepSeek-R1-7b作为微调模型,这款模型基于Qwen2.5-7B架构,专注于推理任务,适合处理复杂的文本分类任务。之前我们在HAI上面使用了4090显卡部署了DeepSeekR1的模型,它的7B参数规模在4090服务器上运行高效,且在医疗领域文本分类中表现出色。为了使文章更具针对性,我们选择医疗文本分类任务,例如将医疗摘要分类为不同的疾病类别(如消化系统疾病、心血管疾病等)。这里使用GitHub上的“Medical-Text-Classification”数据集Medical-Text-Classification Dataset。该数据集包含分类为五种条件的医疗摘要。
字段 | 描述 |
---|---|
文本 | 医疗摘要内容 |
标签 | 疾病类别(五种条件之一) |
下载“Medical-Text-Classification”数据集后,使用Python的pandas库进行预处理,例如清洗文本、处理缺失值,并使用SMOTE算法处理类别不平衡。最终数据集分为训练集(80%)和验证集(20%)。
由于DeepSeek-R1-7b基于Qwen架构,我们需要确保与Hugging Face的序列分类模型兼容。以下是微调步骤:
1.加载预训练模型和分词器:
from transformers import AutoModelForSequenceClassification, AutoTokenizer
model_name = "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B"
tokenizer = AutoTokenizer.from_pretrain(model_name)
model = AutoModelForSequenceClassification.from_pretrain(model_name, num_labels=5)
2.准备数据集:
from datasets import load_dataset
dataset = load_dataset("csv", data_files="path/to/dataset.csv")
def tokenize_function(examples):
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512)
tokenized_dataset = dataset.map(tokenize_function, batched=True)
3.设置训练参数并训练:
from transformers import TrainingArguments, Trainer, DataCollatorWithPadding
training_args = TrainingArguments(
output_dir="path/to/output/dir",
evaluation_strategy="epoch",
save_strategy="epoch",
num_train_epochs=3,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
logging_dir="path/to/log/dir",
logging_steps=100,
)
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"],
eval_dataset=tokenized_dataset["validation"],
data_collator=data_collator,
)
trainer.train()
微调过程中,注意调整学习率(如2e-5)和批次大小,以适应4090服务器的资源。基于评估结果,可以调整超参数(如降低学习率、增加训练轮数)或进一步微调模型。此外微调方法有很多种,适用于不同场景:
如果我们用LoRA方法修改大模型微调:
LoRA是一种参数高效微调方法,通过在模型权重矩阵上添加低秩矩阵来减少训练参数数量,从而降低计算资源需求和训练时间。研究表明,LoRA特别适合大型语言模型(如7B参数的DeepSeek-R1-7b),因为它冻结预训练权重,仅训练低秩更新矩阵,保持模型的通用知识,同时适配特定任务。
从搜索结果来看,LoRA在Hugging Face的PEFT库中有详细支持,适合文本分类等任务。传统微调更新所有权重,而LoRA通过分解更新矩阵显著减少训练参数
首先,确保安装了PEFT库,这是实现LoRA微调的必要工具。安装命令为:
pip install peft
创建LoraConfig对象,设置LoRA的参数。关键参数包括:
from peft import LoraConfig
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.1,
bias="none",
task_type="SEQ_CLS"
)
需要注意的是,target_modules的设置需根据模型架构调整。Qwen模型的注意力层模块名与Llama类似,可参考LoRA for Sequence Classification with Roberta-Llama-Mistral。
加载DeepSeek-R1-7b模型,并使用get_peft_model函数应用LoRA配置。代码如下:
from transformers import AutoModelForSequenceClassification
from peft import get_peft_model
model_name = "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B"
model = AutoModelForSequenceClassification.from_pretrain(model_name, num_labels=5)
model = get_peft_model(model, lora_config)
在此过程中,get_peft_model会冻结预训练权重,仅使LoRA更新矩阵可训练。
由于分类头(通常命名为“classifier”)是随机初始化的,未预训练,其权重需完全训练。而get_peft_model会冻结所有模型参数(包括分类头),因此需手动设置分类头的requires_grad为True:
for param in model.classifier.parameters():
param.requires_grad = True
这确保分类头的权重在训练过程中可更新。搜索结果显示,PEFT的LoRA应用可能导致分类头权重被冻结,需特别注意这一步。
使用之前的医疗文本分类任务,选择“Medical-Text-Classification”数据集Medical-Text-Classification Dataset。下载后,使用Python的pandas库预处理,处理类别不平衡(如使用SMOTE算法),并分割为训练集(80%)和验证集(20%)。
使用Hugging Face的Trainer进行训练,设置训练参数如学习率(建议2e-5)和批次大小(建议8),以适应4090服务器的资源。
from transformers import TrainingArguments, Trainer, DataCollatorWithPadding
from datasets import load_dataset
dataset = load_dataset("csv", data_files="path/to/dataset.csv")
tokenized_dataset = dataset.map(tokenize_function, batched=True)
training_args = TrainingArguments(
output_dir="path/to/output/dir",
evaluation_strategy="epoch",
save_strategy="epoch",
num_train_epochs=3,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
logging_dir="path/to/log/dir",
logging_steps=100,
)
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"],
eval_dataset=tokenized_dataset["validation"],
data_collator=data_collator,
)
trainer.train()
训练过程中,注意监控GPU内存使用率,确保资源充足。
训练完成后,合并LoRA更新矩阵到基础模型权重,生成独立模型,便于部署。代码如下
model = model.merge_and_unload()
model.base_model.save_pretrain("path/to/save/dir")
合并后,模型可直接用于推理,无需额外处理LoRA模块。
微调后,使用验证集评估模型性能,指标包括准确率、精确率、召回率和F1分数。鉴于数据集可能存在类别不平衡,F1分数尤为重要。若性能不佳,可调整LoRA参数(如增大r)或优化数据集。
RAG(Retrieval-Augmented Generation)是一种将检索(Retrieval)与生成(Generation)技术相结合的方法。它的核心思想是:在生成文本的过程中,模型并不仅依赖于自身已有的参数和训练知识,而是通过检索外部知识库或文档来获取最新或更专业的支持信息,然后再将这部分检索到的内容与生成模型结合,最终输出更准确、更具上下文相关性的结果。
这一方法的关键在于检索与生成的有效配合:模型会根据输入(比如一个问题)构建检索请求,从外部知识库中获取到尽可能相关的材料,然后将这些材料作为辅助信息,与原始输入一同送入生成模型中,来生成最终的回答或文本内容。
检索阶段
融合阶段
生成阶段
举个简化的例子:假设你在问一个法律问题,比如“我国最新出台的某某法律对个人隐私保护的条款是什么?” 仅仅依赖大模型原本的训练知识,如果该模型在训练过程中没有包含最新法律信息,就可能无法给出准确的回答。而RAG方法则可以先检索法律文本数据库,找到相关条款内容,再与生成模型相结合,给出更专业且紧跟最新法律条文的回答。
假设我们正在开发一个“智能产品问答助手”,它需要随时回答用户关于新上市手机型号的配置、价格、售后政策等问题。这个领域更新十分频繁,普通的大模型可能无法及时获取最新信息。但如果我们采用RAG架构:
实际开发中使用的RAG工具主要包括向量数据库(如Pinecone、Milvus)、嵌入模型(如Sentence Transformers)和集成框架(如LangChain、Haystack)。这些工具共同支持检索和生成流程的自动化。
要使用RAG工具,首先需要设置检索系统,具体步骤如下:
import pinecone
pinecone.init(api_key="your_pinecone_api_key", environment="your_pinecone_environment")
index = pinecone.Index("your_index_name")
Pinecone Documentation提供详细设置指南。
执行检索:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
query_embedding = model.encode("What is the capital of France?").astype('float32').tobytes()
results = index.query(query_embedding, top_k=3, include_metadata=True)
documents = [item['metadata']['text'] for item in results['matches']]
检索结果通常按相似度排序,返回前N个最相关文档。
将检索系统集成到大模型中,需实现检索信息与生成模型的连接,具体步骤如下:
from openai import OpenAI
client = OpenAI(api_key="your_openai_api_key")
构建增强提示:
prompt = f"Given the following context:\n"
for doc in documents:
prompt += f"{doc}\n"
prompt += f"Answer the question: {query}"
提示设计需确保LLM能有效利用上下文,避免信息过载。
调用生成模型:
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
OpenAI API Documentation提供详细调用方法。
使用框架简化集成:
from langchain.vectorstores import Pinecone
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
vectorstore = Pinecone(index, model.embed_query, "text")
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff", retriever=vectorstore.as_retriever())
response = qa.run(query)
LangChain Documentation提供详细教程。RAG不仅限于文本数据,还可扩展到图像或视频领域,但这通常需要更复杂的嵌入模型和检索系统,当前文本应用更为常见。整体代码:
import os
import pinecone
from sentence_transformers import SentenceTransformer
from openai import OpenAI
# 初始化Pinecone
pinecone.init(api_key="your_pinecone_api_key", environment="your_pinecone_environment")
index = pinecone.Index("your_index_name")
# 嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2')
# 用户查询
query = "What is the capital of France?"
query_embedding = model.encode(query).astype('float32').tobytes()
# 检索
results = index.query(query_embedding, top_k=3, include_metadata=True)
documents = [item['metadata']['text'] for item in results['matches']]
# 构建提示
prompt = f"Given the following context:\n"
for doc in documents:
prompt += f"{doc}\n"
prompt += f"Answer the question: {query}"
# 调用OpenAI
client = OpenAI(api_key="your_openai_api_key")
response = client.chat.completions.create(
model="DeepSeek-R1-70b",
messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)
(1)微调:模型内部的参数调整 大模型微调(Fine-Tuning)就像是在一块已经“打好地基”的土地上,再根据需求修建新的建筑——我们会对预训练模型的参数进行针对性的调整,以适应特定业务场景或任务。
假设你在运营一家专注金融领域的咨询公司,想要构建一个客户咨询机器人。你会先拿到一个预训练好的语言模型(如BERT或GPT),再用大量的金融行业文本进行微调,让模型学会理解股市术语、基金交易方式以及银行政策条款。当客户咨询时,模型就能回答一些高度金融化的问题。
(2)RAG:模型通过外部检索进行增强,依赖外部知识 RAG(Retrieval-Augmented Generation)更像是一个随时可以连上“百科全书”的助手,它会先从模型输入中提取关键词或上下文信息,然后去外部知识库检索相关资料,再根据检索到的内容生成回答。
一家电商平台刚上市了一款全新的智能家电,客服机器人需要立即回答关于新产品的规格、价格、售后政策等问题。传统的仅靠模型内部知识的方式可能跟不上产品迭代的速度。RAG方法可以在问答之前,实时查询该产品数据库,获取最新信息,再给用户一个恰如其分的回答。
(1)微调:需要大量标注数据进行训练
微调的本质是在保留模型通用知识的前提下,对其在目标任务上进行“再教育”。就像招聘员工后,仍需要针对企业内部规章制度进行培训。如果培训数据(也就是标注数据)不足,员工可能无法精准理解企业的特殊要求。
如果你需要构建一个自动法律文书生成系统,就得收集大量的法律案例、法规文件以及判决文书,并且标注出案件类型、法律条款对应等关键信息。这样才能在微调之后,让模型更好地“理解”法律行业的专业语言。
(2)RAG:通过引入现有的知识库,减少对大规模标注数据的需求
RAG最核心的部分是“检索”,它利用外部知识库来回答问题或生成文本,模型本身不一定需要针对新任务进行大量的学习,只要检索到的内容本身是正确且覆盖面广,模型便能结合这些最新信息进行准确的生成。
当一家旅行社想为顾客提供旅游景点的实时信息,包括门票价格、景点开放时间等,因为信息更新频率高,如果使用微调方式,需要不断更新模型并训练大量数据。而RAG则可以直接查询旅行社数据库或外部API,获取景点的最新信息,再生成回答。只要确保数据库维护及时,回答的准确度就会相对有保障。
(1)微调:通常需要较高的计算资源和训练时间
(2)RAG:可能需要处理大量的检索请求,但生成阶段的开销较小
举个综合的对比案例:
在做技术选型时,需要评估自身系统的规模、更新的频率、数据源的可用性以及对结果准确度和稳定性的要求,然后综合考虑使用大模型微调还是RAG,或者将二者结合起来(例如,一部分核心任务使用微调,另一部分开放式问答使用RAG)。
案例背景 假设某家专注于金融咨询的公司,需要一个智能助手来解答客户关于股票、基金、保险等金融产品的问题。由于金融领域对信息准确度、合规性要求非常高,甚至连措辞都不能含糊,所以公司希望这个智能助手在回复时能够尽量专业且符合监管标准。
为何选择微调
实施要点
可能的不足
案例背景 另一家公司是一家大型电商平台,平台每天都在上架新产品,且商品的规格、价格和促销活动都在不断更新。用户需要一个客服机器人随时提供最新、最准确的产品信息。
为何选择RAG
实施要点
可能的不足
在实际工作中,两者并非对立或不可兼容。有时候,你可以先对模型进行基础微调,让它具备行业基础知识,再结合RAG检索能力处理那些“新鲜出炉”或非常琐碎的问题,这样就能在精确度和时效性之间取得一个平衡。
不管是大模型微调,还是RAG检索增强,它们都为我们提供了在不同业务需求下高效且灵活的解决方案。从微调的角度看,模型在稳定场景或要求极高精准度的专业领域(如金融、法律、医疗)能够发挥出强大的定制化能力;而从RAG的角度看,它通过外接知识库的方式让生成模型具备了可扩展、可更新的特性,非常适合那些信息变动频繁、数据类型多样且需要实时性的大规模应用。
在未来,随着预训练模型规模的持续扩大以及行业的迭代更新速度不断加快,这两种技术可能会进一步融合,或是在更多行业领域深入落地:
无论是哪种技术路线,都需要结合实际的业务目标进行抉择,同时考虑训练成本、维护难度以及对时效性和准确度的要求。大模型在为我们提供强大的语言理解与生成能力的同时,也呼唤更加细分、更加灵活的应用生态,让技术真正为生产和生活带来切实的价值。可以预见,随着行业不断迭代和用户需求的多样化,这两种技术以及它们的变体都会在未来继续进化,带来更多令人期待的创新与突破。
有更多感悟以及有关大模型的相关想法可随时联系博主深层讨论,我是Fanstuck,致力于将复杂的技术知识以易懂的方式传递给读者,热衷于分享最新的人工智能行业动向和技术趋势。如果你对大模型的创新应用、AI技术发展以及实际落地实践感兴趣,那么请关注Fanstuck,下期内容我们再见!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。