尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

从LoRA微调到RAG与Agent:大模型应用实战路径

从LoRA微调到RAG与Agent:大模型应用实战路径 大规模模型微调这个词近几年几乎成了算法工程师和 AI 应用开发者的必修课。以 Qwen3.5 这样可以直接下载权重的开源对话模型为例微调的意义在于把它从一个“通用助手”变成符合你业务语气的“领域助手”模型对专有名词更敏感、回答格式更可控、对特定任务的理解更稳定。下面会沿着一条可复现的实战路径完成数据准备、LoRA 微调、模型验证再结合 RAG 补足知识库最后用 Agent 扩展模型调用工具的能力。这套过程适合两类人一类是刚接触大模型应用开发的工程师想搞明白微调、RAG、Agent 各自解决什么问题另一类是已经在用 Prompt 调模型但发现纯提示词不够稳定、想要把业务知识真正固化到模型里的开发者。整个链路并不要求你从零训练一个模型。现在的主流做法是“基座模型 微调 检索增强 工具调用”基座模型提供语言理解和生成能力微调让回答风格和指令遵循更稳定RAG 把外部知识库接进来Agent 则让模型能够调用工具完成多步任务。四者不是互相替代的关系而是按场景组合使用。1. 先建立认知微调、RAG、Agent 和 Prompt 在这条链路里的分工很多新手会把微调理解成“给模型灌输知识”其实这不准确。微调改变的是模型在特定任务上的行为方式和输出风格而不是让模型记住一批新事实。如果你想给模型补充一个企业内部知识库的内容直接微调往往效率很低因为知识会以参数形式被“压缩”进权重里更新成本高且不可控。更合理的做法是用 RAG 把知识放在外部让模型在生成时去检索。1.1 微调到底在调什么从训练机制看微调是继续用有监督数据更新模型参数。区别在于预训练阶段模型学习的是大规模语料里的语言规律微调阶段学习的是“给定什么指令输出什么内容”的映射关系。为什么 LoRA 这类参数高效微调方法会成为主流全参微调需要更新模型全部权重优化器状态、梯度、激活值都会占用大量显存。LoRA 的思想是冻结原始权重只训练注入到 Transformer 层里的低秩矩阵让更新量近似等于原始权重更新。这样可训练的参数量可能只有原始模型的 0.1% 到 1%显存需求大幅下降训练速度也更快。一个容易误解的地方是LoRA 并不是“效果打折”的方案。在很多指令微调场景里训练数据量不大、任务模式相对固定LoRA 微调的效果可以接近全参微调而且更适合部署因为训练完成后可以把低秩矩阵合回原始权重推理时不会增加额外开销。1.2 RAG 解决什么为什么不建议所有问题都靠微调RAGRetrieval-Augmented Generation检索增强生成把“外部知识检索”和“大模型生成”串在一起用户提问后先从文档库中检索相关片段再把片段和问题一起交给模型生成答案。这样做的直接好处有三点知识更新不用重新训练、回答可以引用原文出处、幻觉问题能得到一定控制。企业内部的知识库、产品说明书、政策文件这类高频变动的内容用 RAG 比微调更合适。热词里反复出现的“rag 知识库”“rag 项目”“rag 切块策略”说明这个方向已经是实际工程中的刚需。1.3 Agent 和 ReAct 如何扩展模型能力微调和 RAG 都停留在“让模型回答得更好”的层面。Agent 的差异在于它让模型进入一个循环思考Thought- 调用工具Action- 观察结果Observation- 再思考。ReAct 是这种循环的一种经典实现把推理过程和工具使用过程同时写进上下文里让模型一步步完成项目。比如一个简单的“查天气并安排日程”任务纯大模型做不到因为它没有实时数据接口。Agent 化之后模型会先调用天气查询工具拿到结果后再调用日程写入工具最后返回总结。1.4 为什么 Prompt 工程仍然不能省微调模型、RAG 系统、Agent 框架都依赖 Prompt 把任务表达清楚。同一个模型用不同 Prompt 组织同一段知识效果可能差很多。Prompt 工程的价值在于把任务边界、输出格式、工具调用规则这些信息稳定地传给模型。在项目实践中合理路径是先写好 Prompt验证任务是否能用提示词解决如果不能稳定解决再看是缺知识用 RAG、缺行为习惯用微调还是缺工具调用能力用 Agent。不要一上来就微调这是最常见的资源浪费。2. 环境准备与模型选型先跑通再谈微调微调本身不难难的是环境不一致导致的各种奇怪报错。进入实战前先把硬件、软件、模型三个问题对齐。2.1 硬件要求GPU 显存怎么估算以 Qwen3.5 这类开源对话模型为例常见量级在 7B 到 9B 左右。这类模型用 bf16 加载权重本身就需要约 14GB 到 18GB 显存。全参微调时除了权重还要保存优化器状态、梯度和中间激活值9B 模型全参微调通常需要 80GB 以上显存单卡基本只能靠 A100/H100 级别的设备。LoRA 微调冻结了原始权重只需要额外保存低秩矩阵和少量梯度24GB 显存的消费级显卡可以尝试但需要开启 4bit 量化或梯度累积。这里给出一张显存需求对比表实际值会随批次大小、序列长度和量化配置变化只作为选型参考方案更新参数范围典型显存需求以 9B 模型为例适用场景全参微调全部模型参数通常 80GB 以上数据量大、算力充足、需要极致效果LoRA 微调低秩矩阵24GB 可尝试32GB 更稳数据量适中、单卡/单机场景QLoRA 微调低秩矩阵 量化基座16GB~24GB 可运行消费级显卡、快速验证注意显存需求不是固定的。batch size 减半、序列长度缩短、开启梯度检查点都能明显降低显存占用代价是训练速度变慢。2.2 安装 Python 环境与依赖推荐使用 conda 创建独立环境避免和系统 Python 冲突。Python 版本选用 3.10 或 3.11PyTorch 版本要与你本机 CUDA 驱动匹配。基础依赖如下conda create -n qwen-finetune python3.10 conda activate qwen-finetune pip install torch transformers accelerate datasets peft bitsandbytes pip install sentence-transformers faiss-cpu这里每个包的用途要清楚transformers 负责加载模型和训练 Trainerpeft 提供 LoRA 配置和注入能力bitsandbytes 负责 4bit/8bit 量化用于降低显存datasets 负责读取训练数据sentence-transformers 和 faiss 在后面做 RAG 检索时使用。如果需要用 Ollama 快速体验基线模型也可以额外安装 ollama。如果使用的是更新版本的 transformers注意 peft 和 bitsandbytes 的兼容性。安装后先运行一段最小代码确认可以加载模型再进入训练流程不要等到训练时才回头查依赖。2.3 用 Ollama 或 transformers 启动基线模型接入模型有两种常见方式。第一种是用 Ollama对新手友好启动和对话都很方便ollama pull qwen3.5:9b ollama run qwen3.5:9b模型拉取速度慢时可以检查网络环境或把 Ollama 的模型源配置到可用的镜像地址。这种方式适合快速体验模型效果但要注意Ollama 里的模型和微调脚本里通过 transformers 加载的模型权重路径不一定相同做 LoRA 训练时通常还是要用 transformers 直接加载原始权重。第二种是用 transformers 加载from transformers import AutoModelForCausalLM, AutoTokenizer model_name Qwen/Qwen3.5-9B # 实际模型名以当前可下载版本为准 tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_name, device_mapauto, torch_dtypeauto, trust_remote_codeTrue, ) prompt 请用一句话解释什么是检索增强生成。 inputs tokenizer(prompt, return_tensorspt).to(model.device) outputs model.generate(**inputs, max_new_tokens128) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))2.4 检查点启动后在两个场景下验证模型表现在开始微调之前记录基线模型的输出。一个测试场景是领域知识问答另一个是格式化的业务任务。比如让模型回答“什么是 RAG”再让它按固定格式输出一份会议纪要。基线表现越差说明任务越依赖领域数据微调收益可能越大。如果模型在提示词阶段就完全跑不通先不要进入训练阶段。检查模型路径、分词器模板、显存占用和 transformers 版本直到基线对话稳定。3. 准备微调数据指令数据格式直接决定训练结果微调效果的上限由数据决定。数据准备是整个流程中最花时间、也最容易被低估的环节。3.1 指令微调数据的基本结构指令微调数据一般包含指令instruction、输入input和期望输出output三部分。用对话格式也可以每条训练样本对应一段多轮对话。基础格式如下{ instruction: 根据产品说明书回答用户问题, input: Qwen3.5 支持多少种上下文长度配置, output: 具体支持情况需要以模型发布时的技术文档为准你可以查看文章中的参数说明部分。 }如果你的模型使用 Chat Template建议把数据整理成对话形式再交给训练脚本。下面是一个简化的转换逻辑def format_example(example): messages [ {role: system, content: example[instruction]}, {role: user, content: example[input]}, {role: assistant, content: example[output]}, ] return tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptFalse )3.2 领域数据的采集与清洗领域数据从哪里来决定了你的模型是在“学业务”还是在“背答案”。常见数据源包括历史工单、FAQ、产品文档、客服对话记录、业务系统导出的问答对。清洗时重点处理四类问题一是个人信息和敏感信息要脱敏或删除二是重复样本要去重三是脏格式比如把 HTML 标签、换行符、特殊符号清理干净四是质量筛选输出长度过短、答非所问的样本要人工检查。数据规模方面指令微调并不是数据越多越好。几百到几千条高质量样本往往比几万条低质量样本效果更好。重点在于覆盖到目标任务的典型输入模式。3.3 数据集拆分与检查准备完成后把数据拆成训练集和验证集比例建议 9:1 或 95:5。验证集的作用是判断训练是否过拟合如果训练 loss 持续下降而验证 loss 上升模型已经在背样本了。在训练前先随机抽 20 条样本打印出格式化后的文本确认指令、输入、输出拼接正确模型对齐符号没有被破坏。这一步能避免训练到一半才发现数据格式错乱。4. 用 LoRA 完成 Qwen3.5 微调实战环境就绪、数据准备好之后可以进入核心训练流程。这里以 transformers peft bitsandbytes 为例给出一个最小可运行的 LoRA 微调脚本。4.1 加载量化基座模型为了在有限显存里训练 9B 量级模型通常先把基座模型加载为 4bit。这样做的好处是权重占用显著下降代价是模型底座精度略有损失。对多数指令微调场景来说4bit 加载后配合 LoRA 的效果可以接受。from transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, ) import torch model_name Qwen/Qwen3.5-9B bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_quant_typenf4, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_use_double_quantTrue, ) model AutoModelForCausalLM.from_pretrained( model_name, quantization_configbnb_config, device_mapauto, trust_remote_codeTrue, ) tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue)这里几个量化参数的含义要理解load_in_4bit把模型权重加载为 4bitnf4是 bitsandbytes 支持的归一化浮点格式比普通 4bit 整数更稳定bnb_4bit_compute_dtype指定计算时使用的精度推荐 bf16既能节省显存又不容易溢出。4.2 注入 LoRA 配置用 peft 的LoraConfig指定低秩矩阵的参数。r是矩阵维度lora_alpha是缩放系数target_modules决定把 LoRA 注入到哪些层。from peft import LoraConfig, prepare_model_for_kbit_training, get_peft_model lora_config LoraConfig( r8, lora_alpha16, target_modules[q_proj, k_proj, v_proj, o_proj], lora_dropout0.05, biasnone, task_typeCAUSAL_LM, ) model prepare_model_for_kbit_training(model) model get_peft_model(model, lora_config)这里有一个常见疑问r设成多大合适r8是起步值任务复杂时可以尝试 16 或 32。r越大可训练参数越多拟合能力越强但过拟合风险和显存占用也越高。lora_alpha通常设置为r的 1 到 2 倍lora_dropout在训练数据较少时设 0.05 或 0.1 做正则。注意target_modules必须与模型的实际模块名一致。不同版本的 Qwen 模型注意力层的模块名可能不同。如果不确定可以用model.named_modules()查看或者参考模型卡中的 LoRA 示例。4
返回列表