FlagEmbedding icon indicating copy to clipboard operation
FlagEmbedding copied to clipboard

空字符串和其他字符串的相似度都有0.5以上?

Open wwz0123 opened this issue 1 year ago • 13 comments

为什么空字符串和其他字符串的相似度都有0.5以上? image 相似度为: image 打印出了空字符的向量: image

wwz0123 avatar Mar 27 '24 09:03 wwz0123

参考FAQ-2: https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/baai_general_embedding#frequently-asked-questions

staoxiao avatar Mar 28 '24 03:03 staoxiao

image 您好,我就是按照您的使用案例进行使用的,方法不太看的出来有什么问题。 并且,我尝试了第二种方法,仍旧得到一样的结果,空字符串也有向量输出。 image 您可以再帮忙看一下嘛?谢谢~

wwz0123 avatar Mar 28 '24 10:03 wwz0123

image

wwz0123 avatar Mar 28 '24 10:03 wwz0123

参考FAQ-2: https://github.com/FlagOpen/FlagEmbedding/tree/master/FlagEmbedding/baai_general_embedding#frequently-asked-questions

有个疑问,faq-2里

sentences_1 = ["样例数据-1", "样例数据-2"]
sentences_2 = ["样例数据-3", "样例数据-4"]

用的是两个数组,我把上面的数据改了改 我试了下得到的结果会是

[[0.8384 0.7036]
 [0.745  0.8286]]

这个是把样例数据1和3,4 样例数据2和3,4去比较得到4个相似度结果吗,有点没看懂这里数组的用法跟结果要如何对上

TChengZ avatar Apr 02 '24 08:04 TChengZ

@wwz0123 ,您好,排序关注的相似度大小关系,与绝对值无关,参考之前的回答:FAQ:The similarity score between two dissimilar sentences is higher than 0.5 。 image

使用bge-v1.5和bge-m3的相似度分布会更均匀一些。另外,空字符串是有字符输出的,这是正常的。

staoxiao avatar Apr 02 '24 08:04 staoxiao

@TChengZ 第一行[0.8384 0.7036]是"样例数据-1"对sentences_2的相似度,第二行是"样例数据-2"对sentences_2的相似度。

staoxiao avatar Apr 02 '24 08:04 staoxiao

@TChengZ 第一行[0.8384 0.7036]是"样例数据-1"对sentences_2的相似度,第二行是"样例数据-2"对sentences_2的相似度。

另外再咨询下,faq里直接

similarity = embeddings_1 @ embeddings_2.T

这个相似度计算方式和我自己调用余弦cosine计算是一样的吗

TChengZ avatar Apr 02 '24 08:04 TChengZ

@TChengZ 第一行[0.8384 0.7036]是"样例数据-1"对sentences_2的相似度,第二行是"样例数据-2"对sentences_2的相似度。

另外再咨询下,faq里直接

similarity = embeddings_1 @ embeddings_2.T

这个相似度计算方式和我自己调用余弦cosine计算是一样的吗

是的。

staoxiao avatar Apr 02 '24 08:04 staoxiao

