Qwen3 Embedding 與 Reranker 微調(diào)實(shí)踐:從理論到落地的完整指南 原創(chuàng)
在檢索增強(qiáng)生成(RAG)系統(tǒng)中,“召回” 與 “排序” 是決定效果的兩大核心環(huán)節(jié)。Qwen3 系列開源模型通過 Embedding 與 Reranker 的組合,為這兩個(gè)環(huán)節(jié)提供了高效解決方案 ——Embedding 負(fù)責(zé)從海量數(shù)據(jù)中 “粗召回” 相關(guān)內(nèi)容,Reranker 則對召回結(jié)果 “精排序”,讓最相關(guān)的信息脫穎而出。
本文將記錄如何通過 LoRA 微調(diào)讓這兩個(gè)模型適配垂直領(lǐng)域。
一、為什么需要微調(diào)?
Qwen3 的 Embedding 和 Reranker 模型在通用場景表現(xiàn)優(yōu)異,但在垂直領(lǐng)域(如專業(yè)術(shù)語密集的農(nóng)林牧漁、醫(yī)療等)仍有提升空間。微調(diào)的核心價(jià)值在于:讓模型 “吃透” 領(lǐng)域語義,提升檢索精度。
- Embeding模型:將文本轉(zhuǎn)化為向量,通過向量相似度實(shí)現(xiàn) “粗召回”。以單個(gè)文本片段作為輸入,用與最終[結(jié)束符]([EOS])對應(yīng)位置的隱藏狀態(tài)向量提取語義表示。
 - Reranking模型:對召回的文本對(查詢 + 文檔)進(jìn)行相關(guān)性判斷,輸出 “yes” 或 “no”,并以 “yes” 的概率作為排序依據(jù)。以文本對(例如用戶查詢與候選文檔)作為輸入,取最后一層的 yes 和 no 這兩個(gè)token的logit 取log_softmax后,取yes 所在位置的分?jǐn)?shù)作為 score。
 
