拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于Qwen3微调Embedding模型,提升RAG检索准确率

先分享一个我最近在项目中真实遇到的场景业务方给了一套医疗领域的PDF文档库要求做RAG问答。我用的是通用Embedding模型加向量库的常规方案文档切块、向量化、召回、拼接、生成流程跑起来很快。但到了验收阶段用户连续提了几个带专业术语的问题检索模块返回的Top5片段里真正相关的文档排在很后面甚至没有进上下文窗口。大模型回答出来的内容术语味道不对关键信息还缺。那时我才意识到RAG链路里最容易拖后腿的不是生成模型的能力而是Embedding模型对领域语义的理解。于是开始研究Embedding微调这条路。目标很明确让检索模块更懂“这个领域的说法”把真正相关的片段排到前面。本文就是这一轮优化过程的完整复盘包含为什么微调Embedding有效、怎么基于Qwen3做Embedding训练微调、LoRA怎么省显存、训练数据怎么造以及微调模型如何接回RAG。文中代码均以常见开源框架为例重点讲思路和落地细节适合已经跑通基础RAG、想继续提升召回准确率的开发者。1. RAG为什么卡在Embedding这一环1.1 Embedding在RAG检索链路中的位置RAGRetrieval-Augmented Generation检索增强生成的核心思路是在大模型回答之前先从外部知识库中检索出相关文本片段拼接到提示词中再让大模型基于这些片段生成回答。整体链路可以简单拆成两条线一条是“离线索引线”文档加载 → 文本切块Chunk→ Embedding向量化 → 写入向量数据库。一条是“在线查询线”用户提问 → 问题向量化 → 在向量库中做相似度检索 → 召回TopK片段 → 重排可选→ 拼接上下文 → 大模型生成回答。Embedding模型在两条线上都会出现。它把文本转换为一个高维向量让语义相近的文本在向量空间中距离更近。检索阶段系统计算用户问题向量与文档片段向量的余弦相似度或内积把得分最高的片段返回。这里有一个容易被忽略的关键点如果Embedding模型不理解某个领域的表达方式那么文档切得再合理、向量库性能再好、大模型再强检索到的内容依然会跑偏。检索一错后续生成全部跟着错。1.2 通用Embedding模型的问题常见的开源Embedding模型例如BGE系列、M3系列等在通用文本上效果不错。它们在海量通用语料上训练擅长处理新闻、百科、社区问答这类内容。但到了具体业务场景问题就出来了领域术语表达不同。医疗、法律、金融、工业制造、科研论文都有自己的一套说法。通用模型可能没怎么见过这些术语。同一概念在领域内有固定叫法。例如医疗记录里的“心包积液”与“心包腔积液性质待查”通用模型可能认为它们相似度不够高。文档内部有大量缩写、英文符号、专业计算公式。这些内容在通用语料中占比小向量表征不够好。问答匹配角度不同。通用模型训练时可能更关注“句子语义相似度”但RAG检索更关注“这个问题与哪段文档相关”。这两种相似度不一定一致。所以当你发现RAG检索结果不佳时一定要先排查Embedding本身换更强的通用模型、换更大的Embedding模型、做Rerank重排这些都是手段。但如果领域差异很大最直接有效的方式就是对Embedding模型做微调。1.3 微调Embedding能带来什么Embedding微调的目标不是让模型背诵文档而是调整向量空间的结构让“与查询相关的文档片段”与“问题”在向量空间里更接近让“不相关的内容”被推远。以医疗场景为例微调前“患者主诉胸闷气短一周”和文档里的“心电图提示ST-T改变考虑心肌缺血可能”这两个文本可能距离很远微调后模型应该把这两段文本的向量距离拉近因为它们属于同一个问答场景。这种优化直接作用在检索源头上带来的收益是连锁的召回质量提升TopK片段中相关文档的比例提高。大模型不需要从大量无关片段里“硬找答案”回答更准确。幻觉减少因为上下文里的干扰信息变少了。2. 为什么选择Qwen3做Embedding微调2.1 Qwen3是什么Qwen3是通义千问的大语言模型系列包含不同参数规模的版本比如较小的1.7B、7B以及更大的版本。它本身不是专门的Embedding模型而是生成式语言模型。但语言模型在训练过程中内部的隐藏状态Hidden State包含丰富的语义信息可以通过池化Pooling的方式转换为句向量。因此基于Qwen3做Embedding微调实际上是用生成式模型作为骨干网络在它的最后一层隐藏状态上叠加池化层和训练目标通过微调让向量空间适配你的领域数据。这个思路并不罕见很多团队会基于通用Embedding模型微调也有团队基于更强大的基座模型训练自己的Embedding模型。Qwen3 的优势在于中文语义理解能力强对中文文档和问题的表征质量高。有多个参数规模的版本可选从1.7B到更大规模可以在效果和资源消耗之间平衡。开源权重可下载支持本地部署和微调。生态完善Hugging Face Transformers、PEFT等框架可以直接使用。2.2 需要注意Qwen3不是原生Embedding模型这里要特别说明一个容易踩坑的点Qwen3像大多数生成式模型一样没有直接提供encode接口也不像专门的Embedding模型那样开箱即用。要把它当作Embedding模型使用需要自己做两件事从模型前向传播结果中提取最后一层隐藏状态。对序列维度做池化例如取最后一层的平均池化或取最后一个Token对应的向量。训练阶段还需要在模型之上定义对比学习目标让模型学习“哪些文本是相关的哪些不是”。所以这篇文章说的“通过Qwen3对Embedding进行训练微调”准确表达是以Qwen3作为骨干模型在其基础上构造Embedding模型并用领域数据微调。如果读者本身已经有领域预料优先用BGE-M3等原生Embedding模型微调也可以思路是通用的。本文以Qwen3为例展开是因为很多开发者手上已经有Qwen3的部署和使用经验上手门槛更低。2.3 全参训练与LoRA微调怎么选Embedding微调同样面临显存问题。这里有两个常见选项全参微调Full Fine-tuning更新骨干模型的所有参数。效果通常最好但显存消耗巨大尤其是7B以上模型一般需要多张高端GPU。LoRA微调Low-Rank Adaptation冻结原模型参数只训练插入的小规模低秩矩阵。显存消耗显著降低训练速度更快在很多任务上与全参微调效果接近。如果你只有单卡比如一张24GB显存的GPU建议优先使用LoRA对Qwen3-1.7B或Qwen3-7B进行Embedding微调。1.7B模型在普通消费级显卡上已经可以尝试7B模型LoRA训练建议至少24GB显存。3. 环境准备与训练数据构造3.1 环境与依赖以下环境基于我本次实验的环境版本可按实际情况调整操作系统Ubuntu 20.04 / 22.04Python3.10深度学习框架PyTorch 2.xGPUNVIDIA RTX 4090 24GB单卡CUDA11.8或更高关键Python库transformers、peft、datasets、torch、sentencepiece、accelerate你可以用下面的命令创建虚拟环境并安装依赖python -m venv rag_env source rag_env/bin/activate pip install torch transformers peft datasets accelerate sentencepiece如果你有可用的GPU建议用GPU训练纯CPU训练速度太慢不适合迭代。3.2 训练数据格式Embedding微调最常用的训练方式是“对比学习”。每条训练数据一般包含三部分查询query一个用户问题或一段需要检索的文本。正例positive与查询相关的文档片段。负例negative与查询不相关的文档片段。训练目标让查询和正例的向量距离更近和负例的向量距离更远。这里需要注意RAG场景里的“相关性”并不完全等同于“文本相似”。比如用户问“高血压患者能不能吃柚子”文档里有一句“服用降压药期间柚子可能影响药物代谢”这两句话字面意思差别很大但语义上是相关的。构造数据时要站在“是否能帮助回答这个问题”的角度来判断相关性。一种比较实用的数据构造思路是从业务文档中抽取一批真实的问题。如果没有现成问题可以用大模型根据文档自动生成。每条问题对应一个或几个相关段落作为正例。从其他不相关文档中随机抽取段落作为负例。每个样本可以配1个正例和1个或多个负例。3.3 一个最小数据集示例下面是一个用JSON格式保存的训练数据示例每条数据的negative字段可以放一个或多个[ { query: 高血压患者服用降压药期间可以吃柚子吗, positive: 柚子和某些降压药物同时摄入可能导致血药浓度升高增加低血压风险建议服药期间避免大量食用柚子。, negative: 高血压是一种以体循环动脉血压升高为主要特征的慢性疾病通常需要长期管理。 }, { query: 心肌缺血的心电图表现有哪些, positive: 心肌缺血时心电图可能出现ST段压低、T波倒置等改变部分患者表现为ST段抬高。, negative: 心电图检查是心血管疾病常用的无创检查手段之一适用于心律失常、心肌缺血等疾病的初步筛查。 } ]数据规模方面如果业务场景非常垂直几千条高质量数据就可以让模型效果有比较明显的变化如果领域很宽建议准备上万条。数据质量永远比数量更重要。宁可少一点也要确保每一条的正例都是真正相关的负例都是真正不相关的。如果正例本身质量差模型学到了错误的相关性结果反而会变差。3.4 数据增强思路当高质量人工标注数据不足时可以借助大模型生成候选数据再做人工抽检清洗。做法如下将文档切成小片段。让大模型基于片段生成若干个问题。将“问题-片段”作为正例对。从其他文档片段中随机采样作为负例。整个流程可以半自动但最终投入模型训练之前建议抽检一部分数据确认相关性标注没有系统性错误。数据质量是微调效果的天花板。4. 基于Qwen3的Embedding微调实战4.1 加载Qwen3模型并提取句向量第一步把Qwen3加载为AutoModel并从最后一层隐藏状态中提取句向量。为了便于后续复用我封装了一个Qwen3EmbeddingModel类。# 文件路径modeling_qwen3_embedding.py import torch import torch.nn.functional as F from transformers import AutoModel, AutoTokenizer class Qwen3EmbeddingModel(torch.nn.Module): def __init__(self, model_nameQwen/Qwen3-1.7B, poolingmean): super().__init__() self.model AutoModel.from_pretrained(model_name, trust_remote_codeTrue) self.tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) self.pooling pooling def forward(self, input_ids, attention_mask): outputs self.model( input_idsinput_ids, attention_maskattention_mask, output_hidden_statesTrue ) last_hidden outputs.hidden_states[-1] if self.pooling mean: # 对非padding位置取平均 mask attention_mask.unsqueeze(-1).float() summed (last_hidden * mask).sum(dim1) counts mask.sum(dim1).clamp(min1e-9) return F.normalize(summed / counts, p2, dim1) else: # cls或last token池化这里以mean为主 raise NotImplementedError(请根据需求实现其他池化方式) def encode_texts(self, texts, max_length512): encoded self.tokenizer( texts, paddingTrue, truncationTrue, max_lengthmax_length, return_tensorspt ) with torch.no_grad(): return self.forward(encoded[input_ids], encoded[attention_mask])代码解释output_hidden_statesTrue让模型返回每一层的隐藏状态。我们取最后一层因为最后一层包含最丰富的语义信息。mean pooling对非padding位置取平均得到整个句子的向量。F.normalize对向量做L2归一化方便后续计算余弦相似度。调用方式model Qwen3EmbeddingModel(Qwen/Qwen3-1.7B) emb1 model.encode_texts([高血压患者能吃柚子吗]) emb2 model.encode_texts([柚子和降压药同时摄入可能导致低血压风险]) similarity torch.nn.functional.cosine_similarity(emb1, emb2) print(similarity.item())当前Qwen3模型使用的是“问答生成”的训练方式所以直接用最原始的隐藏状态计算相似度效果不一定理想。这正是后面要做微调的原因。4.2 构造训练Dataset接下来把训练数据封装成PyTorch Dataset。这里简化处理每条数据包含一个query、一个positive、一个negative。# 文件路径dataset.py import torch from torch.utils.data import Dataset class ContrastiveDataset(Dataset): def __init__(self, data, tokenizer, max_length512): self.data data self.tokenizer tokenizer self.max_length max_length def __len__(self): return len(self.data) def _tokenize(self, text): return self.tokenizer( text, paddingmax_length, truncationTrue, max_lengthself.max_length, return_tensorspt ) def __getitem__(self, idx): item self.data[idx] query_enc self._tokenize(item[query]) pos_enc self._tokenize(item[positive]) neg_enc self._tokenize(item[negative]) return { query_input_ids: query_enc[input_ids].squeeze(0), query_attention_mask: query_enc[attention_mask].squeeze(0), pos_input_ids: pos_enc[input_ids].squeeze(0), pos_attention_mask: pos_enc[attention_mask].squeeze(0), neg_input_ids: neg_enc[input_ids].squeeze(0), neg_attention_mask: neg_enc[attention_mask].squeeze(0), }4.3 定义对比学习损失对比学习最常用的损失是InfoNCE。原理很简单对于每个batch把query与positive的相似度拉高同时把query与所有negative的相似度压低。# 文件路径loss.py import torch import torch.nn.functional as F def contrastive_loss(query_emb, pos_emb, neg_emb, temperature0.05): # 计算query与positive的相似度 pos_sim (query_emb * pos_emb).sum(dim-1) / temperature # 计算query与negative的相似度 neg_sim (query_emb * neg_emb).sum(dim-1) / temperature # 将正样本相似度和负样本相似度拼接 logits torch.cat([pos_sim.unsqueeze(1), neg_sim.unsqueeze(1)], dim-1) labels torch.zeros(query_emb.size(0), dtypetorch.long).to(query_emb.device) return F.cross_entropy(logits, labels)温度系数temperature是一个超参数。温度越低分布越尖锐模型对难负例越敏感温度越高分布越平滑。常见取值在0.02到0.1之间。上面示例里每个query只配1个负例为了让对比学习更稳定实际项目中建议一个query配多个负例比如4个或8个。实现时只需把neg_sim变成多个负例的相似度拼接即可。4.4 LoRA微调代码用PEFT库实现LoRA配置冻结原模型参数只训练低秩矩阵。# 文件路径train_embedding.py import json import torch from torch.utils.data import DataLoader from transformers import AutoTokenizer, get_linear_schedule_with_warmup from peft import LoraConfig, get_peft_model, TaskType from modeling_qwen3_embedding import Qwen3EmbeddingModel from dataset import ContrastiveDataset from loss import contrastive_loss # 1. 加载模型和tokenizer model_name Qwen/Qwen3-1.7B base_model Qwen3EmbeddingModel(model_name) tokenizer base_model.tokenizer # 2. 配置LoRA lora_config LoraConfig( task_typeTaskType.FEATURE_EXTRACTION, r16, lora_alpha32, lora_dropout0.05, target_modules[q_proj, k_proj, v_proj, o_proj], biasnone, ) model get_peft_model(base_model, lora_config) model.train() # 3. 读取训练数据 with open(data/train_data.json, r, encodingutf-8) as f: train_data json.load(f) dataset ContrastiveDataset(train_data, tokenizer) dataloader DataLoader(dataset, batch_size8, shuffleTrue) # 4. 优化器和学习率 optimizer torch.optim.AdamW(model.parameters(), lr1e-5) total_steps len(dataloader) * 3 scheduler get_linear_schedule_with_warmup(optimizer, num_warmup_stepsint(total_steps * 0.1), num_training_stepstotal_steps) # 5. 训练循环 device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) for epoch in range(3): total_loss 0 for batch in dataloader: query_input_ids batch[query_input_ids].to(device) query_attention_mask batch[query_attention_mask].to(device) pos_input_ids batch[pos_input_ids].to(device) pos_attention_mask batch[pos_attention_mask].to(device) neg_input_ids batch[neg_input_ids].to(device) neg_attention_mask batch[neg_attention_mask].to(device) query_emb model(query_input_ids, query_attention_mask) pos_emb model(pos_input_ids, pos_attention_mask) neg_emb model(neg_input_ids, neg_attention_mask) loss contrastive_loss(query_emb, pos_emb, neg_emb, temperature0.05) optimizer.zero_grad() loss.backward() optimizer.step() scheduler.step() total_loss loss.item() print(fEpoch {epoch 1}, Loss: {total_loss / len(dataloader):.4f}) # 6. 保存模型 model.save_pretrained(output/qwen3-embedding-lora)代码说明TaskType.FEATURE_EXTRACTION这是PEFT中表示“特征提取”任务类型的选项适用于把模型当作特征编码器来微调。r16是LoRA矩阵的秩lora_alpha32是缩放系数。显存充足且希望效果更好时可以把r调大一些。target_modules指定了Qwen3注意力层中要插入LoRA的模块覆盖了自注意力中的四个投影矩阵。学习率设置为1e-5Embedding微调一般不需要太大学习率容易破坏原有语义空间。训练轮数先设置为3轮观察loss变化情况。4.5 推理加载微调后的Embedding模型训练完成后加载LoRA权重进行推理from peft import PeftModel base_model Qwen3EmbeddingModel(Qwen/Qwen3-1.7B) model PeftModel.from_pretrained(base_model, output/qwen3-embedding-lora) model.eval() query_emb model.encode_texts([高血压患者能吃柚子吗]) doc_emb model.encode_texts([柚子和降压药物同服可能增加低血压风险]) similarity torch.nn.functional.cosine_similarity(query_emb, doc_emb) print(similarity.item())如果训练数据构造合理微调后这两个文本的相似度应该比微调前更高。5. 将微调模型接入RAG流程微调完成并不是终点真正重要的是把模型替换进RAG链路并确认检索效果真的变好了。5.1 替换文本向量化模块如果之前的RAG项目用的是LangChain或LlamaIndex通常只需要替换Embedding模型。以LangChain为例你可能会用HuggingFaceEmbeddings加载一个本地模型。这里需要自己实现一个基于Qwen3微调模型的Embedding类。# 文件路径qwen3_embedding_for_langchain.py from langchain_core.embeddings import Embeddings from modeling_qwen3_embedding import Qwen3EmbeddingModel class Qwen3FineTunedEmbeddings(Embeddings): def __init__(self, base_model_nameQwen/Qwen3-1.7B, lora_pathoutput/qwen3-embedding-lora): from peft import PeftModel self.model Qwen3EmbeddingModel(base_model_name) self.model PeftModel.from_pretrained(self.model, lora_path) self.model.eval() def embed_documents(self, texts): embs self.model.encode_texts(texts) return embs.cpu().numpy().tolist() def embed_query(self, text): emb self.model.encode_texts([text]) return emb.cpu().numpy().tolist()[0]然后在构建向量索引时把原来的Embedding实例替换为这个类from qwen3_embedding_for_langchain import Qwen3FineTunedEmbeddings embeddings Qwen3FineTunedEmbeddings( base_model_nameQwen/Qwen3-1.7B, lora_pathoutput/qwen3-embedding-lora )注意使用向量库离线构建索引时必须全部使用同一个微调模型。千万不要一部分文档用旧模型向量化一部分文档用新模型向量化或者索引时用微调模型查询时误用了基础模型。向量的分布会因为模型参数不同而产生偏移导致相似度计算失真。5.2 明确向量库的清理与重建步骤替换模型后原来向量库中的向量已经“过时”了必须清理并重新构建索引。清理方式取决于你使用的向量数据库如果使用的是FAISS这种本地向量索引直接删除本地索引文件重新跑离线脚本即可。如果使用的是Milvus、Qdrant等独立向量数据库则需要删除原有Collection或按partition分区清理再重新写入。# 以FAISS本地索引为例先删除旧索引 rm -rf data/faiss_index # 重新运行索引构建脚本 python build_index.py重建完成后建议做一个简单的“检索验证”随机抽取几条业务测试问题手动查看返回的TopK文档片段是否比微调前更相关。这一步不能省因为loss下降不代表检索效果一定变好。5.3 效果评估方法评估RAG检索效果不能只看一两个问题的感觉最好建立一个评估集。建议准备几十到几百条“问题-相关文档”配对数据然后计算以下几个指标指标含义说明RecallKTopK检索结果中包含相关文档的比例衡量模型“能不能把对的找出来”MRR第一个相关结果排名的倒数均值衡量模型“把相关结果排得多靠前”Top1命中率第一个结果就是相关文档的比例对RAG问答影响最直接如果微调后Recall5和MRR都明显提升说明向量空间确实朝着有利于业务的方向调整了。如果指标下降优先检查训练数据和模型是否加载正确。6. 常见问题与排查思路6.1 显存不足OOM现象训练一启动就报CUDA out of memory。常见原因模型太大训练批次太大。没有做梯度累积或混合精度训练。解决思路换更小的Qwen3版本比如从7B换到1.7B。降低batch_size比如从8降到2或1。开启梯度累积让多个小batch累积更新一次梯度。使用torch.cuda.amp混合精度训练减少显存占用。from torch.cuda import amp # 训练循环内 with amp.autocast(): query_emb model(query_input_ids, query_attention_mask) pos_emb model(pos_input_ids, pos_attention_mask) neg_emb model(neg_input_ids, neg_attention_mask) loss contrastive_loss(query_emb, pos_emb, neg_emb) optimizer.zero_grad() scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()6.2 Loss不下降或下降非常慢可能原因学习率过大或过小。过大会导致loss震荡过小则迟迟不收敛。数据质量问题。正负例区分度不够模型学不到稳定规律。温度系数不合理。排查步骤先试几个典型样本看模型输出的相似度分布是否合理。把温度从0.05往上调或往下调试几次。检查训练数据中的正例是否真的有相关性。优先怀疑数据。数据质量差时再怎么调超参数都是白费功夫。6.3 微调后检索效果反而变差可能原因训练数据规模太小模型过拟合到了少量样本的“表面模式”。负例选择太简单模型没有学到深层的语义差异。池化方式不适合当前任务。评估集本身有偏差。解决方案增加更多负例特别是“难负例”。难负例指那些字面上有点相关、但实际不相关的文本。引入难负例可以逼模型学到更细致的语义边界。用更大的数据量做训练。微调后和微调前在同一评估集上做AB对比确认效果方向。6.4 加载模型时报错key not found可能原因LoRA训练时的基座模型与加载LoRA权重时的基座模型不一致或者模型路径写错。排查步骤确认训练时的model_name与加载时的base_model_name完全一致。确认lora_path下存在adapter_config.json和adapter_model.bin。确认PeftModel.from_pretrained传入的是基础模型实例而不是已经加载LoRA的模型实例。7. 最佳实践与工程建议7.1 训练数据优先于模型选择很多团队在微调时第一反应是换更大的模型或者调更多的训练轮数。但根据我的经验Embedding微调的效果上限主要由训练数据决定。数据里如果有大量错误标注模型再强也会学偏。建议先建立小规模高精度的评估集。用评估集验证当前模型的短板在哪里。针对短板构造训练数据。迭代式训练而不是一次性训练很久。7.2 不要只依赖Embedding结合Rerank做双重保障Embedding微调解决的是“召回准确率”问题Rerank解决的是“精排准确率”问题。二者可以叠加使用。Embedding模型负责从海量候选片段中粗筛出Top50Rerank模型再对这50个片段做精细打分选出Top5或Top3。微调后的Embedding 一个好的Rerank模型是目前RAG检索优化中性价比较高的组合方案。在LangChain中可以这样串联from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import CrossEncoderReranker retriever vectorstore.as_retriever(search_kwargs{k: 50}) compressor CrossEncoderReranker(model_nameyour_rerank_model, top_n5) compression_retriever ContextualCompressionRetriever( base_compressorcompressor, base_retrieverretriever )7.3 定期更新Embedding模型业务文档会不断更新领域术语也可能变化。Embedding模型不是训练一次就一劳永逸。建议每月或每季度收集新增的问答日志和反馈数据。在旧训练数据基础上补充新数据做增量微调。每次更新后在同一评估集上做回归测试防止效果倒退。7.4 关注数据安全与合规微调数据可能包含敏感业务信息。训练Embedding模型时要注意训练数据在本地GPU环境处理不要随意上传到外部API。若使用开源模型微调确认模型许可证允许你的使用场景。生产环境上线前对训练数据进行脱敏处理尤其是涉及个人信息、交易数据的内容。在正式环境变更Embedding模型时先在测试集和灰度环境验证再全量替换。7.5 保留未微调模型作为对照组建议微调训练后不要立刻删除原来的Embedding模型。保留一个旧版本方便在评估集上反复对比效果。有时候微调后的模型在个别问题上变好了但全局可能变差。只有保留对照组才能及时发现这种问题。8. 总结与实践建议本文从RAG检索不准的痛点出发梳理了基于Qwen3微调Embedding模型的完整流程。核心要点可以总结为几句话Embedding模型是RAG检索质量的源头通用Embedding模型在领域场景下存在语义理解偏差。微调Embedding的目标是调整向量空间让问题与相关文档片段在向量空间中更接近。训练方式以对比学习为主LoRA可以显著降低显存门槛。训练数据质量决定效果上限建议建立评估集迭代验证。微调后需要重建向量索引并考虑与Rerank模型配合使用。如果接下来要深入可以从这几个方向继续学习对比学习的进阶策略如难负例挖掘Rerank模型的训练与选择向量数据库的索引参数调优以及更大参数基座模型下的分布式微调方案。你在做RAG相关项目时是遇到了检索结果不准的问题还是打算提前把Embedding微调能力储备起来欢迎在评论区交流遇到的报错或踩坑经历。如果本文对你有帮助可以收藏备用。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门