请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

三种方式跑出来的余弦相似度不一样

0.63, 0.60, 0.60后面的两个方法结果一样,但是和视频里展示的不一样
图片描述图片描述图片描述

正在回答

插入代码

3回答

你好,从你SentenceTransformer中的模型结构来,

  • SentenceTransformer中计算句子embedding的方式是采用所有token的均值('pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True)。

  • 而第一种方式中:是采用cls分类token来表示整个句子的embeeding(也就是BERT架构的CLS token)(outputs.last_hidden_state[:, 0] 第一个token)。导致这两种计算方式不一样,也可以通过调整参数来保持一致

可以通过调整SentenceTransformer结构中的pooling方式,把SentenceTransformer改成cls token的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from sentence_transformers import SentenceTransformer, models
model_path = './data/llm_app/embedding_models/gte-large-zh/'
model = SentenceTransformer(model_path)
 
# 创建新的 Pooling 层,修改 pooling_mode_cls_token 和 pooling_mode_mean_tokens
pooling = models.Pooling(
    word_embedding_dimension=1024,  # 保持与原来一致
    pooling_mode_cls_token=True,    # 修改为 True 或 False
    pooling_mode_mean_tokens=False,  # 修改为 True 或 False
    pooling_mode_max_tokens=False,
    pooling_mode_mean_sqrt_len_tokens=False,
    pooling_mode_weightedmean_tokens=False,
    pooling_mode_lasttoken=False,
    include_prompt=True
)
model._modules['1'= pooling

这样模型的结构就调整成cls token来计算pooling

可以试下

0 回复 有任何疑惑可以回复我~
提问者 龙仔小帅_qADQ46 2025-03-07 15:00:24

https://img1.sycdn.imooc.com/szimg/be020a6709ca993c10191021.jpg

https://img1.sycdn.imooc.com/szimg/095cd96709ca993c08240494.jpg

https://img1.sycdn.imooc.com/szimg/e781eb6709ca993c08720752.jpg

embeding不一样

0 回复 有任何疑惑可以回复我~
  • 你好,从你SentenceTransformer中的模型结构来,SentenceTransformer中计算句子embedding的方式是采用所有token的均值('pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True)。而第一种方式中:是采用cls分类token来表示整个句子的embeeding(也就是BERT架构的CLS token)(outputs.last_hidden_state[:, 0] 第一个token)。导致这两种计算方式不一样,也可以通过调整参数来保持一致,见上面最新回复的代码
    回复 有任何疑惑可以回复我~ 2025-03-08 21:10:04
阿基米口 2025-03-07 14:20:21
  1. Sentence-Transformers和huggingface结果一样是正常的,huggingface中的embedding是Sentence-Transformers的封装。

  2. 我这边重复执行三个都是一样的,所以需要你这边打印一些信息来看看区别

把三个model 的结果都打印出来看看 直接print就可以

  • 1
    2
    3
    4
    model_path = './data/llm_app/embedding_models/gte-large-zh/'
    tokenizer = AutoTokenizer.from_pretrained(model_path)
    model = AutoModel.from_pretrained(model_path, device_map='cpu')
    print(model)
  • 1
    2
    model = SentenceTransformer(model_path)
    print(model)


把embeding打印出来

提供下sentence_transformers的版本

1
2
import sentence_transformers
sentence_transformers.__version__


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号