【observability】【evaluation24】检索器评估案例分析
2026/7/13 16:20:05 网站建设 项目流程

案例目标

本案例演示如何使用LlamaIndex的RetrieverEvaluator来评估任何检索器模块的质量。案例涵盖了多种评估指标,包括命中率(hit-rate)、平均倒数排名(MRR)、精确率(Precision)、召回率(Recall)、平均精度(AP)和归一化折扣累积增益(NDCG)。

案例的主要目标包括:

  • 构建一个基于Paul Graham文章的向量索引
  • 使用LLM自动生成问题-上下文对作为评估数据集
  • 使用RetrieverEvaluator评估检索器的性能
  • 分析不同评估指标的结果
  • 提供检索器评估的最佳实践

技术栈与核心依赖

llama-indexllama-index-llms-openaillama-index-readers-filepandasnest-asyncio

核心组件
  • VectorStoreIndex: 向量存储索引,用于构建检索器
  • RetrieverEvaluator: 检索器评估器,支持多种评估指标
  • generate_question_context_pairs: 自动生成问题-上下文对的工具
  • EmbeddingQAFinetuneDataset: 嵌入问答微调数据集
  • SentenceSplitter: 句子分割器,用于将文档分割为节点

环境配置

# 安装必要的依赖 %pip install llama-index-llms-openai %pip install llama-index-readers-file
import nest_asyncio nest_asyncio.apply() from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.core.node_parser import SentenceSplitter from llama_index.llms.openai import OpenAI

需要配置OpenAI的API密钥以访问GPT-4服务,用于生成问题-上下文对。

案例实现

  • 数据准备与索引构建
  • 评估数据集生成
  • 检索器评估
数据准备

本案例使用Paul Graham的文章作为数据源:

# 创建数据目录并下载Paul Graham的文章 !mkdir -p 'data/paul_graham/' !wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
加载文档并创建节点
# 加载文档 documents = SimpleDirectoryReader("./data/paul_graham/").load_data() # 使用SentenceSplitter将文档分割为节点 node_parser = SentenceSplitter(chunk_size=512) nodes = node_parser.get_nodes_from_documents(documents) # 手动设置节点ID以确保每次运行ID一致 for idx, node in enumerate(nodes): node.id_ = f"node_{idx}"
构建向量索引和检索器
# 初始化LLM llm = OpenAI(model="gpt-4") # 构建向量索引 vector_index = VectorStoreIndex(nodes) # 创建检索器,设置返回前2个最相似的节点 retriever = vector_index.as_retriever(similarity_top_k=2)
测试检索器
# 测试检索器 retrieved_nodes = retriever.retrieve("What did the author do growing up?") # 显示检索结果 from llama_index.core.response.notebook_utils import display_source_node for node in retrieved_nodes: display_source_node(node, source_length=1000)

案例效果

通过检索器评估,我们获得了以下关键发现:

评估指标解释
  • 命中率(hit_rate): 0.770492 - 在77.05%的查询中,至少有一个相关文档被检索到
  • 平均倒数排名(MRR): 0.655738 - 相关文档在检索结果中的平均排名质量
  • 精确率(Precision): 0.385246 - 检索到的文档中相关文档的比例
  • 召回率(Recall): 0.770492 - 相关文档中被检索到的比例
  • 平均精度(AP): 0.655738 - 考虑排名的精确率
  • 归一化折扣累积增益(NDCG): 0.420488 - 考虑排名和相关性得分的综合指标
观察与结论

评估结果表明,该检索器在命中率、召回率和MRR方面表现较好(约77%),但在精确率和NDCG方面表现一般。这表明检索器能够检索到大部分相关文档,但同时也检索到一些不相关的文档。这可能是因为设置了返回前2个最相似节点的参数,导致检索结果中包含了一些不太相关的内容。

案例实现思路

检索器评估的实现思路如下:

  1. 数据准备:加载Paul Graham的文章,使用SentenceSplitter将其分割为节点
  2. 索引构建:使用VectorStoreIndex构建向量索引,并创建检索器
  3. 评估数据集生成:使用generate_question_context_pairs函数自动生成问题-上下文对
  4. 检索器评估:使用RetrieverEvaluator对检索器进行评估,计算多种指标
  5. 结果分析:分析评估结果,了解检索器的优势和不足
技术要点

实现过程中的关键技术点包括:使用generate_question_context_pairs自动生成评估数据集、使用RetrieverEvaluator进行多指标评估、以及使用pandas进行结果可视化。这些技术点共同构成了一个完整的检索器评估流程。

扩展建议

基于当前实现,可以考虑以下扩展方向:

  • 比较不同检索器:评估不同检索器(如BM25、混合检索等)的性能差异
  • 调整检索参数:研究similarity_top_k参数对检索性能的影响
  • 添加重排序:引入重排序器(如Cohere Rerank)提高检索精度
  • 扩展评估指标:引入更多评估指标,如MAP、F1等
  • 领域特定评估:针对特定领域(如医疗、法律)定制评估数据集
  • 人工评估对比:引入人工评估作为黄金标准,与自动评估进行对比
  • 评估效率优化:优化评估过程,提高大规模评估的效率
  • 多语言支持:扩展对多语言内容的检索评估能力

总结

检索器评估案例展示了如何使用LlamaIndex的RetrieverEvaluator评估检索器的质量。主要收获包括:

  • RetrieverEvaluator提供了全面的检索器评估指标
  • generate_question_context_pairs可以自动生成高质量的评估数据集
  • 多指标评估有助于全面了解检索器的性能
  • 检索器参数(如similarity_top_k)对性能有显著影响
  • 评估结果可以指导检索器的优化和改进

该案例为评估检索器提供了有价值的参考,特别是在需要评估不同检索策略或参数设置的场景中。通过多指标评估,可以更全面地了解检索器的性能,从而做出更明智的选择和优化。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询