
人工智能NLPEmbedding微调【免费下载链接】sentence-transformersState-of-the-Art Embeddings, Retrieval, and Reranking项目地址https://gitcode.com/gh_mirrors/se/sentence-transformers点击查看免费下载本文基于仓库中的 docs/cross_encoder/pretrained_models.md系统梳理 sentence-transformers 生态中官方与社区发布的预训练 CrossEncoder交叉编码器 / Reranker模型涵盖模型库的获取方式、各任务方向的模型清单与评测指标、加载与推理代码并结合 cross_encoder/model.py 等源码讲解predict/rank/activation_fn等核心机制。读完本文你将能按任务重排序、语义相似度、重复问题检测、NLI、多模态排序正确选型预训练模型并写出可直接运行的推理代码。CrossEncoder也称 Reranker不产生单个句子的 embedding而是把查询与候选文档拼接成对同时送入 Transformer输出一个相关性分数。由于两段文本共享注意力计算它的精度通常高于双塔式的 SentenceTransformer代价是必须对每个 (query, document) 对单独计算一次速度更慢。因此在实际检索系统中CrossEncoder 几乎总是作为第二阶段用于对召回结果做精细化重排序。sentence-transformers 的 CrossEncoder 将查询与文档拼接后一次性送入 Transformer输出 0~1 的相关性分数图片来源仓库 docs/img/CrossEncoder.png。快速上手一行代码加载预训练模型官方通过 CrossEncoder Hugging Face 组织发布了多种预训练模型社区也贡献了大量公开模型。所有模型都可以用同一套接口加载与推理from sentence_transformers import CrossEncoder import torch # 加载 https://huggingface.co/cross-encoder/ms-marco-MiniLM-L6-v2 model CrossEncoder(cross-encoder/ms-marco-MiniLM-L6-v2, activation_fntorch.nn.Sigmoid()) scores model.predict([ (How many people live in Berlin?, Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers.), (How many people live in Berlin?, Berlin is well known for its museums.), ]) # array([0.9998173 , 0.01312432], dtypefloat32)从源码看CrossEncoder 的构造函数会先按model_name_or_path判断加载方式本地路径直接加载否则尝试从 Hugging Face Hub 下载预训练模型。加载时它自动识别两类架构序列分类架构Transformer(transformer_tasksequence-classification)即 BERT / RoBERTa / DeBERTa 等带分类头的经典 encoder直接输出分数无需额外模块见 model.py 中的_load_default_modules生成式架构CausalLM以text-generation任务加载因果语言模型并用 LogitScore 模块 取出最后一个 token 位置处yes/no的 logit 差值作为相关性分数见 model.py 的 CausalLM 分支。CrossEncoder 的输入必须是成对的文本对、图文对等多模态组合均可输出是一个分数回归num_labels1或类别概率分类num_labels1。它不支持单句输入也不为单个文本计算 embedding——这是它与 SentenceTransformer 最本质的区别。此外predict的默认batch_size32且推理时会按输入长度排序分批见 model.py 的_inference在正式跑大数据量前建议先在小样本上基准测试几个 batch size 以找到当前硬件上的最优值。模型库与 Hugging Face 生态如何找到合适的模型官方与社区模型都托管在 Hugging Face Hub 上搜索时需要注意 tag 规则官方原版模型CrossEncoder 官方组织下的模型搜索sentence-transformers库标签并限定作者为cross-encoder即可社区模型搜索所有带sentence-transformers库标签且 pipeline 为text-ranking的模型。一个容易混淆的细节sentence-transformers库标签被全部四类模型Sentence Transformer、CrossEncoder、Sparse Encoder、Multi-Vector Encoder共用而 CrossEncoder 是其中唯一没有单一干净过滤条件的类型。社区模型链接使用的text-rankingpipeline 标签只覆盖重排序模型并不包括本页下方提到的分类模型如 QNLI、STSbenchmark、Quora、NLI。此外用较新版本训练出的模型还会额外带有cross-encoder标签不过本页列出的大部分模型早于该标签出现。相应地sparse和multi-vector标签分别对应 Sparse Encoder 与 Multi-Vector Encoder 模型而稠密 Sentence Transformer 模型构成了该库标签返回结果的主体。下文按训练数据集/任务方向逐一介绍官方发布的预训练模型。所有表格中的指标均来自模型官方模型卡中报告的数据请以对应模型页面的最新信息为准。MS MARCO面向搜索系统的重排序模型MS MARCO Passage Retrieval 是一个大规模数据集包含来自 Bing 搜索引擎的真实用户查询以及人工标注的相关文本段落。在此数据集上训练的模型非常适合作为搜索系统的Reranker。模型名NDCG10TREC DL 19MRR10MS Marco DevDocs / Seccross-encoder/ms-marco-TinyBERT-L2-v269.8432.569000cross-encoder/ms-marco-MiniLM-L2-v271.0134.854100cross-encoder/ms-marco-MiniLM-L4-v273.0437.702500cross-encoder/ms-marco-MiniLM-L6-v274.3039.011800cross-encoder/ms-marco-MiniLM-L12-v274.3139.02960cross-encoder/ms-marco-electra-base71.9936.41340表中最常用的是加粗的cross-encoder/ms-marco-MiniLM-L6-v2在精度NDCG10 74.30与吞吐约 1800 docs/sec之间取得了很好的平衡。从表中可以清晰看到模型规模与速度的权衡TinyBERT-L2 最快9000 docs/sec但精度最低MiniLM-L12 与 L6 精度几乎持平但速度几乎减半ELECTRA-base 精度反而不如 MiniLM 系列速度也最慢。重要提示MS MARCO 系列模型默认输出的是logits原始分数合理取值范围约在 -10 到 10 之间而非 0~1 的分数。若希望强制输出 0~1 之间的分数需要显式传入activation_fntorch.nn.Sigmoid()。注意这只会缩放分数数值不会改变排序结果见 docs/cross_encoder/usage/usage.rst 的说明。从源码看activation_fn的默认解析逻辑位于 model.py 的get_default_activation_fn优先读取模型配置config.sentence_transformers[activation_fn]并兼容 v4.0 之前的sbert_ce_default_activation_function字段若配置中不存在则在num_labels 1时回退到nn.Sigmoid()否则使用nn.Identity()。这解释了为什么不同模型加载后默认输出分布不同——MS MARCO 模型通常保存了 Identity而 STSb 等模型保存了 Sigmoid。用 rank() 对候选文档排序MS MARCO 模型最常见的用法是重排序。CrossEncoder.rank(query, documents)内部会把查询与每个文档拼成对、调用predict、按分数降序排序并返回{corpus_id, score, text}列表见 model.py 的rank实现from sentence_transformers import CrossEncoder model CrossEncoder(cross-encoder/ms-marco-MiniLM-L6-v2) query How many people live in Berlin? passages [ Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers., Berlin is well known for its museums., The urban area of Berlin comprised about 4.1 million people in 2014, making it the seventh most populous urban area in the European Union., The city of Paris had a population of 2,165,423 people within its administrative city limits as of January 1, 2019, ] ranks model.rank(query, passages) for rank in ranks: print(f{rank[score]:.2f}\t{passages[rank[corpus_id]]})注意两点一是rank只对num_labels1的模型生效多标签分类模型需要改用predict源码在 model.py 的rank开头做了校验二是排序是分数相对大小决定的与是否套 Sigmoid 无关。Retrieve Re-Rank 完整流水线MS MARCO 模型在真实系统中的标准用法是两阶段检索流水线先用 SentenceTransformerBi-Encoder快速召回约 100 个候选再用 CrossEncoder 精排。Retrieve Re-Rank 流程Bi-Encoder 快速召回候选集CrossEncoder 对候选逐一打分精排图片来源仓库 docs/img/InformationRetrieval.png。仓库提供了完整可运行的示例与 Notebookexamples/sentence_transformer/applications/retrieve_rerank/README.md其中包括retrieve_rerank_simple_wikipedia.ipynb以 Simple English Wikipedia 为文档库Bi-Encoder 召回 CrossEncoder 精排后返回 Top-5 段落in_document_search_crossencoder.py段落规模较小时可跳过召回阶段直接用 CrossEncoder 对全文段落打分适合单文档内搜索。SQuADQNLI问答段落相关性模型QNLI 基于 SQuAD 数据集由 GLUE Benchmark 提出标注者针对维基百科段落编写了可由该段落回答的问题。这类模型对「段落能否回答该问题」输出更高分数适合用于问答系统的证据段落筛选。模型名QNLI dev 集准确率cross-encoder/qnli-distilroberta-base90.96cross-encoder/qnli-electra-base93.21其中qnli-electra-base的准确率更高93.21适合对精度要求更高的问答场景qnli-distilroberta-base则更轻量。STSbenchmark句子对语义相似度模型STSbenchmarkSemantic Textual Similarity模型输出 0~1 的分数表示给定句子对的语义相似程度from sentence_transformers import CrossEncoder model CrossEncoder(cross-encoder/stsb-roberta-base) scores model.predict([(Its a wonderful day outside., Its so sunny today!), (Its a wonderful day outside., He drove to work earlier.)]) # array([0.60443085, 0.00240758], dtypefloat32)模型名STSbenchmark Test 性能cross-encoder/stsb-TinyBERT-L485.50cross-encoder/stsb-distilroberta-base87.92cross-encoder/stsb-roberta-base90.17cross-encoder/stsb-roberta-large91.47从表中可以看到清晰的规模-精度梯度从 TinyBERT-L4 的 85.50 到 roberta-large 的 91.47。与 MS MARCO 模型不同STSb 模型保存了 Sigmoid 激活配置因此默认就输出 0~1 的相似度分数。这类模型可直接用于小规模语料上的成对相似度打分例如去重、文本匹配等场景。Quora Duplicate Questions重复问题检测模型这类模型在 Quora 重复问题数据集 上训练用法与 STSb 模型相同输出 0~1 的分数表示两个问题是重复问题的概率。模型名dev 集 Average Precisioncross-encoder/quora-distilroberta-base87.48cross-encoder/quora-roberta-base87.80cross-encoder/quora-roberta-large87.91重要提示这类模型不适用于问题相似度判断。例如 How to learn Java? 与 How to learn Python? 虽然语义上都是如何学习编程但它们不是重复问题因此得分会很低。如果要做的是问题相似度而非重复检测应该使用在 Quora 数据集上训练的 SentenceTransformerBi-Encoder模型其相似度结果会更有意义。NLI自然语言推理模型NLINatural Language Inference模型回答的问题是给定两个句子它们是矛盾contradiction、蕴含entailment还是中性neutral关系以下模型在 SNLI 和 MultiNLI 数据集上训练模型名MNLI mismatched 集准确率cross-encoder/nli-deberta-v3-base90.04cross-encoder/nli-deberta-base88.08cross-encoder/nli-deberta-v3-xsmall87.77cross-encoder/nli-deberta-v3-small87.55cross-encoder/nli-roberta-base87.47cross-encoder/nli-MiniLM2-L6-H76886.89cross-encoder/nli-distilroberta-base83.98NLI 模型是多标签分类模型num_labels3因此predict返回每个类别的 logits需要配合argmax映射为标签from sentence_transformers import CrossEncoder model CrossEncoder(cross-encoder/nli-deberta-v3-base) scores model.predict([ (A man is eating pizza, A man eats something), (A black race car starts up in front of a crowd of people., A man is driving down a lonely road.), ]) # Convert scores to labels label_mapping [contradiction, entailment, neutral] labels [label_mapping[score_max] for score_max in scores.argmax(axis1)] # [entailment, contradiction]从源码角度补充一个细节当num_labels 1时predict支持apply_softmaxTrue参数对每个样本的各类别分数做 softmax 使其和为 1见 model.py 的_inference不传时输出原始 logitsargmax即可得到类别索引。这也是 NLI 场景的标准写法。Multimodal Rerankers跨模态重排序模型多模态 Reranker 可以对不同模态组合的输入对打分例如「文本查询 × 图片文档」「图片查询 × 文本候选」等覆盖图像、视频、音频与文本。从源码结构看这类模型与纯文本的 CausalLM CrossEncoder 使用相同的模块化架构——TransformerLogitScore——区别仅在于底层 backbone 换成了能通过 chat template 同时处理图像与文本的视觉语言模型见 docs/cross_encoder/usage/usage.rst 与 LogitScore 源码。加载模型后可以用model.modalities属性列出支持的全部模态用model.supports(...)检查某个模态或模态组合是否受支持from sentence_transformers import CrossEncoder model CrossEncoder(Qwen/Qwen3-VL-Reranker-2B) # List all supported modalities print(model.modalities) # [text, image, video, message] # Check for a specific modality print(model.supports(image)) # True print(model.supports((image, text))) # True仓库列出的一些社区多模态 Reranker 包括Qwen/Qwen3-VL-Reranker-2BQwen/Qwen3-VL-Reranker-8Bnvidia/llama-nemotron-rerank-vl-1b-v2jinaai/jina-reranker-m0多模态 Reranker 的文档输入可以是图片 URL、本地文件路径、纯文本甚至是「文本 图片」的组合字典详见 docs/input_formats.rst 对输入表示、元数据与批处理的定义。推理与调优资源同样齐全使用示例见 Cross Encoder Usage训练脚本位于 examples/cross_encoder/training/multimodal/其中展示了两种多模态训练架构Any-to-Any LogitScoretraining_doodles_any_to_any.py以transformer_taskany-to-any加载带 LM head 的完整因果语言模型用生成下一个 token 的 log-odds 作为相关性分数精度高但显存占用大Feature Extraction Pooling Densetraining_doodles_feature_extraction.py只加载 base 模型不带 LM head用lasttoken池化加 Dense 投影得到分数显存占用更省且 Dense 层权重可用embed(1) - embed(0)初始化以近似 LogitScore 行为。两种方案在 doodles 数据集上都使用BinaryCrossEntropyLoss配合 1:4 的正负样本比例与多数据集训练产出可比较的结果大模型场景下若 GPU 显存紧张优先考虑 Feature Extraction 方案。更多社区模型推荐除官方模型外社区还贡献了大量高质量 Reranker仓库文档收录的 notable 模型包括BAAI/bge-reranker-baseBAAI/bge-reranker-largeBAAI/bge-reranker-v2-m3BAAI/bge-reranker-v2-gemmaBAAI/bge-reranker-v2-minicpm-layerwisejinaai/jina-reranker-v1-tiny-enjinaai/jina-reranker-v1-turbo-enmixedbread-ai/mxbai-rerank-xsmall-v1mixedbread-ai/mxbai-rerank-base-v1mixedbread-ai/mxbai-rerank-large-v1maidalun1020/bce-reranker-base_v1Alibaba-NLP/gte-reranker-modernbert-baseAlibaba-NLP/gte-multilingual-reranker-base其中gte-multilingual-reranker-base面向多语言场景bge-reranker-v2-gemma与minicpm-layerwise属于生成式/分层推理类 Reranker。所有这些社区模型都可以用与官方模型完全相同的方式加载与调用CrossEncoder(模型名)只需注意部分模型同样需要配合activation_fntorch.nn.Sigmoid()或其他激活来得到 0~1 分数。选型建议小结综合本页内容可以按任务快速选型搜索系统重排序首选 MS MARCO 系列的cross-encoder/ms-marco-MiniLM-L6-v2精度/速度均衡追求极致吞吐选MiniLM-L2-v2追求精度上限选MiniLM-L12-v2并结合 Retrieve Re-Rank 示例搭建完整流水线问答证据段落筛选QNLI 系列的qnli-electra-base句子对语义相似度STSb 系列的stsb-roberta-base/stsb-roberta-large重复问题检测Quora 系列的quora-roberta-base注意不要将其误用于相似度判断自然语言推理NLI 系列的nli-deberta-v3-base输出需配合argmax映射为 contradiction / entailment / neutral 标签图文等跨模态排序使用 Qwen3-VL-Reranker 等多模态模型并用modalities/supports()确认模态支持。所有模型统一通过sentence_transformers.CrossEncoder加载predict适用于任意成对打分rank适用于单查询对多文档的排序仅限num_labels1。在动手前请务必确认目标模型是否自带 Sigmoid 激活观察输出是否在 0~1 区间从而决定是否需要显式传入activation_fn。赞分享人工智能NLPEmbedding微调【免费下载链接】sentence-transformersState-of-the-Art Embeddings, Retrieval, and Reranking项目地址https://gitcode.com/gh_mirrors/se/sentence-transformers点击查看免费下载相关推荐sentence-transformers CrossEncoder 实战指南从模型评分、文档重排到多模态 Rerankersentence transformers CrossEncoder 实战指南从模型评分、文档重排到多模态 Reranker 本文基于 sentence tr人工智能NLPEmbedding微调基于Sentence Transformers的MS MARCO信息检索模型训练指南基于Sentence Transformers的MS MARCO信息检索模型训练指南 项目背景与数据集介绍 MS MARCO Passage Ranking是微人工智能NLPEmbedding微调使用 sentence-transformers 微调 CrossEncoder 重排序模型从数据准备、损失函数到 Trainer 的完整训练指南使用 sentence transformers 微调 CrossEncoder 重排序模型从数据准备、损失函数到 Trainer 的完整训练指南 本篇技术指人工智能NLPEmbedding微调上一篇Umi-OCR完全免费离线OCR软件使用全攻略下一篇Windows系统优化神器Chris Titus Tech WinUtil 5分钟快速上手完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考