跳转到内容

语义相似度

语义相似度

语义相似度指标评估生成答案与参考(真实)答案之间的语义相似性。其取值范围为0到1,分数越高表示生成答案与真实答案之间的一致性越好。

该指标使用嵌入和余弦相似度来衡量两个答案在语义上的相似程度,这可以为评估生成答案的质量提供有价值的见解。

示例

from openai import AsyncOpenAI
from ragas.embeddings import OpenAIEmbeddings
from ragas.metrics.collections import SemanticSimilarity

# Setup embeddings
client = AsyncOpenAI()
embeddings = OpenAIEmbeddings(model="text-embedding-3-small", client=client)

# Create metric
scorer = SemanticSimilarity(embeddings=embeddings)

# Evaluate
result = await scorer.ascore(
    reference="The Eiffel Tower is located in Paris. It has a height of 1000ft.",
    response="The Eiffel Tower is located in Paris."
)
print(f"Semantic Similarity Score: {result.value}")

输出

Semantic Similarity Score: 0.8151

同步用法

如果你偏好同步代码,可以使用 .score() 方法来代替 .ascore()

result = scorer.score(
    reference="The Eiffel Tower is located in Paris. It has a height of 1000ft.",
    response="The Eiffel Tower is located in Paris."
)

计算方法

示例

参考答案:阿尔伯特·爱因斯坦的相对论彻底改变了我们对宇宙的理解。

高相似度答案:爱因斯坦开创性的相对论改变了我们对宇宙的认知。

低相似度答案:艾萨克·牛顿的运动定律极大地影响了经典物理学。

让我们来看看高相似度答案的语义相似度是如何计算的

  • 第一步: 使用指定的嵌入模型将参考答案向量化。
  • 第二步: 使用相同的嵌入模型将生成的答案向量化。
  • 第三步: 计算两个向量之间的余弦相似度。
  • 第四步: 余弦相似度值(0-1)即为最终得分。

旧版指标 API

以下示例使用旧版指标 API 模式。对于新项目,我们建议使用上面显示的基于集合的 API。

弃用时间表

此 API 将在 0.4 版本中被弃用,并在 1.0 版本中被移除。请迁移到上面显示的基于集合的 API。

使用 SingleTurnSample 的示例

from ragas.dataset_schema import SingleTurnSample
from ragas.metrics import SemanticSimilarity
from ragas.embeddings import LangchainEmbeddingsWrapper

sample = SingleTurnSample(
    response="The Eiffel Tower is located in Paris.",
    reference="The Eiffel Tower is located in Paris. It has a height of 1000ft."
)

scorer = SemanticSimilarity(embeddings=LangchainEmbeddingsWrapper(evaluator_embedding))
await scorer.single_turn_ascore(sample)

输出

0.8151371879226978