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

Useful Context Precision

在RAG系统评估场景下,“计算RAG返回有效文档的平均top-k命中率” 旨在衡量系统检索相关信息的能力,在只有一次查询的情况下,具体解释如下:

  1. 背后直觉:在实际运用RAG系统进行单次查询时,用户希望能高效获取有效文档。如果系统能在返回结果的前几个位置(如top-1、top-2)就展示有效文档,说明其检索精准度高、效率好;若有效文档位置靠后,获取有效信息的效率就会降低。计算平均top-k命中率,就是为了综合评估系统在不同检索深度下找到有效文档的能力,帮助我们了解系统此次查询中检索有效信息的表现,数值越高代表系统表现越好。
  2. 实现方式
    • 数据准备:假设RAG系统针对此次查询返回5个文档。通过大模型分析每个文档对得出答案是否有帮助,为每个文档赋予命中结果 d j d_{j} dj j = 1 , 2 , 3 , 4 , 5 j = 1,2,3,4,5 j=1,2,3,4,5), d j d_{j} dj取值为0或1 ,1表示该文档有助于得出答案,0表示无助于得出答案。
    • 计算top-k命中率
      • top-1命中率 T o p 1 = d 1 Top_1 = d_{1} Top1=d1,即第一个文档的命中结果就是top-1命中率。若 d 1 = 1 d_{1}=1 d1=1,则top-1命中率为1;若 d 1 = 0 d_{1}=0 d1=0,则top-1命中率为0。
      • top-2命中率:$Top_2 = (d_{1} + d_{2}) /2 ,即前两个文档命中结果的平均值。比如 ,即前两个文档命中结果的平均值。比如 ,即前两个文档命中结果的平均值。比如d_{1}=1 , , d_{2}=0$ ,则 T o p 2 = ( 1 + 0 ) / 2 = 0.5 Top_2 = (1 + 0)/2=0.5 Top2=(1+0)/2=0.5
    • 计算平均top-k命中率:计算得到的top-1~5命中率的加权平均值。 S c o r e = 1 N ∑ i = 1 N ( T o p i ∗ d i ) Score = \frac{1}{N} \sum_{i=1}^{N} (Top_i * d_i) Score=N1i=1N(Topidi)
query = "美国最高法院关于堕胎的裁决对全球有什么影响?"
answer = "美国最高法院关于堕胎的裁决具有重要的全球影响。该裁决导致在堕胎访问受到限制的州,三分之一的生育年龄女性和女孩无法获得堕胎服务。那些州的母婴健康支持也较弱,母亲死亡率较高,儿童贫困率也较高。此外,裁决的影响超出了国界,由于美国在全球的地缘政治和文化影响力,这一裁决也产生了跨国影响。全球的组织和活动家担心这一裁决可能会激励其他国家出台反堕胎的立法和政策。裁决还妨碍了某些非洲国家的进步法律改革和堕胎指南的实施。此外,该裁决在国际政策领域造成了寒蝉效应,使得反堕胎的力量能够削弱人权保护。"
docs = ["- 2022年,美国最高法院作出裁决,推翻了50年的判例法,取消了宪法堕胎权。\n- 这一裁决产生了巨大影响:三分之一的生育年龄女性和女孩现在生活在堕胎服务几乎完全无法获得的州。\n- 这些堕胎法律最为严格的州,母婴健康支持最为薄弱,母亲死亡率较高,儿童贫困率较高。\n- 美国最高法院的裁决还通过美国在全球的地缘政治和文化影响力,超越国界产生了影响。\n- 全球的SRR组织和活动家对这一裁决可能为其他国家的反堕胎立法和政策攻击铺路表示担忧。\n- 观察者还注意到该裁决对某些非洲国家的进步法律改革产生了影响,导致堕胎指导方针的 adoption 和执行停滞不前。\n- 该裁决在国际政策领域产生了寒蝉效应,助长了反堕胎的国家和非国家行为体破坏人权保护的势头。","美国最高法院的堕胎裁决不仅在国内引发了激烈的辩论和讨论,也在全球范围内引发了广泛关注。许多国家将美国视为法律和社会问题的领导者,因此这一裁决可能会影响其他国家对堕胎的政策和态度。","这一裁决还可能对国际组织和非政府组织(NGO)产生影响,尤其是那些致力于生育权和妇女健康问题的团体。根据裁决的结果,可能会出现资金、倡导工作和与美国同行的合作发生变化,进而在全球范围内引发生育正义斗争的连锁反应。"
]

