RAG评估方法RAGAS的langchain实现-4

Context Relevance上下文相关性

原理:
Context Relevance 指标用于评估一个回答的句子是否受到提供的上下文支持,以及上下文是否受到回答的支持。其核心思想是:

  1. 拆分回答:将回答分解为独立的句子。
  2. 判定支持度:对于每个句子,判断它是否可以在上下文中找到支持。
  3. 计算支持度精度:通过统计支持的句子占比,衡量回答对上下文的依赖性。

目的:

  • 确保模型的回答是基于给定的上下文,而非凭空生成。
  • 评估回答对上下文的利用率,提高答案的可靠性。
  • 检测回答中的不可信或无依据的内容。
query = "美国最高法院关于堕胎的裁决对全球有什么影响?"
answer = "美国最高法院关于堕胎的裁决具有重要的全球影响。该裁决导致在堕胎访问受到限制的州,三分之一的生育年龄女性和女孩无法获得堕胎服务。那些州的母婴健康支持也较弱,母亲死亡率较高,儿童贫困率也较高。此外,裁决的影响超出了国界,由于美国在全球的地缘政治和文化影响力,这一裁决也产生了跨国影响。全球的组织和活动家担心这一裁决可能会激励其他国家出台反堕胎的立法和政策。裁决还妨碍了某些非洲国家的进步法律改革和堕胎指南的实施。此外,该裁决在国际政策领域造成了寒蝉效应,使得反堕胎的力量能够削弱人权保护。"
docs = [
	"- 2022年,美国最高法院作出裁决,推翻了50年的判例法,取消了宪法堕胎权。\n- 这一裁决产生了巨大影响:三分之一的生育年龄女性和女孩现在生活在堕胎服务几乎完全无法获得的州。\n- 这些堕胎法律最为严格的州,母婴健康支持最为薄弱,母亲死亡率较高,儿童贫困率较高。\n- 美国最高法院的裁决还通过美国在全球的地缘政治和文化影响力,超越国界产生了影响。\n- 全球的SRR组织和活动家对这一裁决可能为其他国家的反堕胎立法和政策攻击铺路表示担忧。\n- 观察者还注意到该裁决对某些非洲国家的进步法律改革产生了影响,导致堕胎指导方针的 adoption 和执行停滞不前。\n- 该裁决在国际政策领域产生了寒蝉效应,助长了反堕胎的国家和非国家行为体破坏人权保护的势头。",
	"美国最高法院的堕胎裁决不仅在国内引发了激烈的辩论和讨论,也在全球范围内引发了广泛关注。许多国家将美国视为法律和社会问题的领导者,因此这一裁决可能会影响其他国家对堕胎的政策和态度。",
	"这一裁决还可能对国际组织和非政府组织(NGO)产生影响,尤其是那些致力于生育权和妇女健康问题的团体。根据裁决的结果,可能会出现资金、倡导工作和与美国同行的合作发生变化,进而在全球范围内引发生育正义斗争的连锁反应。"
]

代码实现

实现流程:

  1. 输入: 回答 answer,以及文档 document_list
  2. 支持度判定: 使用 Sentence_Support_Verdication 模型逐句分析回答的句子是否在上下文中得到支持。
  3. 计算精度: 计算被支持的句子占比,以 answer_supported_precisioncontext_supported_precision 进行衡量。

从文本A中抽取句子,再在文本B中验证

import asyncio
import numpy as np
from typing import List
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field

'''
输出格式形如:
{
	"sentence_and_statements": 
}
'''

class Sentence_Support_Verdication(BaseModel):
	sentence: str = Field(description="回答的某个句子的原始内容。")
	sentence_supported_reasoning: str = Field(description='分析该句子是否能得到上下文中任意一句话的支持。')
	sentence_supported_verdication: int = Field(description='如果该句子能得到事实陈述中任意一句话的支持,为1,否则为0。')

class Sentence_Support_Verdication_List(BaseModel):
	verdications: List[Sentence_Support_Verdication] = Field(description="一组句子和对应的是否被上下文支持的判断")

verdication_parser = PydanticOutputParser(pydantic_object=Sentence_Support_Verdication_List)

llm = ChatOpenAI(
	base_url='http://localhost:5551/v1',
	api_key='EMPTY',
	model_name='Qwen2.5-14B-Instruct',
	temperature=0.5,
)

