案例目标
本案例演示如何使用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-fileimport 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个最相似节点的参数,导致检索结果中包含了一些不太相关的内容。
案例实现思路
检索器评估的实现思路如下:
- 数据准备:加载Paul Graham的文章,使用SentenceSplitter将其分割为节点
- 索引构建:使用VectorStoreIndex构建向量索引,并创建检索器
- 评估数据集生成:使用generate_question_context_pairs函数自动生成问题-上下文对
- 检索器评估:使用RetrieverEvaluator对检索器进行评估,计算多种指标
- 结果分析:分析评估结果,了解检索器的优势和不足
技术要点
实现过程中的关键技术点包括:使用generate_question_context_pairs自动生成评估数据集、使用RetrieverEvaluator进行多指标评估、以及使用pandas进行结果可视化。这些技术点共同构成了一个完整的检索器评估流程。
扩展建议
基于当前实现,可以考虑以下扩展方向:
- 比较不同检索器:评估不同检索器(如BM25、混合检索等)的性能差异
- 调整检索参数:研究similarity_top_k参数对检索性能的影响
- 添加重排序:引入重排序器(如Cohere Rerank)提高检索精度
- 扩展评估指标:引入更多评估指标,如MAP、F1等
- 领域特定评估:针对特定领域(如医疗、法律)定制评估数据集
- 人工评估对比:引入人工评估作为黄金标准,与自动评估进行对比
- 评估效率优化:优化评估过程,提高大规模评估的效率
- 多语言支持:扩展对多语言内容的检索评估能力
总结
检索器评估案例展示了如何使用LlamaIndex的RetrieverEvaluator评估检索器的质量。主要收获包括:
- RetrieverEvaluator提供了全面的检索器评估指标
- generate_question_context_pairs可以自动生成高质量的评估数据集
- 多指标评估有助于全面了解检索器的性能
- 检索器参数(如similarity_top_k)对性能有显著影响
- 评估结果可以指导检索器的优化和改进
该案例为评估检索器提供了有价值的参考,特别是在需要评估不同检索策略或参数设置的场景中。通过多指标评估,可以更全面地了解检索器的性能,从而做出更明智的选择和优化。