# -*- coding: utf-8 -*-
from FlagEmbedding import FlagModel
model = FlagModel('/xxx/bge-m3', 
                  query_instruction_for_retrieval="答案比较",
                  use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation


def get_similarity(sentences_1, sentences_2):
	embeddings_1 = model.encode(sentences_1)
	embeddings_2 = model.encode(sentences_2)
	similarity = embeddings_1 @ embeddings_2.T
	return similarity.item()


if __name__=="__main__":
	sentences_1 = ["问题:问题1?答案:标准答案"]
	sentences_2 = ["问题:问题1?答案:模型回答"]
	similarity = get_similarity(sentences_1, sentences_2)
	print(similarity)

我通用上面的代码来测试自训练的大模型在一些私域知识回答的准确性。 同时这些回答也让专业人员做了一轮评分 image 整个结果来看,bge-m3的向量相似度好像并不能很客观的反应真实的文本相似度,和人工打分的结果差别很大。 请问这个是什么原因呢?是还得做bge-m3做一些私域知识的预训练才适合来做文本相似度的比较吗

TChengZ avatar Apr 03 '24 12:04 TChengZ

# -*- coding: utf-8 -*-
from FlagEmbedding import FlagModel
model = FlagModel('/xxx/bge-m3', 
                  query_instruction_for_retrieval="答案比较",
                  use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation


def get_similarity(sentences_1, sentences_2):
	embeddings_1 = model.encode(sentences_1)
	embeddings_2 = model.encode(sentences_2)
	similarity = embeddings_1 @ embeddings_2.T
	return similarity.item()


if __name__=="__main__":
	sentences_1 = ["问题:问题1?答案:标准答案"]
	sentences_2 = ["问题:问题1?答案:模型回答"]
	similarity = get_similarity(sentences_1, sentences_2)
	print(similarity)

我通用上面的代码来测试自训练的大模型在一些私域知识回答的准确性。 同时这些回答也让专业人员做了一轮评分 image 整个结果来看,bge-m3的向量相似度好像并不能很客观的反应真实的文本相似度,和人工打分的结果差别很大。 请问这个是什么原因呢?是还得做bge-m3做一些私域知识的预训练才适合来做文本相似度的比较吗

个人认为向量模型不太适合做这类任务,只能判断语义相似性,不能判断准确性。要想做这类任务,建议用这类标签数据微调模型。 另外,bge-m3不需要设置query_instruction_for_retrieval参数。

staoxiao avatar Apr 03 '24 16:04 staoxiao

# -*- coding: utf-8 -*-
from FlagEmbedding import FlagModel
model = FlagModel('/xxx/bge-m3', 
                  query_instruction_for_retrieval="答案比较",
                  use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation


def get_similarity(sentences_1, sentences_2):
	embeddings_1 = model.encode(sentences_1)
	embeddings_2 = model.encode(sentences_2)
	similarity = embeddings_1 @ embeddings_2.T
	return similarity.item()


if __name__=="__main__":
	sentences_1 = ["问题:问题1?答案:标准答案"]
	sentences_2 = ["问题:问题1?答案:模型回答"]
	similarity = get_similarity(sentences_1, sentences_2)
	print(similarity)

我通用上面的代码来测试自训练的大模型在一些私域知识回答的准确性。 同时这些回答也让专业人员做了一轮评分 image 整个结果来看,bge-m3的向量相似度好像并不能很客观的反应真实的文本相似度,和人工打分的结果差别很大。 请问这个是什么原因呢?是还得做bge-m3做一些私域知识的预训练才适合来做文本相似度的比较吗

个人认为向量模型不太适合做这类任务,只能判断语义相似性,不能判断准确性。要想做这类任务,建议用这类标签数据微调模型。 另外,bge-m3不需要设置query_instruction_for_retrieval参数。

可能我没表达清楚我的意思,我就是用向量模型做语义相似性比较,我有一个QA集,包括问题和标准答案,然后拿这些问题去问私域的大模型,把大模型的回答跟标准答案做语义相似性比较,看回答得是否接近。 现在的问题是通过向量模型得到的答案之间的相似度跟人工打分的差别很大,比如人工打分,打13分的,向量相似度0.9,人工打分100的,向量相似度才0.88,经过比较,我们发现人工打分的还是更准确,向量相似度完全没法真实反应语义相似度。 想问下我上面的代码是不是有使用错误,你上面说“bge-m3不需要设置query_instruction_for_retrieval参数”,那是不是

model = FlagModel('/xxx/bge-m3', 
                  query_instruction_for_retrieval="",
                  use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation

这样即可

TChengZ avatar Apr 04 '24 04:04 TChengZ

# -*- coding: utf-8 -*-
from FlagEmbedding import FlagModel
model = FlagModel('/xxx/bge-m3', 
                  query_instruction_for_retrieval="答案比较",
                  use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation


def get_similarity(sentences_1, sentences_2):
	embeddings_1 = model.encode(sentences_1)
	embeddings_2 = model.encode(sentences_2)
	similarity = embeddings_1 @ embeddings_2.T
	return similarity.item()


if __name__=="__main__":
	sentences_1 = ["问题:问题1?答案:标准答案"]
	sentences_2 = ["问题:问题1?答案:模型回答"]
	similarity = get_similarity(sentences_1, sentences_2)
	print(similarity)

我通用上面的代码来测试自训练的大模型在一些私域知识回答的准确性。 同时这些回答也让专业人员做了一轮评分 image 整个结果来看,bge-m3的向量相似度好像并不能很客观的反应真实的文本相似度,和人工打分的结果差别很大。 请问这个是什么原因呢?是还得做bge-m3做一些私域知识的预训练才适合来做文本相似度的比较吗

个人认为向量模型不太适合做这类任务,只能判断语义相似性,不能判断准确性。要想做这类任务,建议用这类标签数据微调模型。 另外,bge-m3不需要设置query_instruction_for_retrieval参数。

可能我没表达清楚我的意思,我就是用向量模型做语义相似性比较,我有一个QA集,包括问题和标准答案,然后拿这些问题去问私域的大模型,把大模型的回答跟标准答案做语义相似性比较,看回答得是否接近。 现在的问题是通过向量模型得到的答案之间的相似度跟人工打分的差别很大,比如人工打分,打13分的,向量相似度0.9,人工打分100的,向量相似度才0.88,经过比较,我们发现人工打分的还是更准确,向量相似度完全没法真实反应语义相似度。 想问下我上面的代码是不是有使用错误,你上面说“bge-m3不需要设置query_instruction_for_retrieval参数”,那是不是

model = FlagModel('/xxx/bge-m3', 
                  query_instruction_for_retrieval="",
                  use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation

这样即可

TChengZ avatar Apr 04 '24 04:04 TChengZ

# -*- coding: utf-8 -*-
from FlagEmbedding import FlagModel
model = FlagModel('/xxx/bge-m3', 
                  query_instruction_for_retrieval="答案比较",
                  use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation


def get_similarity(sentences_1, sentences_2):
	embeddings_1 = model.encode(sentences_1)
	embeddings_2 = model.encode(sentences_2)
	similarity = embeddings_1 @ embeddings_2.T
	return similarity.item()


if __name__=="__main__":
	sentences_1 = ["问题:问题1?答案:标准答案"]
	sentences_2 = ["问题:问题1?答案:模型回答"]
	similarity = get_similarity(sentences_1, sentences_2)
	print(similarity)

我通用上面的代码来测试自训练的大模型在一些私域知识回答的准确性。 同时这些回答也让专业人员做了一轮评分 image 整个结果来看,bge-m3的向量相似度好像并不能很客观的反应真实的文本相似度,和人工打分的结果差别很大。 请问这个是什么原因呢?是还得做bge-m3做一些私域知识的预训练才适合来做文本相似度的比较吗

个人认为向量模型不太适合做这类任务,只能判断语义相似性,不能判断准确性。要想做这类任务,建议用这类标签数据微调模型。 另外,bge-m3不需要设置query_instruction_for_retrieval参数。

可能我没表达清楚我的意思,我就是用向量模型做语义相似性比较,我有一个QA集,包括问题和标准答案,然后拿这些问题去问私域的大模型,把大模型的回答跟标准答案做语义相似性比较,看回答得是否接近。 现在的问题是通过向量模型得到的答案之间的相似度跟人工打分的差别很大,比如人工打分,打13分的,向量相似度0.9,人工打分100的,向量相似度才0.88,经过比较,我们发现人工打分的还是更准确,向量相似度完全没法真实反应语义相似度。 想问下我上面的代码是不是有使用错误,你上面说“bge-m3不需要设置query_instruction_for_retrieval参数”,那是不是

model = FlagModel('/xxx/bge-m3', 
                  query_instruction_for_retrieval="",
                  use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation

这样即可

想问一下大佬这个问题解决了吗?场景确实是QA集的匹配,然后一般QA之间是有差异的,计算的相似度无法反应真实的人工评估。不知道是不是使用姿势不对。

SenLeeLee avatar Aug 29 '25 01:08 SenLeeLee