ragas官方文档中文版(十七)

事实正确性

事实正确性

FactualCorrectness 是一个比较和评估生成响应与参考事实准确性的指标。此指标用于确定生成响应与参考对齐的程度。事实正确性分数范围从 0 到 1,分数越高表示性能越好。

为了衡量响应与参考之间的对齐程度,该指标使用 LLM 首先将响应和参考分解为声明,然后使用自然语言推理来确定响应和参考之间的事实重叠。事实重叠使用精确率、召回率和 F1 分数进行量化,可以通过 mode 参数进行控制。

示例

python 复制代码
from openai import AsyncOpenAI
from ragas.llms import llm_factory
from ragas.metrics.collections import FactualCorrectness

# Setup LLM
client = AsyncOpenAI()
llm = llm_factory("gpt-4o-mini", client=client)

# Create metric
scorer = FactualCorrectness(llm=llm)

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

输出:

text 复制代码
Factual Correctness Score: 0.67

默认情况下, mode 设置为 f1 。您可以通过设置 mode 参数将模式更改为 precision 或 recall :

python 复制代码
# Precision mode - measures what fraction of response claims are supported by reference
scorer = FactualCorrectness(llm=llm, mode="precision")
result = await scorer.ascore(
    response="The Eiffel Tower is located in Paris.",
    reference="The Eiffel Tower is located in Paris. It has a height of 1000ft."
)
print(f"Precision Score: {result.value}")

输出:

text 复制代码
Precision Score: 1.0

您还可以使用 atomicity 和 coverage 参数配置声明分解的粒度:

python 复制代码
# High granularity - more detailed claim decomposition
scorer = FactualCorrectness(
    llm=llm,
    mode="f1",
    atomicity="high",  # More atomic claims
    coverage="high"    # Comprehensive coverage
)

同步用法

如果你更喜欢同步代码,可以使用 .score() 方法代替 .ascore() :

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

计算方式

计算真阳性(TP)、假阳性(FP)和假阴性(FN)的公式如下:

计算精确率、召回率和 F1 分数的公式如下:

控制声明数量

响应和参考中的每个句子都可以分解为一个或多个声明。从单个句子生成的声明数量由应用程序所需的原子性和覆盖级别决定。

示例
python 复制代码
scorer = FactualCorrectness(mode="precision",atomicity="low")

输出:

复制代码
1.0
理解原子性和覆盖

在声明分解中,两个重要参数影响输出:

  1. 原子性
  2. 覆盖

这些参数有助于控制生成声明的粒度和完整性。

原子性

原子性指句子被分解为其最小、有意义组件的程度。可以根据是否需要高度详细的声明或更整合的视图进行调整。

  • 高原子性 :句子被分解为其基本、不可分割的声明。这会产生多个较小的声明,每个代表一条独特的信息。

示例

  • 原始句子 :"阿尔伯特·爱因斯坦是一位德国理论物理学家,他发展了相对论并对量子力学做出了贡献。"
  • 分解的声明 :
    • "阿尔伯特·爱因斯坦是一位德国理论物理学家。"
    • "阿尔伯特·爱因斯坦发展了相对论。"
    • "阿尔伯特·爱因斯坦对量子力学做出了贡献。"
      • 低原子性 :句子保持更完整,产生较少的声明,可能包含多条信息。

示例

  • 原始句子 :"阿尔伯特·爱因斯坦是一位德国理论物理学家,他发展了相对论并对量子力学做出了贡献。"
  • 分解的声明 :
    • "阿尔伯特·爱因斯坦是一位德国理论物理学家,他发展了相对论并对量子力学做出了贡献。"
覆盖

覆盖指声明代表原始句子中信息的全面程度。可以调整为包含所有细节或概括内容。

  • 高覆盖 :分解的声明捕获原始句子中存在的所有信息,保留每个细节。

示例

  • 原始句子 :"玛丽·居里是一位波兰裔和归化法国的物理学家和化学家,她进行了关于放射性的开创性研究。"
  • 分解的声明 :
    • "玛丽·居里是一位波兰裔物理学家。"
    • "玛丽·居里是一位归化法国的物理学家。"
    • "玛丽·居里是一位化学家。"
    • "玛丽·居里进行了关于放射性的开创性研究。"
      • 低覆盖 :分解的声明仅覆盖主要要点,省略一些细节以提供更概括的视图。