二、環(huán)境準(zhǔn)備
通過??ms-swift??工具簡化流程,安裝命令:
pip install ms-swift -U
pip install torch transformers datasets accelerate??ms-swift??是阿里達(dá)摩院推出的大模型微調(diào)工具,支持 Qwen3 全系列模型,內(nèi)置 LoRA 優(yōu)化和訓(xùn)練可視化功能。
三、實(shí)戰(zhàn):Qwen3 Embedding 微調(diào)全流程
3.1 數(shù)據(jù)準(zhǔn)備:挖掘 “難負(fù)樣本”
Embedding 模型的微調(diào)效果,關(guān)鍵在于 “難負(fù)樣本”—— 即與查詢語義相似但實(shí)際無關(guān)的文本。這類樣本能強(qiáng)迫模型學(xué)習(xí)更精細(xì)的語義差異。
- 數(shù)據(jù)源:采用農(nóng)林牧漁領(lǐng)域問答數(shù)據(jù)集?
?Chinese-QA-Agriculture_Forestry_Animal_Husbandry_Fishery??(可從 Hugging Face 獲?。?/li> - 負(fù)樣本挖掘工具:使用?
?sentence-transformers???庫的??mine_hard_negatives??函數(shù),步驟如下: 
from datasets import load_dataset
from sentence_transformers import SentenceTransformer
from sentence_transformers.util import mine_hard_negatives
# 加載原始數(shù)據(jù)
dataset = load_dataset("parquet", data_files="/path/to/Chinese-QA-AFAF-train-v2.parquet")
split_dataset = dataset["train"].train_test_split(test_size=0.95, seed=42)  # 劃分訓(xùn)練集和測試集
# 加載基礎(chǔ)模型用于初步檢索
embedding_model = SentenceTransformer("/path/to/m3e-small")
# 挖掘難負(fù)樣本
hard_train_dataset = mine_hard_negatives(
    split_dataset['train'],
    embedding_model,
    anchor_column_name="prompt",  # 查詢列
    positive_column_name="response",  # 正例列
    num_negatives=5,  # 每個(gè)查詢配5個(gè)負(fù)例
    range_min=20,  # 跳過最相似的前20個(gè)(避免與正例太近)
    range_max=50,  # 考慮前50個(gè)相似樣本
    max_score=0.8,  # 負(fù)例與查詢的相似度不超過0.8
    absolute_margin=0.1,  # 負(fù)例相似度需比正例低至少0.1
    use_faiss=True  # 用FAISS加速檢索
)
# 轉(zhuǎn)換為訓(xùn)練格式(查詢+正例+負(fù)例)
def format_data(example):
    correct_resp = next(resp for resp, label in zip(example['response'], example['labels']) if label == 1)
    rejected_resps = [resp for resp, label in zip(example['response'], example['labels']) if label == 0]
    return {
        "query": example['prompt'],
        "response": correct_resp,
        "rejected_response": rejected_resps
    }
# 保存為JSON
hard_train_dataset.map(format_data).to_json("/path/to/qwen3_emb_train.json", force_ascii=False)示例數(shù)據(jù)如下(體現(xiàn) “相似但無關(guān)”):
{
    "query": "綠色對老年人有哪些健康益處?",
    "response": "綠色環(huán)境能幫助老年人放松神經(jīng)、穩(wěn)定血壓...",
    "rejected_response": [
        "綠茶可預(yù)防心血管疾病...",  // 同含“綠色”但主題不同
        "生態(tài)養(yǎng)殖產(chǎn)出綠色食品..."
    ]
}3.2 訓(xùn)練配置:用 ms-swift 啟動(dòng) LoRA 微調(diào)
Embedding 微調(diào)需使用??InfoNCE損失??(鼓勵(lì)查詢與正例向量更相似,與負(fù)例更疏遠(yuǎn)),通過 ms-swift 工具簡化流程,訓(xùn)練腳本如下:
# 設(shè)置環(huán)境變量,過濾無效負(fù)例
INFONCE_MASK_FAKE_NEGATIVE=true
# 啟動(dòng)微調(diào)
swift sft \
  --model /path/to/Qwen3-Embedding-0.6B \  # 基礎(chǔ)模型路徑
  --task_type embedding \  # 任務(wù)類型
  --model_type qwen3_emb \  # 模型類型
  --train_type lora \  # 采用LoRA微調(diào)
  --dataset /path/to/qwen3_emb_train.json \  # 訓(xùn)練數(shù)據(jù)
  --split_dataset_ratio 0.05 \  # 5%數(shù)據(jù)作為驗(yàn)證集
  --eval_strategy steps \  # 按步驟驗(yàn)證
  --output_dir ./emb_output \  # 輸出目錄
  --eval_steps 100 \  # 每100步驗(yàn)證一次
  --num_train_epochs 1 \  # 訓(xùn)練輪次
  --save_steps 100 \  # 每100步保存一次
  --per_device_train_batch_size 4 \  # 單卡批次大小
  --gradient_accumulation_steps 4 \  # 梯度累積步數(shù)
  --learning_rate 6e-6 \  # 學(xué)習(xí)率
  --loss_type infonce  # 采用InfoNCE損失- ?
?--loss_type infonce??:通過下面公式強(qiáng)制模型拉大正負(fù)樣本的相似度差距。 
- ?
?--train_type lora??:僅訓(xùn)練部分參數(shù),減少顯存占用。 - 訓(xùn)練過程中重點(diǎn)關(guān)注?
?eval/margin??指標(biāo)(正例與負(fù)例的相似度差值) 
四、實(shí)戰(zhàn):Qwen3 Reranker 微調(diào)全流程
4.1 數(shù)據(jù)準(zhǔn)備:構(gòu)建 “相關(guān)性判斷” 樣本
Reranker 的核心是判斷 “查詢 - 文檔” 對是否相關(guān),因此數(shù)據(jù)需包含 “查詢 + 文檔 + 是否相關(guān)” 標(biāo)簽(yes/no)。
- 數(shù)據(jù)源:同 Embedding,基于農(nóng)林牧漁問答數(shù)據(jù)構(gòu)造,示例格式:
 
{
    "system": "Judge whether the Document meets the requirements based on the Query and the Instruct. Answer only 'yes' or 'no'.",
    "input": ": Retrieve relevant passages for the query\n: 封閉式陽臺(tái)冬季如何解決春蘭春化問題?\n: 連棟溫室大棚降濕方法:通風(fēng)除濕。",
    "output": "\n\n\nno"  // 文檔與查詢無關(guān)
}- 負(fù)樣本處理:通過隨機(jī)抽取領(lǐng)域內(nèi)不相關(guān)文檔(如用 “溫室降濕” 匹配 “春蘭春化” 問題),確保正負(fù)樣本比例均衡(約 1:1)。
 
4.2 訓(xùn)練配置:用 SFT 微調(diào)相關(guān)性判斷能力
Reranker 采用 “生成式微調(diào)”,直接訓(xùn)練模型輸出 “yes” 或 “no”,核心腳本如下:
swift sft \
  --model /path/to/Qwen3-Reranker-0.6B \  # 基礎(chǔ)模型路徑
  --dataset /path/to/qwen3_rerank_train.json \  # 訓(xùn)練數(shù)據(jù)
  --model_type qwen3 \  # 模型類型
  --split_dataset_ratio 0.05 \  # 驗(yàn)證集比例
  --torch_dtype bfloat16 \  # 數(shù)據(jù)類型,節(jié)省顯存
  --lora_rank 8 \  # LoRA秩,控制參數(shù)規(guī)模
  --lora_alpha 32 \  # LoRA縮放因子
  --target_modules all-linear \  # 微調(diào)所有線性層
  --eval_strategy steps \
  --output_dir ./rerank_output \
  --max_steps 1000 \  # 最大訓(xùn)練步數(shù)
  --eval_steps 100 \
  --num_train_epochs 1 \
  --save_steps 100 \
  --per_device_train_batch_size 4 \
  --gradient_accumulation_steps 4 \
  --learning_rate 6e-6 \  # 學(xué)習(xí)率
  --loss_scale ignore_empty_think \  # 忽略無效思考過程的損失
  --system 'Judge whether the Document meets the requirements. Answer only "yes" or "no".'  # 系統(tǒng)提示,約束輸出格式- 關(guān)鍵設(shè)計(jì):通過?
?--system??參數(shù)強(qiáng)制模型輸出 “yes” 或 “no”,后續(xù)可直接用 “yes” 的生成概率作為排序依據(jù)(概率越高,相關(guān)性越強(qiáng))。 
五、總結(jié):微調(diào)讓 RAG 系統(tǒng) “懂” 領(lǐng)域
通過 LoRA 微調(diào),Qwen3 Embedding 和 Reranker 能快速適配垂直領(lǐng)域:
- Embedding 的 “粗召回” 更精準(zhǔn),減少漏檢;
 - Reranker 的 “精排序” 更可靠,過濾無關(guān)信息。
 
參考文獻(xiàn)
- 王鵬 LLM,《Qwen3 Reranker 模型 Lora 微調(diào)實(shí)戰(zhàn)》,??https://mp.weixin.qq.com/s/TKW_eVFAZtfrVlRVT4mbJA??,2025-06-14,來源:微信公眾號
 - 王鵬 LLM,《Qwen3 Embeding 模型 Lora 微調(diào)實(shí)戰(zhàn)》,??https://mp.weixin.qq.com/s/ZS_4VITX78qWndiZl8_BAg??,2025-06-09,來源:微信公眾號
 
本文轉(zhuǎn)載自??鴻煊的學(xué)習(xí)筆記??,作者:乘風(fēng)破浪jxj


















