Sentence Transformers( SBERT)使用

图片[1]-Sentence Transformers( SBERT)使用-知行合一35社区

一、简介?

功能与特点

    • 将文本转换为高维向量,捕捉语义信息,相似语义的文本在向量空间中距离更近。
    • 支持 100 多种语言,提供预训练模型,可直接使用或微调以适应特定任务。
    • 支持多模态任务(如文本与图像的联合嵌入),例如 CLIP 模型可实现跨模态检索。
    • 开源且高效,适用于对称/非对称语义搜索、释义挖掘、问答增强生成(RAG)等场景。

    核心原理

    基于 Transformer 架构(如 BERT、RoBERTa),通过孪生网络(Siamese Networks)或三元组网络(Triplet Networks)训练,优化句子级语义表示。

      二、模型来源

      Sentence Transformers 的预训练模型主要托管在以下平台:

      Hugging Face Model Hub

        • 官方推荐的模型仓库,提供 all-MiniLM-L6-v2paraphrase-MiniLM-L6-v2 等热门模型,涵盖多语言和特定任务优化版本。
        • 模型下载方式:通过 SentenceTransformer('模型名称') 自动下载,或手动下载后指定本地路径。

        社区贡献模型

        开发者可上传自定义模型至 Hugging Face,例如多语言模型 distiluse-base-multilingual-cased 或针对特定语言对的微调模型。

          三、使用方法

          1. 安装

          通过 pip 安装库及依赖:

          pip install -U sentence-transformers transformers

          若需 GPU 加速,需额外安装 PyTorch 的 CUDA 版本。

          2. 基本使用

          (1) 加载模型与生成嵌入

          from sentence_transformers import SentenceTransformer
          
          # 加载预训练模型(以 all-MiniLM-L6-v2 为例)
          model = SentenceTransformer('all-MiniLM-L6-v2')
          
          # 编码句子列表
          sentences = ["天气真好!", "今天阳光明媚。"]
          embeddings = model.encode(sentences)

          输出为 384 维向量(all-MiniLM-L6-v2 的默认维度)。

          (2) 计算语义相似度

          from sentence_transformers import util
          
          # 计算余弦相似度
          sim = util.cos_sim(embeddings[0], embeddings[1])
          print(f"相似度:{sim.item():.4f}")  # 示例输出:0.8573

          相似度范围 [-1, 1],值越高表示语义越相近。

          (3) 语义搜索

          corpus = ["Python 是一种编程语言。", "猫在沙发上睡觉。", "深度学习需要大量数据。"]
          query = "如何学习编程?"
          
          # 生成嵌入并检索
          corpus_embeddings = model.encode(corpus)
          query_embedding = model.encode(query)
          hits = util.semantic_search(query_embedding, corpus_embeddings, top_k=2)
          
          # 输出结果
          for hit in hits[0]:
              print(f"第 {hit['corpus_id']} 条:{corpus[hit['corpus_id']} (得分:{hit['score']:.2f})")

          支持对称搜索(如问答匹配)和非对称搜索(如短查询匹配长文档)。

          3. 高级功能

          (1) 交叉编码器(Reranker)
          用于对语义搜索的 Top-K 结果重新排序,提升精度:

          from sentence_transformers import CrossEncoder
          
          reranker = CrossEncoder("cross-encoder/stsb-distilroberta-base")
          scores = reranker.predict([["查询语句", "候选文档1"], ["查询语句", "候选文档2"]])

          交叉编码器直接计算查询与文档对的相似度,精度更高但速度较慢。

          (2) 模型微调
          需准备数据集、选择损失函数并配置训练参数:

          from sentence_transformers import SentenceTransformerTrainer, losses
          from datasets import load_dataset
          
          # 加载数据集(示例为三元组数据)
          dataset = load_dataset("sentence-transformers/all-nli", "triplet")
          model = SentenceTransformer("bert-base-uncased")
          loss = losses.MultipleNegativesRankingLoss(model)
          
          # 配置训练参数
          trainer = SentenceTransformerTrainer(
              model=model,
              train_dataset=dataset["train"],
              loss=loss,
              args=dict(output_dir="my_model", num_train_epochs=1)
          )
          trainer.train()

          常用损失函数包括 TripletLoss(三元组)、CoSENTLoss(相似度得分)等。

          四、应用场景

          1. 语义搜索:替代关键词匹配,理解用户查询意图。
          2. 聚类与分类:基于嵌入向量对文本自动分组。
          3. 多语言任务:使用多语言模型(如 distiluse-base-multilingual-cased)处理跨语言检索。
          4. 图像-文本联合检索:CLIP 模型支持以文本搜索图像或反向操作。

          五、资源推荐

          • 官方文档sbert.net 提供完整 API 说明与案例。
          • 模型库Hugging Face 模型中心 包含数百个预训练模型。
          • 社区教程:CSDN、博客园等平台有丰富的实战案例(如微调中文模型、环境配置)。

          © 版权声明
          THE END
          喜欢就支持一下吧
          点赞13 分享
          评论 抢沙发

          请登录后发表评论

            暂无评论内容