基于Qwen2.5模型的RAG微调+langchain
本文使用Qwen2.5作为示例,是通义千问最新发布的开源大模型,适合中文场景。同时,我会提供微调步骤和参数设置。
本文使用Qwen2.5作为示例,是通义千问最新发布的开源大模型,适合中文场景。同时,我会提供微调步骤和参数设置。
1import torch
2from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer
3from peft import get_peft_model, LoraConfig, TaskType
4from datasets import Dataset
5from langchain.embeddings import HuggingFaceEmbeddings
6from langchain.vectorstores import Chroma
7from langchain.text_splitter import CharacterTextSplitter
8from langchain.chains import RetrievalQA
9from langchain.llms import HuggingFacePipeline
10
11class QwenRAGFineTuningSystem:
12 def __init__(self, model_name="Qwen/Qwen2.5-7B", data_path="path/to/your/data.txt"):
13 self.model_name = model_name
14 self.data_path = data_path
15 self.tokenizer = None
16 self.model = None
17 self.embeddings = None
18 self.vectorstore = None
19 self.qa_chain = None
20
21 def initialize_model(self):
22 self.tokenizer = AutoTokenizer.from_pretrained(self.model_name, trust_remote_code=True)
23 self.model = AutoModelForCausalLM.from_pretrained(self.model_name, trust_remote_code=True, device_map="auto")
24 self.tokenizer.pad_token = self.tokenizer.eos_token
25 self.model.config.pad_token_id = self.tokenizer.eos_token_id
26
27 def prepare_for_training(self):
28 # 配置LoRA
29 peft_config = LoraConfig(
30 task_type=TaskType.CAUSAL_LM,
31 inference_mode=False,
32 r=8,
33 lora_alpha=32,
34 lora_dropout=0.1
35 )
36 self.model = get_peft_model(self.model, peft_config)
37
38 def create_vectorstore(self):
39 self.embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
40 with open(self.data_path, 'r', encoding='utf-8') as f:
41 data = f.read()
42 text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
43 texts = text_splitter.split_text(data)
44 self.vectorstore = Chroma.from_texts(texts, self.embeddings)
45
46 def fine_tune(self, train_data, output_dir="./qwen_rag_finetuned"):
47 # 准备训练数据
48 def tokenize_function(examples):
49 return self.tokenizer(examples["text"], padding="max_length", truncation=True, max_length=512)
50
51 dataset = Dataset.from_dict({"text": train_data})
52 tokenized_dataset = dataset.map(tokenize_function, batched=True)
53
54 # 设置训练参数
55 training_args = TrainingArguments(
56 output_dir=output_dir,
57 num_train_epochs=3,
58 per_device_train_batch_size=4,
59 gradient_accumulation_steps=4,
60 learning_rate=2e-4,
61 weight_decay=0.01,
62 warmup_steps=500,
63 logging_steps=100,
64 save_steps=1000,
65 fp16=True,
66 )
67
68 # 初始化 Trainer
69 trainer = Trainer(
70 model=self.model,
71 args=training_args,
72 train_dataset=tokenized_dataset,
73 tokenizer=self.tokenizer
74 )
75
76 # 开始训练
77 trainer.train()
78
79 # 保存微调后的模型
80 self.model.save_pretrained(output_dir)
81 self.tokenizer.save_pretrained(output_dir)
82
83 def create_qa_chain(self):
84 pipe = HuggingFacePipeline(
85 pipeline=pipeline("text-generation", model=self.model, tokenizer=self.tokenizer, max_length=2048)
86 )
87 self.qa_chain = RetrievalQA.from_chain_type(
88 llm=pipe,
89 chain_type="stuff",
90 retriever=self.vectorstore.as_retriever()
91 )
92
93 def query(self, question):
94 return self.qa_chain.run(question)
95
96# 使用示例
97system = QwenRAGFineTuningSystem()
98
99# 步骤1: 初始化模型
100print("正在初始化模型...")
101system.initialize_model()
102
103# 步骤2: 准备训练
104print("正在准备模型进行微调...")
105system.prepare_for_training()
106
107# 步骤3: 创建向量存储
108print("正在创建向量存储...")
109system.create_vectorstore()
110
111# 步骤4: 微调模型
112print("开始微调模型...")
113train_data = [
114 "这是第一条训练数据。",
115 "这是第二条训练数据。",
116 # ... 添加更多训练数据
117]
118system.fine_tune(train_data)
119
120# 步骤5: 创建问答链
121print("正在创建问答链...")
122system.create_qa_chain()
123
124# 步骤6: 进行查询
125question = "请问北京的气候特点是什么?"
126print(f"问题: {question}")
127answer = system.query(question)
128print(f"回答: {answer}")
系统设计、微调过程和使用流程:
- 系统架构:
-
使用Qwen2.5作为基础模型
-
集成LangChain组件实现RAG功能
-
使用PEFT库进行高效微调(LoRA方法)
-
使用Chroma作为向量存储
-
详细步骤和参数说明:
步骤1: 初始化模型
-
使用AutoTokenizer和AutoModelForCausalLM加载Qwen2.5模型
-
设置pad_token为eos_token,确保正确的填充行为
步骤2: 准备训练
-
配置LoRA参数:
步骤3: 创建向量存储
-
r=8:LoRA的秩,控制微调的复杂度
-
lora_alpha=32:LoRA的缩放参数
-
lora_dropout=0.1:LoRA层的dropout率
-
使用多语言MiniLM模型生成嵌入
-
文本分割参数:chunk_size=1000, chunk_overlap=200
步骤4: 微调模型
-
训练参数设置:
步骤5: 创建问答链
-
num_train_epochs=3:训练轮数
-
per_device_train_batch_size=4:每个设备的批次大小
-
gradient_accumulation_steps=4:梯度累积步数
-
learning_rate=2e-4:学习率
-
weight_decay=0.01:权重衰减
-
warmup_steps=500:预热步数
-
fp16=True:使用混合精度训练
-
使用HuggingFacePipeline包装微调后的模型
-
设置max_length=2048,控制生成文本的最大长度
步骤6: 进行查询
-
直接使用qa_chain.run()方法进行问答
-
使用流程:
a. 实例化QwenRAGFineTuningSystem
b. 初始化模型
c. 准备模型进行微调
d. 创建向量存储
e. 进行模型微调
f. 创建问答链
g. 进行查询 -
注意事项:
-
请确保有足够的GPU内存来加载和微调Qwen2.5模型
-
根据实际需求调整微调参数,如训练轮数、学习率等
-
准备足够的、高质量的训练数据以获得好的微调效果
-
考虑使用大规模语料库来增强RAG系统的知识库
- 可能的优化:
-
实现增量训练,允许在新数据可用时更新模型
-
添加模型评估步骤,监控微调效果
-
实现更复杂的提示工程,提高问答质量
-
考虑使用更先进的检索方法,如混合检索或重排序
要使用此系统,需要准备好训练数据和知识库文档。确保安装所有必要的依赖,包括transformers、peft、datasets和langchain。
那么,如何系统的去学习大模型LLM?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。
但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~
篇幅有限,部分资料如下:
👉LLM大模型学习指南+路线汇总👈
💥大模型入门要点,扫盲必看!
💥既然要系统的学习大模型,那么学习路线是必不可少的,这份路线能帮助你快速梳理知识,形成自己的体系。
路线图很大就不一一展示了 (文末领取)
👉大模型入门实战训练👈
💥光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉国内企业大模型落地应用案例👈
💥两本《中国大模型落地应用案例集》 收录了近两年151个优秀的大模型落地应用案例,这些案例覆盖了金融、医疗、教育、交通、制造等众多领域,无论是对于大模型技术的研究者,还是对于希望了解大模型技术在实际业务中如何应用的业内人士,都具有很高的参考价值。 (文末领取)
👉GitHub海量高星开源项目👈
💥收集整理了海量的开源项目,地址、代码、文档等等全都下载共享给大家一起学习!
👉LLM大模型学习视频👈
💥观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 (文末领取)
👉640份大模型行业报告(持续更新)👈
💥包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
👉获取方式:
这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓
更多推荐
所有评论(0)