llamaIndex BatchEvalRunner(一)

BatchEvalRunner 是在主流RAG评估框架 LlamaIndex 中,用于高效批量运行多项评估任务 的核心工具。它的核心职责就是系统化地测试你的 RAG 系统。

🚀 为什么需要它?

  • 自动化与批量化 :自动化评估整个测试集,一次性回答成百上千个问题,避免低效的手动点测
  • 并行化加速 :利用异步机制,如设置 workers=8 启用8个并发任务,能极大缩短整体评估时间
  • 指标集成 :可一站式配置并运行所有评估(如答案忠实度、相关性),输出结构化数据进行统一汇总

⚙️ 如何使用它?

1. 准备评估器 (Evaluators)

首先,选择一个LLM作为"评委"(如GPT-4),用它来实例化具体的评估器(如 FaithfulnessEvaluator

python

ini 复制代码
from llama_index.llms.openai import OpenAI
from llama_index.core.evaluation import FaithfulnessEvaluator, RelevancyEvaluator

# 初始化评委模型,temperature=0确保评估结果一致性
gpt4 = OpenAI(temperature=0, model="gpt-4")
# 实例化忠实度评估器
faithfulness_evaluator = FaithfulnessEvaluator(llm=gpt4)
# 实例化相关性评估器
relevancy_evaluator = RelevancyEvaluator(llm=gpt4)

2. 创建并运行 Runner

将评估器以字典形式传入BatchEvalRunner,并调用其 aevaluate_queries 方法(注意:这是一个异步方法)

python

python 复制代码
import asyncio
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.evaluation import FaithfulnessEvaluator, RelevancyEvaluator, BatchEvalRunner

from 加载模型 import get_llm


async def main():
    # 1. 初始化模型设置 (全局配置)
    llm, embed_model = get_llm()

    # 2. 准备索引
    print("正在构建索引...")
    documents = SimpleDirectoryReader(input_files=[r".\data\小说.txt"]).load_data()
    index = VectorStoreIndex.from_documents(documents)
    query_engine = index.as_query_engine()

    # 3. 初始化评估器
    # 建议:评估模型可以选比生成模型更强的(如 GPT-4),结果更客观
    """
        忠实度:答案是否忠于检索上下文(有没有凭空捏造)。
        答案相关性:答案是否针对用户所问的问题(有没有答非所问)。
    """
    faith_evaluator = FaithfulnessEvaluator(llm=llm)  # 忠实度评估器
    rel_evaluator = RelevancyEvaluator(llm=llm)  # 答案相关性评估器

    # 4. 批量查询与评估 (核心优化点)
    queries = [
        "萧炎的爸爸是谁?",  # 基础题(预期:1.0)
        "萧炎最喜欢的现代流行歌手是谁?",  # 跨时空无关(预期:Faithfulness 应该为 1.0,但回答应为"不知道")
        "萧炎在第一章里一共喝了几杯咖啡?",  # 逻辑陷阱(玄幻小说没咖啡,看它是否产生幻觉)
        "作者天蚕土豆的家庭住址在哪里?",  # 外部元数据(文档里没写作者隐私,看它是否拒绝)
        "萧炎用什么牌子的智能手机和药老联系?"  # 严重干扰项
    ]

    print(f"\n开始批量执行 {len(queries)} 组评估...")

    # 使用 BatchEvalRunner 进行并行异步评估
    # 相比于 for 循环逐个评估,BatchEvalRunner 能显著提高 Token 利用率和执行速度
    runner = BatchEvalRunner(
        {
            "faithfulness": faith_evaluator,
            "relevancy": rel_evaluator,
        },
        show_progress=True,
        workers=4  # 根据 API 限制调整并发数
    )

    # aevaluate_queries 会自动执行:查询 -> 获取 Response -> 调用各评估器
    eval_results = await runner.aevaluate_queries(
        query_engine,
        queries=queries
    )

    # 5. 格式化结果输出
    print("\n" + "=" * 50)
    print("评估报告汇总")
    print("=" * 50)

    for query in queries:
        print(f"查询问题: {query}")

        print("RAG最终的回复:", query_engine.query(query).response)

        # 提取各个维度的结果
        f_res = eval_results["faithfulness"][queries.index(query)]
        r_res = eval_results["relevancy"][queries.index(query)]

        # 打印详细打分
        print(f"  [忠实度 Faithfulness]: {'通过' if f_res.passing else '❌ 失败'} (得分: {f_res.score:.2f})")
        if not f_res.passing:
            print(f"    └─ 反馈: {f_res.feedback}")

        print(f"  [相关性 Relevancy   ]: {'通过' if r_res.passing else '❌ 失败'} (得分: {r_res.score:.2f})")
        if not r_res.passing:
            print(f"    └─ 反馈: {r_res.feedback}")

    print("\n" + "=" * 50)


if __name__ == "__main__":
    asyncio.run(main())

注意 :因为 aevaluate_queries 是异步方法,如果不在Jupyter Notebook环境下运行,你需要把它包裹在一个异步函数中,并用 asyncio.run() 来执行。

⚡ 关键特性:异步与并发

BatchEvalRunner 核心优势在于其异步(Async)并发架构

  • 高并发 :通过workers参数控制并发数,最大化利用你的API额度,显著缩短评估时间。
  • 常见问题与解决 :如果你在同步环境(如常规Python脚本)中使用 await runner.aevaluate_queries(),会遇到 SyntaxError: 'await' outside function 错误。解决方案是创建一个异步协程来调用它。

🆚 BatchEvalRunner vs. 其他框架

  • Langfuse : 使用 BatchEvaluationRunner 对Langfuse平台中已有的生产日志(Traces/Observations)进行事后批量分析
  • Ragas : 没有直接的Runner,核心入口是 evaluate()aevaluate() 函数,能够批量运行 EvaluationDataset

💡 典型应用场景

  • 回归测试 :将评估流程(CI/CD),每次代码变更后自动运行,通过指标变化检测性能下降(即"回归")
  • 迭代优化 :对测试集运行BatchEvalRunner生成详细评估报告,通过分析具体的低分案例来定位问题环节,进行针对性优化。

💎 总结

BatchEvalRunner是RAG应用从"能跑"迈向"好用"的关键一步,它帮助你建立量化的评估体系,是确保应用可靠迭代的重要一环。

希望这些介绍能帮你更好地理解它。如果想了解更具体的配置,比如如何集成你自己的数据集,可以随时再问我。

相关推荐
fl1768311 小时前
智慧医疗腹腔断层CT脏器识别分割数据集labelme格式1030张4类别
人工智能
数智工坊1 小时前
周志华《Machine Learning》学习笔记--第七章--贝叶斯分类器
人工智能·笔记·神经网络·学习·机器学习
MartinYeung51 小时前
[论文学习]使用全同态加密实现实用隐私保护机器学习训练
人工智能·学习
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月4日
人工智能·python·ai·信息可视化·自然语言处理·ai编程·灵砚智能
侃谈科技圈1 小时前
2026免费AI自动抠图工具汇总:全平台+电脑在线全方案,无水印零套路
人工智能
apcipot_rain1 小时前
计科八股20260604——AI安全、K-means、SVM、nano
人工智能·神经网络·安全·支持向量机·kmeans
Rain5091 小时前
实战:搭建 AI Code Review 自动化流水线
前端·人工智能·git·ci/cd·自动化·ai编程·代码复审
Promise微笑1 小时前
洞察无形:红外热像仪应用场景与高性价比之选
人工智能·物联网·算法
lulu12165440781 小时前
2026年-企业级大模型API网关实战指南: 微元算力聚合平台性能优化实测
java·人工智能·spring·性能优化·ai编程