首页 > 其他分享 >RAG知识库的可靠性评估(二)

RAG知识库的可靠性评估(二)

时间:2024-04-01 09:01:32浏览次数:22  
标签:RAG 可靠性 context 知识库 dataset Ragas truth answer

      上篇文件介绍了RAG优化与评估的基本概念,以及使用TruLens-Eval在没有Ground-truth的情况下评估RAG应用。本篇文件主要是使用Ragas对RAG应用进行评估;
      使用了Gagas生成合成测试数据集,在只有知识库文档并没有Ground-truth(真实答案)的情况下让想评估该知识库文档应用到RAG的的效果如何,这时可以用Ragas生成包含question、context、Ground-truth(真实答案)的数据集。即可在有Ground-truth(真实答案)的情况下评估RAG。

21.png

      RAG包含两个主要流程,向量检索、响应生成。Ragas把这两个流程评估指标分为:评价检索包括context_relevancy和context_recall)和生成指标(faithfulness和answer_relevancy)。
      Context_relevancy:上下文精度,上下文Context与Ground-truth的相关性越高RAG效果越好。
      Context_recall:上下文召回率,是否检索到回答问题所需的所有相关信息。根据真实答案(ground truth)估算上下文召回率(Context recall),分析真实答案中的每个句子以确定它是否可以归因于检索到的Context。
      Faithfulness:答案的事实准确性,答案中提出的所有基本事实都可以从给定的上下文context中推断出来,则生成的答案被认为是忠实的。
      Answer Relevance: 答案相关性,度量LLM的Response答案与Query提问的相关度。如分低,可能反应了回答不对题。

提示词(prompt)自动适配

      在Ragas中默认的Prompt是英文的,如果直接使用生成数据集会出现一些英文数据,所以需要将Ragas内置的Prompt翻译为中文后使用。在Ragas中也提供了Prompt自动适配其他语言的支持;

noun_extractor = Prompt(
    name="noun_extractor",
    instruction="Extract the noun from given sentence",
    examples=[{
        "sentence":"The sun sets over the mountains.",
        "output":{"nouns":["sun", "mountains"]}
    }],
    input_keys=["sentence"],
    output_key="output",
    output_type="json"
)
#生成中文提示词
adapted_prompt = 
qa_prompt.adapt(language="chinese",llm=openai_model)
#保存提示词
adapted_prompt.save()
print(adapted_prompt.to_string())

#加载指定提示词
Prompt._load(name="question_generation",language="chinese",cache_dir='/home/linx/.cache/ragas')

      Ragas使用LLM将提示词翻译成为目标语言提示词,还可以保存所翻译的提示词到磁盘,默认路径为:/home/linx/.cache/ragas,保存完成后后续可以直接加载使用;

合成测试数据集

      在Ragas中生成合成数据集也会是使用LLM配合指定的Prompt用于数据集的生成,还可以生成不同难度级别的问题,生成的数据集按不同难度级别分布,给定LLM、配置文档集即可,其生成原理受到Evol-Inform启发。Ragas中为question_type定义了simple、reasoning、multi_context、conditional四种级别的问题,保证了数据集的多样性。

22.png

        simple:简单问题,生成的问题在上下文中得到解答。
        reasoning:推理问题,该问题的答案从上下文中推理得到。
        multi_context:多上下文问题,问题经过重写,问题解答需要从多个上下文中获取信息。
        conditional:条件问题,问题经过重写,通过影响上下文的条件使问题复杂化。

testset_generator = TestsetGenerator.from_langchain(
    generator_llm=generator_llm,
    critic_llm=generator_llm,
    embeddings=embedding_model
)

language = "chinese"
testset_generator.adapt(language,evolutions=[simple, 
reasoning,conditional,multi_context])

testset_generator.save(evolutions=[simple, reasoning, 
multi_context,conditional])

distributions = {
simple:0.4
reasoning:0.2,
multi_context:0.2,
conditional:0.2
}

synthetic_dataset = 
testset_generator.generate_with_langchain_docs(
    documents=load_documents(),
    test_size=10,
    with_debugging_logs=True
)

from datasets import Dataset

print(synthetic_dataset.to_pandas().head()) 
print('-------------------')
Dataset.save_to_disk(synthetic_dataset.to_dataset(),'testset')

评估合成测试数据集

      生成的数据集没有经过解答未包含answer字段,这里打算把ground_truth(真实答案)当做answer。

from datasets import load_from_disk,Dataset
#评估生成的数据集
# loading the V2 dataset
ds = load_from_disk("testset")
df = ds.to_pandas()
#复制ground_truth列,由于数据集不存在answer列,将ground_truth复制为该列
answer = df['ground_truth'].copy()
df['answer'] =answer
new_dataset = Dataset.from_pandas(df)

# ds=new_dataset.to_pandas()
# ds.head()

