Rag操作-Ragas评估

一、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", encoding="utf-8")
document  = loader.load()
print(document)

# 分割
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=50)
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(
    model="text-embedding-v4",          # 也可以 text-embedding-v1/v2/v3
    dashscope_api_key=os.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_key=api_key, base_url=base_url, model=model)

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评估过程
# ragas=0.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(
    dataset=evaluation_dataset,
    metrics=[
        AnswerRelevancy(llm=evaluator_llm,embeddings=embeddings),
        AnswerCorrectness(llm=evaluator_llm,embeddings=embeddings,weights=[0.5,0.5])
    ],
    llm=evaluator_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)
相关推荐
阿里巴巴P8资深技术专家2 小时前
Spring Boot 实现文档智能解析与向量化:支持 Tika、MinerU、OCR 与 SSE 实时进度反馈
ai·ocr·ai大模型·rag·文档解析·mineru·tike
学历真的很重要18 小时前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
工藤学编程19 小时前
零基础学AI大模型之LangChain智能体执行引擎AgentExecutor
人工智能·langchain
AI架构师易筋1 天前
AIOps 告警归因中的提示工程:从能用到可上生产(4 阶梯)
开发语言·人工智能·llm·aiops·rag
Smoothzjc1 天前
别再只把AI当聊天机器人了!揭秘大模型进化的终极形态,看完颠覆你的认知!
后端·langchain·ai编程
SCBAiotAigc1 天前
langchain1.x学习笔记(三):langchain之init_chat_model的新用法
人工智能·python·langchain·langgraph·deepagents
深色風信子1 天前
SpringAI Rag 文件读取
rag·springai·springai rag
工藤学编程1 天前
零基础学AI大模型之LangChain智能体之initialize_agent开发实战
人工智能·langchain
ohyeah2 天前
打造 AI 驱动的 Git 提交规范助手:基于 React + Express + Ollama+langchain 的全栈实践
langchain·全栈·ollama