anwer_supported_verdict_prompt = (
	"给定一段上下文和一个回答,分析回答的每个语句,并判断该语句是否得到上下文的支持,若得到支持则判断为1,若没有得到支持则判断为0。\n"
	
<think>我们正在回答用户关于如何将RAGASLangChain集成的问题。根据引用[1],我们知道LangChain是一个用于构建由语言模型驱动的应用程序的框架,它通过组件和链的概念来连接各种功能单元。而引用[2]提供了一个示例,展示了如何在LangChain中使用RunnableRails(来自nemo-guardrails)并集成Langfuse、RAGAs等工具来构建RAG管道并进行监控和评估RAGAS是一个用于评估RAG系统的框架,它提供了多种评估指标。为了将RAGAS集成到LangChain中,我们需要在LangChainRAG流程运行后,收集必要的评估数据(如问题、上下文、回答等),然后使用RAGAS评估函数进行评估。根据引用[2],我们可以构建一个评估流程,其中可能包括使用Golden数据集来评估RAG管道。引用[3]则提供了一个示例数据集的结构,包含问题(question)、上下文(context)和真实答案(ground_truth),这正是RAGAS评估所需的数据格式。因此,集成步骤大致如下:1.在LangChain中构建RAG管道。2.运行RAG管道,收集每个问题的上下文(检索到的文档)和生成的回答。3.准备评估数据,包括问题、上下文、生成的回答和可选的真实答案(用于有监督评估)。4.使用RAGAS评估函数来评估生成的回答的质量。这里,我们将参考引用[2]中提到的使用LangChain、Langfuse、Nemo-guardrails和RAGAs构建管道的示例,但重点放在RAGAS的集成上。下面给出一个具体的示例代码:###步骤1:导入所需库```pythonfromlangchain.chainsimportRetrievalQAfromlangchain.llmsimportOpenAIfromlangchain.document_loadersimportTextLoaderfromlangchain.vectorstoresimportFAISSfromlangchain.embeddings.openaiimportOpenAIEmbeddingsfromragas.metricsimportfaithfulness,answer_relevancy,context_precision,context_recallfromragasimportevaluateimportpandasaspd```###步骤2:构建一个简单的LangChainRAG管道假设我们有一个基于文档的问答系统。```python#加载文档loader=TextLoader("path/to/document.txt")documents=loader.load()#创建向量数据库embedding=OpenAIEmbeddings()vectorstore=FAISS.from_documents(documents,embedding)#创建检索链qa_chain=RetrievalQA.from_chain_type(llm=OpenAI(),chain_type="stuff",retriever=vectorstore.as_retriever(),return_source_documents=True#返回源文档(上下文))```###步骤3:运行RAG管道并收集数据假设我们有一组测试问题。```pythonquestions=["气候变化的主要影响是什么?",#...其他问题]results=[]forquestioninquestions:result=qa_chain({"query":question})#收集问题、生成的回答和上下文results.append({"question":question,"answer":result["result"],"contexts":[doc.page_contentfordocinresult["source_documents"]]})#转换为DataFrame便于评估df=pd.DataFrame(results)```###步骤4:使用RAGAS进行评估如果还有真实答案(ground_truth),我们可以添加进去进行评估。这里假设没有真实答案,我们只评估无监督的指标。```python#定义要评估的指标metrics=[faithfulness,#衡量生成答案是否与给定上下文一致(避免幻觉)answer_relevancy,#答案与问题的相关性#注意:context_precision和context_recall需要真实答案,如果有的话]#运行评估evaluation_result=evaluate(df,metrics=metrics)#输出评估结果print(evaluation_result)```如果拥有带真实答案的Golden数据集(如引用[3]所示),我们可以这样准备数据:```python#假设有一个包含ground_truth的DataFrame#数据格式应包含:question,answer,contexts,ground_truth#注意:ground_truth应为列表,每个问题对应一个真实答案(字符串)或列表形式的多个真实答案?#根据RAGAS文档,ground_truth是每个问题的参考字符串(可以是单个字符串,也可以是字符串列表)#这里我们使用字符串列表,每个问题一个真实答案字符串#例如,从文件加载Golden数据集golden_data=pd.read_csv("golden_data.csv")#然后运行评估,注意golden_data中需要包含question,contexts,answer,ground_truth列evaluation_result_with_gt=evaluate(golden_data,metrics=[context_precision,context_recall,...])```###步骤5:生成评估报告RAGAS评估返回的结果是一个包含每个样本各指标分数的DataFrame。我们可以进一步分析这些分数,或者生成报告。```python#输出平均分print(evaluation_result.mean())#或者使用generate_report生成HTML报告fromragasimportgenerate_reportreport=generate_report(evaluation_result)report.save("ragas_report.html")```###集成要点说明-**数据收集**:在LangChain管道中,确保返回检索到的上下文(source_documents)和生成的回答。-**指标选择**:RAGAS提供了无监督指标(如faithfulness,answer_relevancy)和有监督指标(如context_precision,context_recall)。根据是否具有真实答案选择合适的指标。-**批量评估**:通常我们会有一个问题集合(测试集),然后对每个问题运行RAG管道并收集结果,最后批量评估。通过以上步骤,我们实现了在LangChainRAG管道中集成RAGAS评估。这使得我们可以定期评估RAG系统的性能,并根据评估结果进行优化。###注意事项-如果评估数据量较大,可能需要分布式处理或分批评估以避免内存问题。-RAGAS评估依赖于LLM(用于某些指标的计算),因此可能需要较长时间运行,特别是当评估集很大时。-对于生产环境,可以考虑将评估过程异步化。§§相关问题§§1.如何优化RAGAS评估过程的性能?2.RAGAS评估指标的具体含义及计算方法是什么?3.如何将RAGAS评估LangChain的调试工具(如LangSmith)结合?</think> ### RAGASLangChain集成方法及示例代码 将RAGAS集成到LangChain框架中可实现端到端的RAG系统评估。以下是具体实现方法和步骤: #### 一、集成原理 1. **数据流对接**:在LangChainRAG流程执行后,自动捕获**问题(question)、上下文(contexts)、生成响应(response)** 传递到RAGAS[^2] 2. **评估链构建**:将RAGAS评估器包装为LangChain的`Runnable`组件,形成可编排的评估链 3. **结果反馈**:评估结果返回LangChain,用于: - 实时质量监控 - 生成优化建议 - 自动调整检索/生成策略[^1] #### 二、完整集成示例 ```python from langchain.chains import RetrievalQA from langchain.vectorstores import FAISS from ragas.metrics import answer_relevancy, faithfulness from ragas import evaluate from langchain_core.runnables import RunnableLambda # 1. 定义LangChain RAG管道 rag_pipeline = RetrievalQA.from_chain_type( llm=OpenAI(), chain_type="stuff", retriever=FAISS.load_local("vector_db").as_retriever() ) # 2. 创建RAGAS评估组件 def ragas_evaluator(inputs: dict): """包装RAGAS评估LangChain Runnable""" result = evaluate( response=inputs["response"], contexts=[inputs["contexts"]], question=inputs["question"], metrics=[answer_relevancy, faithfulness] ) return result.to_dict() # 返回评估结果字典 # 3. 构建带评估的完整链 full_chain = ( # 原始RAG管道 {"response": rag_pipeline, "contexts": rag_pipeline.retriever} | { "question": lambda x: x["question"], "response": lambda x: x["response"]["result"], "contexts": lambda x: [doc.page_content for doc in x["contexts"].get_relevant_documents(x["question"])] } # 接入RAGAS评估 | RunnableLambda(ragas_evaluator) ) # 4. 执行并获取评估结果 question = "气候变化的主要影响是什么?" evaluation_result = full_chain.invoke({"question": question}) print(evaluation_result) # 输出示例: {'answer_relevancy': 0.87, 'faithfulness': 0.92} ``` #### 三、关键集成点解析 1. **上下文提取** ```python "contexts": lambda x: [doc.page_content for doc in x["contexts"].get_relevant_documents(x["question"])] ``` 从LangChain检索器提取实际使用的上下文内容[^2] 2. **响应格式化** ```python "response": lambda x: x["response"]["result"] ``` 提取LangChain生成的纯文本响应内容 3. **评估结果结构化** `result.to_dict()`将RAGAS输出转换为LangChain兼容格式,便于后续处理 #### 四、高级应用场景 1. **实时质量拦截** ```python # 在评估链后添加质量检查 if evaluation_result["faithfulness"] < 0.8: raise ValueError("低可信度响应,触发人工审核") ``` 2. **自动优化检索** 根据`context_precision`分数动态调整检索参数: ```python retriever.search_kwargs["k"] = 10 if evaluation_result["context_precision"] < 0.7 else 5 ``` 3. **Langfuse监控集成** 将评估结果推送至监控平台[^2]: ```python from langfuse import Langfuse Langfuse().trace(evaluation_result) ``` #### 五、实践建议 1. **评估触发策略**: - 生产环境:抽样评估(如10%请求) - 开发阶段:全量评估 2. **性能优化**: ```python # 启用异步评估 result = evaluate(..., raise_exceptions=False) ``` 3. **自定义指标集成**: ```python from ragas.metrics.base import Metric class CustomMetric(Metric): def score(self, row: dict) -> float: return calculate_custom_score(row["response"]) metrics.append(CustomMetric()) ``` > **提示**:完整示例需安装依赖`pip install langchain ragas openai`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值