代码实现

判断文档有效性

import asyncio
import numpy as np
from typing import List
from langchain_core.documents import Document
from langchain_openai import ChatOpenAI
from langchain_openai import OpenAIEmbeddings
from sklearn.metrics.pairwise import cosine_similarity
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Fieldclass Usefulness_Verdication(BaseModel):reasoning: str = Field(description="思考上下文是否有助于得出给定的回答。")result: int = Field(description="判决结果,如果上下文有助于得出给定的回答,则结果为1,否则为0。")verdication_parser = PydanticOutputParser(pydantic_object=Usefulness_Verdication)llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-14B-Instruct',temperature=0.5,
)verdict_prompt = ("给出问题、回答和上下文,验证上下文是否有助于得出给定的回答。""你需要先分析内容作为判决理由,如果有用,则判决结果为1,如果没用,则判决结果为0。\n\n""输出格式:\n{output_format_instructions}\n""[问题-开始]\n{query}\n[问题-结束]\n\n""[回答-开始]\n{answer}\n[回答-结束]\n\n""[上下文-开始]\n{context}\n[上下文-结束]\n\n"
)
verdict_prompt = PromptTemplate(template=verdict_prompt, partial_variables={"output_format_instructions":verdication_parser.get_format_instructions()}
)verdict_usefulness_chain = verdict_prompt | llm | verdication_parserverdict_prompt.pretty_print()
给出问题、回答和上下文,验证上下文是否有助于得出给定的回答。你需要先分析内容作为判决理由,如果有用,则判决结果为1,如果没用,则判决结果为0。输出格式:
The output should be formatted as a JSON instance that conforms to the JSON schema below.As an example, for the schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}
the object {"foo": ["bar", "baz"]} is a well-formatted instance of the schema. The object {"properties": {"foo": ["bar", "baz"]}} is not well-formatted.Here is the output schema:
```
{"properties": {"reasoning": {"description": "思考上下文是否有助于得出给定的回答。", "title": "Reasoning", "type": "string"}, "result": {"description": "判决结果,如果上下文有助于得出给定的回答,则结果为1,否则为0。", "title": "Result", "type": "integer"}}, "required": ["reasoning", "result"]}
```
[问题-开始]
[33;1m[1;3m{query}[0m
[问题-结束][回答-开始]
[33;1m[1;3m{answer}[0m
[回答-结束][上下文-开始]
[33;1m[1;3m{context}[0m
[上下文-结束]
tasks = [verdict_usefulness_chain.ainvoke({"query":query, 'answer':answer, "context":a_doc,})for a_doc in docs
]verdications = await asyncio.gather(*tasks)
verdications
[Usefulness_Verdication(reasoning='上下文提供了美国最高法院关于堕胎裁决的具体信息,包括裁决内容、对美国国内的影响(如女性和女孩无法获得堕胎服务、母婴健康支持薄弱等)、以及对全球的影响(如其他国家可能受到的立法和政策影响、对某些非洲国家法律改革的阻碍、国际政策领域的寒蝉效应等)。这些信息直接支持了回答中提到的裁决对全球的影响,因此上下文对得出给定的回答有帮助。', result=1),Usefulness_Verdication(reasoning='上下文提到美国最高法院的堕胎裁决在全球范围内引发了广泛关注,并且许多国家将美国视为法律和社会问题的领导者。这与回答中提到的裁决可能激励其他国家出台反堕胎立法和政策以及裁决在全球范围内的跨国影响是一致的。上下文有助于理解回答中的全球影响。', result=1),Usefulness_Verdication(reasoning='上下文补充了回答中的信息,特别是关于裁决如何可能影响国际组织和非政府组织(NGO),尤其是那些致力于生育权和妇女健康问题的团体。上下文提到可能会出现资金、倡导工作和与美国同行的合作发生变化,这进一步解释了裁决的跨国影响。因此,上下文提供了额外的信息,有助于理解裁决对全球的影响。', result=1)]

计算加权平均命中率

results = [item.result for item in verdications]final_score = np.nandenominator = sum(results)
if denominator <=0:final_score = 0
else:numerator = sum([(sum(results[: i + 1]) / (i + 1)) * results[i]for i in range(len(results))])final_score = numerator / denominatorfinal_score
1.0

封装

import asyncio
import nest_asyncio# 应用 nest_asyncio 以支持 Jupyter 笔记本中的异步操作
nest_asyncio.apply()
import asyncio
import numpy as np
from typing import List, Dict
from langchain_core.documents import Document
from langchain.schema.runnable import Runnable
from langchain_openai import ChatOpenAI
from langchain_openai import OpenAIEmbeddings
from sklearn.metrics.pairwise import cosine_similarity
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field# 定义用于判断上下文是否有用的判决结果模型
class Usefulness_Verdication(BaseModel):reasoning: str = Field(description="思考上下文是否有助于得出给定的回答。")result: int = Field(description="判决结果,如果上下文有助于得出给定的回答,则结果为1,否则为0。")class Useful_Context_Precision(Runnable):"""该类用于评估回答中上下文的相关性和有用性。其核心任务是验证给定上下文是否有助于得出回答,并计算有用性判决的平均精度。"""def __init__(self, llm: ChatOpenAI):"""初始化 Useful_Context_Precision 类,设置 LLM 和判决解析器。:param llm: 用于生成上下文判决的 LLM 模型实例"""self.llm = llm# 初始化判决结果解析器,基于 Pydantic 模型 Usefulness_Verdicationself.verdication_parser = PydanticOutputParser(pydantic_object=Usefulness_Verdication)# 定义生成上下文有用性的判决提示模板verdict_prompt = ("给出问题、回答和上下文,验证上下文是否有助于得出给定的回答。\n""你需要先分析内容作为判决理由,如果有用,则判决结果为1,如果没用,则判决结果为0。\n\n""输出格式:\n{output_format_instructions}\n""[问题-开始]\n{query}\n[问题-结束]\n\n""[回答-开始]\n{answer}\n[回答-结束]\n\n""[上下文-开始]\n{context}\n[上下文-结束]\n\n")# 创建 PromptTemplate,插入解析器的输出格式self.verdict_prompt = PromptTemplate(template=verdict_prompt, partial_variables={"output_format_instructions": self.verdication_parser.get_format_instructions()})# 创建 Chain,将模板、LLM 和解析器组合起来self.verdict_usefulness_chain = self.verdict_prompt | self.llm | self.verdication_parserdef verdict_document_usefulness(self, query: str, answer: str, document_list: List[str]) -> List[Usefulness_Verdication]:"""异步判断一组文档中每个文档对给定问题和回答的上下文是否有用。:param query: 提出的问题:param answer: 对问题的回答:param document_list: 文档列表,包含与问题相关的上下文:return: 返回每个文档的上下文有用性的判决结果列表"""# 异步地为每个文档生成判决tasks = [self.verdict_usefulness_chain.ainvoke({"query": query,"answer": answer,"context": a_doc,})for a_doc in document_list]# 使用事件循环运行所有异步任务loop = asyncio.get_event_loop()verdications = loop.run_until_complete(asyncio.gather(*tasks))return verdicationsdef calculate_average_precision(self, results: List[int]) -> float:"""计算并返回平均精度(AP)得分。:param results: 判决结果的列表,其中 1 表示有用,0 表示无用:return: 平均精度得分"""final_score = np.nandenominator = sum(results)if denominator <= 0:# 如果没有有用的判决,则得分为 0final_score = 0else:# 计算加权平均精度numerator = sum([(sum(results[:i + 1]) / (i + 1)) * results[i]for i in range(len(results))])final_score = numerator / denominatorreturn final_scoredef invoke(self, inputs: Dict[str, List[str]]) -> float:"""执行用于计算有用上下文精度的评估。:param inputs: 输入字典,包含以下字段:- "query": 提出的问题- "answer": 对问题的回答- "document_list": 文档列表:return: 计算得到的精度得分"""query = inputs["query"]answer = inputs["answer"]document_list = inputs["document_list"]# 获取文档的有用性判决verdications = self.verdict_document_usefulness(query, answer, document_list)# 提取判决结果(1表示有用,0表示无用)results = [item.result for item in verdications]# 计算并返回平均精度得分score = self.calculate_average_precision(results)return score
llm = ChatOpenAI(base_url='http://localhost:5551/v1',api_key='EMPTY',model_name='Qwen2.5-14B-Instruct',temperature=0.5,
)tool = Useful_Context_Precision(llm)inputs = {"query":query,"answer":answer,"document_list":docs,
}
tool.invoke(inputs)
1.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

变化检测相关论文可读list

一些用得上的&#xff1a; 遥感变化检测常见数据集https://github.com/rsdler/Remote-Sensing-Change-Detection-Dataset/ 代码解读&#xff1a;代码解读 | 极简代码遥感语义分割&#xff0c;结合GDAL从零实现&#xff0c;以U-Net和建筑物提取为例 NeurIPS2024: https://mp.w…

从深入理解 netty——》AI

想了很久&#xff0c;准备写一个系列从深入理解 netty——》AI。 先说下为啥要从netty开始&#xff0c;看看netty的重要性 rocketmq异步消息组件nacos微服务注册中心spring cloud gateway网关redission分布式缓存es全文检索sentinel流量控制&#xff0c;服务保护seata分布式…

Auto-go 环境配置

go环境配置 1.下载 Go 安装包 从 Go 官方网站&#xff08;https://golang.org/dl/&#xff09;下载适合你操作系统的 Go 安装包。不过由于网络原因&#xff0c;可能访问官方网站不太方便可以用我这里的链接Go安装包下载地址点击自动下载 2.下载ide这里使用GoLand 官方网站 …

如何在 Elasticsearch 中设置向量搜索 - 第二部分

作者&#xff1a;来自 Elastic Valentin Crettaz 了解如何在 Elasticsearch 中设置向量搜索并执行 k-NN 搜索。 本文是三篇系列文章中的第二篇&#xff0c;深入探讨了向量搜索&#xff08;也称为语义搜索&#xff09;的复杂性以及它在 Elasticsearch 中的实现方式。 第一部分重…

Leetcode - 周赛435

目录 一、3442. 奇偶频次间的最大差值 I二、3443. K 次修改后的最大曼哈顿距离三、3444. 使数组包含目标值倍数的最少增量四、3445. 奇偶频次间的最大差值 II 一、3442. 奇偶频次间的最大差值 I 题目链接 本题使用数组统计字符串 s s s 中每个字符的出现次数&#xff0c;然后…

SQLMesh系列教程-2:SQLMesh入门项目实战(上篇)

假设你已经了解SQLMesh是什么&#xff0c;以及其他应用场景。如果没有&#xff0c;我建议你先阅读《SQLMesh系列教程-1&#xff1a;数据工程师的高效利器-SQLMesh》。 在本文中&#xff0c;我们将完成一个小项目或教程&#xff0c;以帮助你开始使用SQLMesh。你可以选择一步一步…

MybatisPlus常用增删改查

记录下MybatisPlus的简单的增删改查 接口概述 Service和Mapper区别 Mapper简化了单表的sql操作步骤&#xff08;CRUD&#xff09;&#xff0c;而Serivce则是对Mapper的功能增强。 Service虽然加入了数据库的操作&#xff0c;但还是以业务功能为主&#xff0c;而更加复杂的SQL…

17 MOS管

参考资料 全面认识MOS管&#xff0c;一篇文章就够了-云社区-华为云基础知识中 MOS 部分迟迟未整理&#xff0c;实际分享的电路中大部分常用电路都用到了MOS管&#xff0c;今天势必要来一篇文章&#xff0c;彻底掌握mos管&#xff01;https://bbs.huaweicloud.com/blogs/375339…

pnpm的使用

pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm &#xff0c;意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…

World of Warcraft [CLASSIC][Grandel] FOR THE HORDE

《World of Warcraft [CLASSIC][80猎人][Grandel]维克尼拉斯大型纪录片2025年元宵节击杀联盟主城4BOSS[为了部落&#xff01;]》 World of Warcraft [CLASSIC][80猎人][Grandel]维克尼拉斯大型纪录片2025年元宵节击杀联盟主城4BOSS[为了部落&#xff01;]_魔兽

SSH隧道+Nginx:绿色通道详解(SSH Tunnel+nginx: Green Channel Detailed Explanation)

SSH隧道Nginx&#xff1a;内网资源访问的绿色通道 问题背景 模拟生产环境&#xff0c;使用两层Nginx做反向代理&#xff0c;请求公网IP来访问内网服务器的网站。通过ssh隧道反向代理来实现&#xff0c;重点分析一下nginx反代的基础配置。 实验环境 1、启动内网服务器的tomca…

SQLite 数据库:优点、语法与快速入门指南

文章目录 一、引言二、SQLite 的优点 &#x1f4af;三、SQLite 的基本语法3.1 创建数据库3.2 创建表3.3 插入数据3.4 查询数据3.5 更新数据3.6 删除数据3.7 删除表 四、快速入门指南4.1 安装 SQLite4.2 创建数据库4.3 创建表4.4 插入数据4.5 查询数据4.6 更新数据4.7 删除数据4…

uniapp 编译生成鸿蒙正式app步骤

1&#xff0c;在最新版本DevEco-Studio工具新建一个空项目并生成p12和csr文件&#xff08;构建-生成私钥和证书请求文件&#xff09; 2&#xff0c;华为开发者平台 根据上面生成的csr文件新增cer和p7b文件&#xff0c;分发布和测试 3&#xff0c;在最新版本DevEco-Studio工具 文…

ADB详细教程

目录 一、ADB简介 二、配置 配置环境变量 验证是否安装成功 三、简单使用 基本命令 设备连接管理 USB连接 WIFI连接&#xff08;需要USB线&#xff09; 开启手机USB调试模式 开启USB调试 四、其他 更换ADB默认启动端口 一、ADB简介 ADB&#xff08;Android Debug…

CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测,光伏功率预测

代码地址&#xff1a;CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测&#xff0c;光伏功率预测 CNN-BiLSTM卷积神经网络双向长短期记忆神经网络多变量多步预测 一、引言 1.1、研究背景和意义 光伏功率预测在现代电力系统中占有至关重要的地位。随着可再生能源…

三、OSG学习笔记-应用基础

前一章节&#xff1a;二、OSG学习笔记-入门开发-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145513874 一、 OsgGA: 界面事件处理空间&#xff0c;处理操作各种操作器的最大名字空间&#xff1b; GUIEventHandler: ui 事件操作类 注意&#xff1a;在启…

Django开发入门 – 0.Django基本介绍

Django开发入门 – 0.Django基本介绍 A Brief Introduction to django By JacksonML 1. Django简介 1) 什么是Django? 依据其官网的一段解释&#xff1a; Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. …

计算机毕业设计PySpark+Hadoop+Hive机票预测 飞机票航班数据分析可视化大屏 航班预测系统 机票爬虫 飞机票推荐系统 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【车载项目】 systemui下拉负一屏界面,通过语音输入:“中文模式/英文模式“,会闪现一下负一屏下层的画面

1、背景 【操作步骤】负一屏界面&#xff0c;语音输入&#xff1a;“中文模式/英文模式” 【预期结果】显示正常 【实际结果】 会闪现一下负一屏下层的文字 【发生概率】必现 systemui下拉负一屏界面&#xff0c;通过语音输入&#xff1a;“中文模式/英文模式”&#xff0c;会…

从零到一:基于Rook构建云原生Ceph存储的全面指南(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件1&#xff09;Rook Operator2&#xff09;Rook Discover3&#xff09;Rook Agent 2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.3 获取…