from ragas.metrics import (
    answer_relevancy,
    faithfulness,
    context_recall,
    context_precision,
)
from ragas import evaluate

result = evaluate(
   llm=generator_llm,
    dataset=new_dataset,
    embeddings=embedding_model,
    metrics=[
        context_precision,
        faithfulness,
        answer_relevancy,
        context_recall,
    ],
)
df = result.to_pandas()
print(df)

对数据集的评估结果指标如下,这里只列出了部分字段:

23.png

文章首发地址:https://mp.weixin.qq.com/s/RQ-3nJQzSBzEW0jl3SMEXg

标签:RAG,可靠性,context,知识库,dataset,Ragas,truth,answer
From: https://www.cnblogs.com/softlin/p/18106832

相关文章

  • 输入输出-中断-总线-可靠性
    输入输出技术计算机系统中存在多种内存与接口地址的编制方式,常见的是下面两种:内存与接口地址独立编址方法内存地址和接口地址是两个完全独立的两个地址空间。访问数据时所使用的指令也完全不同,用于接口的指令只用于接口的读/写,其余的指令全都是用于内存的。因此,在编程序或......
  • 大模型检索增强生成RAG原理介绍
    大家好,我是程序锅。github上的代码封装程度高,不利于小白学习入门。常规的大模型RAG框架有langchain等,但是langchain等框架源码理解困难,debug源码上手难度大。因此,我写了一个人人都能看懂、人人都能修改的大模型RAG框架代码。整体项目结构如下图所示:本篇文章将介绍2.RA......
  • ViewPager2 FragmentManager is already executing transactions
    一、概述双层Fragment+ViewPager2嵌套来回切换导致如下异常ViewPager2FragmentManagerisalreadyexecutingtransactions 二、解决办法FragmentStateAdapter的默认构造函数使用的是:publicFragmentStateAdapter(@NonNullFragmentActivityfragmentActivity......
  • 基于Java+Neo4j的知识图谱+全文检索的知识库管理系统(附文档+代码)
      在数字化高度普及的时代,企事业机关单位在日常工作中会产生大量的文档,例如医院制度汇编,企业知识共享库等。针对这些文档性的东西,手工纸质化去管理是非常消耗工作量的,并且纸质化查阅难,易损耗,所以电子化管理显得尤为重要。【springboot+elasticsearch+neo4j+vue+activiti】实......
  • 论文:Improving Entity Disambiguation by Reasoning over a Knowledge Base翻译笔记(通
    文章目录论文题目:通过在知识库中进行推理来改进实体消歧摘要1介绍2相关工作2.1带有知识库上下文的勃起功能障碍(ED)问题2.2基于知识图谱嵌入的ED2.3全局ED(实体解析)2.4多模块的实体识别3拟议的方法3.1任务表述3.2概述3.3提及表示3.4初始实体得分ψ~a~3.4.1实体......
  • 高效工作秘诀:推荐几款超好用的本地知识库搭建工具
    众所周知,对于企业来说,知识管理变得越来越重要。想要高效管理知识,一个优秀的本地知识库搭建工具可是必不可少的哦!今天,我就来给大家推荐几款超好用的本地知识库搭建工具,分别是HelpLook、Mediawiki、Notion和Obsidian。简单说一下它们的优缺点,以帮助企业更好的选择出合适的工具......
  • 企业微信知识库:从了解到搭建的全流程
    你是否也有这样的疑惑:为什么现在的企业都爱创建企业微信知识库?企业微信知识库到底有什么用?如果想要使用企业微信知识库企业应该如何创建?这就是我今天要探讨的问题,感兴趣的话一起往下看吧!| 为什么企业都喜欢用企业微信知识库首先,咱们得明白,现在这个时代,信息就是金钱,知识......
  • 如何提高知识库系统管理水平?
    我们都有过这样的经历--遇到问题或紧急请求时,第一时间就是向知识库系统寻求帮助。很多时候,当你翻遍了无穷无尽的文档,却发现没有任何东西能够摆脱此时的困境,这时,向服务台提交工单成了不可避免的解决方式,漫长的等待直到IT团队做出回应。而如果事先能够轻松获得相关解决方案,这一切......
  • PgSql 知识库
    --分页offset和limit位置可以互换不影响结果select*fromjinxudong.t_studentoffset0limit2;select*fromjinxudong.t_studentlimit2offset0;--表明加别名用as不用as都可以select*fromjinxudong.t_studentasawherea.id<23limit2offset0;sele......
  • defrag" 命令的帮助信息,该命令用于对磁盘进行碎片整理操作
    Windows系统中"defrag"命令的帮助信息,该命令用于对磁盘进行碎片整理操作。下面是对其中的参数和选项的翻译:Volumes:/C|/AllVolumes:对每个卷只运行给定操作列表中的首选操作。/E|/VolumesExcept<volumepaths>:在每个卷上执行除了指定的操作外的所有操作。如果例外......