
一、Ragas评估指标List of available metrics - Ragas分类指标名称指标含义适用问题场景解决思路问题指向检索质量ContextPrecision(上下文精确度)关注的是检索结果的排序质量好结果是不是在前面。1.检索器返回大量无关文档2.向量数据库索引策略有误、相关文档排名低等。1. 优化检索策略采用混合检索2. 重排序提升Top结果的精确度。3. 调整索引粒度优化文档切分策略检索器ContextRecall(上下文召回率)检索到的上下文是否全面覆盖了参考答案所需的所有关键信息1.关键文档未能被检索到如未在Top-K中2.检索范围过窄、文档切分策略不当导致信息碎片化。1. 扩大检索范围适当增加Top-K检索数量2. 查询改写使用LLM对用户问题进行同义词扩展3.问题分解拆分为多个子问题进行检索。4. 改进索引优化文档的元数据和索引结构确保关键信息能被有效定位。检索器ContextRelevance (上下文相关性)关注的是检索结果的内容质量每个结果本身是不是精简相关。1.返回的上下文包含大量与问题无关的文本导致信息冗余干扰生成模型。1. 动态上下文压缩在检索后使用LLM或提取模型对冗长文档进行总结或关键信息提取仅保留核心内容。2. 元数据过滤在检索时利用文档的标签、章节标题等元数据进行预过滤。检索器ContextUtilization(上下文利用率)评估生成的答案在多大程度上利用了所提供的上下文信息。生成模型“忽视”了提供的上下文仅依赖自身知识生成通用回答。1. 强化提示词指令在系统提示中明确指令如“请严格仅依据以下提供的上下文来回答问题如果找不到答案请说‘不知道’”。2. 调整上下文格式使用分隔符清晰标记上下文边界或采用Few-shot示例引导模型行为。生成器生成质量Faithfulness Groundedness(忠实度)评估生成的答案是否严格基于给定的上下文检测和避免大模型“幻觉”的关键指标。1.生成模型未严格遵循上下文2.上下文过长导致信息稀释、模型本身存在幻觉倾向。1. 更换其它模型2. 优化提示与模型使用更倾向于遵循上下文的模型如经过相关微调的模型并在提示中强调“禁止引入外部知识”。生成器AnswerRelevancy (答案相关性)衡量生成的答案与原始问题的直接相关程度。生成模型理解了问题但答案偏离主题、答案中包含大量问题未询问的额外信息。1. 指令微调与提示在提示词末尾重申核心问题。生成器AnswerCorrectness(答案正确性)系统给出的最终答案与标准答案相比在事实上和完整性上有多接近。1.答案在事实、数据、细节上与标准答案有出入。2.检索或生成环节错误的最终体现。1. 迭代优化链路需通过提升前述所有环节检索精度、召回、忠实度来综合改善。整体系统答案对比AnswerSimilarity(答案相似度)衡量生成的答案与参考答案之间的语义相似性。答案在表述方式上与标准答案不同但语义相近需进行更灵活的评估。1. 改进参考答案确保参考答案本身具有足够的代表性和多样性能覆盖合理的表述变体。整体系统专项与实验性指标FactualCorrectness (事实正确性)专门用于评估答案在事实层面的准确性可能涉及外部知识验证。需要对答案中声称的事实进行独立验证而不仅检查是否源自上下文。1. 外部知识库验证构建一个关键事实核查流程将答案中的实体、数据与可信外部知识库进行比对。2. 多模型交叉验证使用多个LLM或专门的事实核查模型对同一答案进行评估综合判断生成器AspectCritic(方面评判)基于特定方面或标准对答案进行更细粒度的评判。需要根据业务场景对答案质量进行多维度的定制化评估1. 定制化提示词为每个评估方面设计专门的评判指令和Few-shot示例例如“请从‘专业性’角度评分”。2. 集成业务规则将公司内部的质量标准或合规要求转化为具体的、可被LLM理解的评判规则。生成器ToolCallAccuracy/F1(工具调用)评估智能体正确调用工具的能力。智能体错误调用工具、参数格式错误、或在该调用工具时未调用。1. 工具描述优化为每个工具编写清晰、结构化、包含丰富示例的描述文档智能体Multi-modalMetrics (多模态指标)评估包含图像等多模态内容的RAG系统。系统处理图文混合信息时生成的文本描述与图片内容不符1. 改进跨模态对齐使用更强的多模态嵌入模型进行检索确保图文语义对齐。2. 专用生成模型采用专门为图文理解优化的生成模型如GPT-4V, LLaVA等并在提示中明确要求关联图文信息。多模态系统二、评估代码实现# 一、文档处理操作 # 二、构建ragas评估数据格式 # 三、ragas评估代码import asyncio import pandas as pd from langchain_community.document_loaders import TextLoader from langchain_openai import ChatOpenAI from openai import OpenAI # 一、文档处理操作 # 转为document对象 loader TextLoader(./text.txt, encodingutf-8) document loader.load() print(document) # 分割 from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter(chunk_size100, chunk_overlap50) documents text_splitter.split_documents(document) print(documents) # 向量存储 import os from langchain_community.embeddings import DashScopeEmbeddings from langchain_core.vectorstores import InMemoryVectorStore # 1. 初始化通义千问的 embedding 模型 llm_embeddings DashScopeEmbeddings( modeltext-embedding-v4, # 也可以 text-embedding-v1/v2/v3 dashscope_api_keyos.getenv(ali_api_key) ) # 2. 创建向量存储 vector_store InMemoryVectorStore(llm_embeddings) # 3. 灌文档你的 langchain_documents 列表 # _ vector_store.from_documents(documents,llm_embeddings) # vector_store InMemoryVectorStore(llm_embeddings) vector_store.add_documents(documents) # 检索器检索 retriever vector_store.as_retriever(search_kwargs{k: 2}) from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser api_key os.getenv(ali_api_key) model qwen-plus base_url https://dashscope.aliyuncs.com/compatible-mode/v1 # langchain调用访问大模型 llm_model ChatOpenAI(api_keyapi_key, base_urlbase_url, modelmodel) template Answer the question based only on the following context: {context} Question: {query} prompt ChatPromptTemplate.from_template(template) qa_chain prompt | llm_model | StrOutputParser() res qa_chain.invoke({context: retriever.invoke(Who is the CEO of OpenAI?), query: Who is the CEO of OpenAI?}) print(res) # 二、构建ragas评估数据格式 #---------- # 问题 # 检索器内容 # 模型答案 # 实际内容 # ------------ sample_queries [ Which CEO is widely recognized for democratizing AI education through platforms like Coursera?, Who is Sam Altman?, Who is Demis Hassabis and how did he gained prominence?, ] expected_responses [ Andrew Ng is the CEO of Landing AI and is widely recognized for democratizing AI education through platforms like Coursera., Sam Altman is the CEO of OpenAI and has played a key role in advancing AI research and development. He strongly advocates for creating safe and beneficial AI technologies., Demis Hassabis is the CEO of DeepMind and is celebrated for his innovative approach to artificial intelligence. He gained prominence for developing systems like AlphaGo that can master complex games., ] from ragas import EvaluationDataset dataset [] for query, reference in zip(sample_queries, expected_responses): relevant_docs retriever.invoke(query) response qa_chain.invoke({context: retriever.invoke(query), query: query}) # 键必须是这四个字段 dataset.append( { user_input: query, retrieved_contexts: [rdoc.page_content for rdoc in relevant_docs], response: response, reference: reference, } ) print(dataset) # 列表里面是字典 # [ # {user_input: Which CEO is widely recognized for democratizing AI education through platforms like Coursera?, # retrieved_contexts: [He is also widely recognized for democratizing AI education through platforms like Coursera.,], # response: The CEO of OpenAI is Sam Altman., # reference: Andrew Ng is the CEO of Landing AI and is widely recognized for democratizing AI education through platforms like Coursera.}, # ] # 字典列表,封装成 Ragas 专用的 EvaluationDataset对象 evaluation_dataset EvaluationDataset.from_list(dataset) print(evaluation_dataset) # 三、ragas评估过程 # ragas0.2.0版本 from ragas import evaluate from ragas.metrics import AnswerCorrectness,AnswerRelevancy # 转为ragas可使用的模型实例 from ragas.llms import LangchainLLMWrapper from ragas.embeddings import LangchainEmbeddingsWrapper # 转换为ragas可识别的模型 embeddings LangchainEmbeddingsWrapper(llm_embeddings) evaluator_llm LangchainLLMWrapper(llm_model) # 评估 result evaluate( datasetevaluation_dataset, metrics[ AnswerRelevancy(llmevaluator_llm,embeddingsembeddings), AnswerCorrectness(llmevaluator_llm,embeddingsembeddings,weights[0.5,0.5]) ], llmevaluator_llm, ) df result.to_pandas() print(df) print(result) # 输出模板 import pandas as pd from openpyxl import Workbook # # 1. 显示所有列不省略中间的列 pd.set_option(display.max_columns, None) # # 2. 显示每一列的完整内容不省略长文字比如 user_input pd.set_option(display.max_colwidth, None) # # 3. 设置显示宽度为 None防止终端换行导致看错乱可选 pd.set_option(display.width, None)