示例

  • 原始句子 :"玛丽·居里是一位波兰裔和归化法国的物理学家和化学家,她进行了关于放射性的开创性研究。"
  • 分解的声明 :
    • "玛丽·居里是一位物理学家。"
    • "玛丽·居里进行了关于放射性的研究。"
组合原子性和覆盖

通过调整原子性和覆盖,您可以自定义细节级别和完整性以满足特定用例的需求。

高原子性 & 高覆盖 :产生高度详细和全面的声明,覆盖原始句子的所有方面。

示例

  • 原始句子 :"查尔斯·巴贝奇是一位英国数学家、哲学家、发明家和机械工程师。"
  • 分解的声明 :
    • "查尔斯·巴贝奇是一位英国数学家。"
    • "查尔斯·巴贝奇是一位哲学家。"
    • "查尔斯·巴贝奇是一位发明家。"
    • "查尔斯·巴贝奇是一位机械工程师。"
      • 低原子性 & 低覆盖 :产生较少的声明且细节较少,总结主要思想而不深入具体细节。

示例

  • 原始句子 :"查尔斯·巴贝奇是一位英国数学家、哲学家、发明家和机械工程师。"
  • 分解的声明 :
    • "查尔斯·巴贝奇是一位英国数学家。"
    • "查尔斯·巴贝奇是一位发明家。"
实际应用
  • 当您需要详细和全面的分解以进行深入分析或信息提取时,使用 高原子性和高覆盖 。
  • 当仅需要关键信息时,使用 低原子性和低覆盖 ,例如用于摘要。

这种控制声明数量的灵活性有助于确保信息以适合您应用程序需求的粒度级别呈现。

旧版指标 API

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

弃用时间表

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

使用 SingleTurnSample 的示例
python 复制代码
from ragas.dataset_schema import SingleTurnSample
from ragas.metrics._factual_correctness import FactualCorrectness


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

scorer = FactualCorrectness(llm = evaluator_llm)
await scorer.single_turn_ascore(sample)

输出:

text 复制代码
0.67
更改模式

默认情况下,模式设置为 F1 ,您可以通过设置 mode 参数将模式更改为 precision 或 recall 。

python 复制代码
scorer = FactualCorrectness(llm = evaluator_llm, mode="precision")

输出:

text 复制代码
1.0
控制原子性
python 复制代码
scorer = FactualCorrectness(mode="precision", atomicity="low")

输出:

text 复制代码
1.0
相关推荐
tkevinjd12 小时前
MiniCode 项目详解6:原项目控制系统的10个缺陷(已修复)
python·llm·agent
雨辰AI13 小时前
全集实战:企业级大模型服务化部署全栈指南|FastAPI 封装 + Nginx 负载均衡 + 高可用架构 从单机到生产一步到位
人工智能·ai·负载均衡·fastapi·ai编程
dNGUZ7UGj14 小时前
10分钟完成第一个Python小游戏
python·django
没有梦想的咸鱼185-1037-166314 小时前
AI-Python机器学习与深度学习技术:CNN/Transformer/扩散模型、SHAP可解释及Hermes智能体自动化
人工智能·python·深度学习·机器学习·chatgpt·cnn·transformer
霸道流氓气质14 小时前
SpringBoot中通用工具类库(Utils)封装与使用实践
spring boot·后端·python
Draina16 小时前
CBC填充预言攻击-CBC Padding Oracle Crypto Attack
python·安全·web安全·网络安全·密码学·安全性测试
Angel Q.16 小时前
特征提取 | DINO 到 DINOv3
图像处理·python
不如语冰17 小时前
AI大模型入门-pytorch-张量2 tensor创建
python
oil欧哟17 小时前
我做了一个 Vibe Coding 术语学习站:VibeHub
前端·ai·agent·独立开发·vibe coding
NPE~17 小时前
[AI]Agent开发——ADK框架使用
人工智能·python·ai·教程·adk·agent开发