qidao123.com技术社区-IT企服评测·应用市场

标题: 全网最全RAG评估指南:全面剖析RAG评估指标并提供代码示例 [打印本页]

作者: 圆咕噜咕噜    时间: 2024-10-18 20:54
标题: 全网最全RAG评估指南:全面剖析RAG评估指标并提供代码示例
一、RAG痛点介绍
迩来我一直在关注和优化RAG(Retrieval-Augmented Generation)干系的内容,总结了一下RAG的痛点和最佳实践,然后重点会介绍怎样评估RAG。



二、RAG痛点优化
认识了RAG的痛点,就知道怎样举行优化了,下面是RAG最佳实践的总结。

首先,总结一下日常对RAG(Retrieval-Augmented Generation)的最佳实践中,通常会涉及以下关键问题和优化计谋:
1. 数据怎样处理的?

2. chunk-size怎样设置的?

3. Embedding模型使用的什么?

4. Prompt怎样设计?

5. 检索的topN怎样设置?

6. LLM模型选择的什么?

7. RAG检索天见结果优化计谋







通过不断地实验和优化,可以找到最恰当特定应用场景的RAG配置,从而实现更好的检索和天见结果。
颠末各种优化之后,对RAG来说,最紧张的就是怎样评估其结果。

三、为什么需要对RAG体系评估?
评估是AI开发流程中的一个非常关键步骤,它被用于查抄当前计谋相对于其他计谋的有效性,或在当你对流程举行更改时举行评估。因此在举行LLM项目的开发和改进时,必须要有衡量其表现的方法。



LlamaIndex中RAG处理过程(图片来源:https://docs.llamaindex.ai/en/stable/getting_started/concepts/ ):


为了评估RAG体系,我们通常使用两种类型的评估:

与传统的呆板学习技能不同,传统技能有明白定量的度量指标(如Gini系数、R平方、AIC、BIC、混淆矩阵等),评估RAG体系更加复杂。这种复杂性的原因在于RAG体系天生的相应是非结构化文本,需要结合定性和定量指标来正确评估其性能。
为了有效评估RAG体系,我们通常遵照TRIAD框架。该框架由三个主要组成部分组成:


检索评估适用于RAG体系的检索器组件,该组件通常使用向量数据库。这些评估衡量检索器在相应用户查询时辨认和排名干系文档的结果。检索评估的主要目标是评估上下文干系性,即检索到的文档与用户查询的匹配程度。它确保提供给天生组件的上下文是干系和正确的。

正确度
正确度衡量了检索到的文档的正确性。它是检索到的干系文档数目与检索到的文档总数之比。定义如下:

这意味着正确度评估了体系检索到的文档中有多少实际与用户查询干系。例如,如果检索器检索到了10个文档,其中7个是干系的,那么正确度将是0.7或70%。
  1. def calculate_precision(retrieved_docs, relevant_docs):
  2.     """   
  3.     计算精确度   
  4.    
  5.     参数:   
  6.     retrieved_docs (list): 检索到的文档列表   
  7.     relevant_docs (list): 相关文档列表   
  8.    
  9.     返回:   
  10.     float: 精确度   
  11.     """   
  12.     # 计算检索到的相关文档数量   
  13.     relevant_retrieved_docs = [doc for doc in retrieved_docs if doc in relevant_docs]  
  14.       
  15.     # 计算精确度   
  16.     precision = len(relevant_retrieved_docs) / len(retrieved_docs) if retrieved_docs else 0   
  17.     return precision
  18.    
  19. # 示例数据
  20. retrieved_docs = ['doc1', 'doc2', 'doc3', 'doc4', 'doc5']
  21. relevant_docs = ['doc2', 'doc4', 'doc6']
  22. # 计算精确度
  23. precision = calculate_precision(retrieved_docs, relevant_docs)
  24. print(f"精确度: {precision:.2f}")
复制代码
  正确度评估的是“体系检索到的所有文档中,有多少实际上是干系的?”
  在可能导致负面结果的情况下,正确度尤为紧张。例如,在医学信息检索体系中,高正确度至关紧张,因为提供不干系的医学文档可能导致错误信息和潜在的有害结果。
召回率

召回率衡量了检索到的文档的全面性。它是检索到的干系文档数目与数据库中干系文档的总数之比。定义如下:

这意味着召回率评估了数据库中存在的干系文档有多少被体系乐成检索到。
  1. def calculate_recall(retrieved_docs, relevant_docs):   
  2.     """   
  3.     计算召回率   
  4.    
  5.     参数:   
  6.     retrieved_docs (list): 检索到的文档列表   
  7.     relevant_docs (list): 相关文档列表   
  8.    
  9.     返回:   
  10.     float: 召回率   
  11.     """   
  12.     # 计算检索到的相关文档数量   
  13.     relevant_retrieved_docs = [doc for doc in retrieved_docs if doc in relevant_docs]   
  14.    
  15.     # 计算召回率   
  16.     recall = len(relevant_retrieved_docs) / len(relevant_docs) if relevant_docs else 0   
  17.     return recall
  18.    
  19. # 示例数据
  20. retrieved_docs = ['doc1', 'doc2', 'doc3', 'doc4', 'doc5']
  21. relevant_docs = ['doc2', 'doc4', 'doc6', 'doc7']
  22. # 计算召回率
  23. recall = calculate_recall(retrieved_docs, relevant_docs)
  24. print(f"召回率: {recall:.2f}")
复制代码
  召回率评估的是“数据库中存在的所有干系文档中,体系乐成检索到了多少个?”
  在可能错过干系信息会产天生本的情况下,召回率至关紧张。例如,在法律信息检索体系中,高召回率至关紧张,因为未能检索到干系的法律文件可能导致不完备的案例研究,并可能影响法律诉讼的结果。
正确度和召回率的均衡

通常需要均衡正确度和召回率,因为改善其中一个指标有时会低落另一个指标。目标是找到恰当特定应用需求的最佳均衡。这种均衡有时可以用F1分数来量化,F1分数是正确度和召回率的调平静均值:



平均倒数排名(MRR)

平均倒数排名(MRR)是一种评估检索体系结果的度量指标,它考虑了第一个干系文档的排名位置。当只有第一个干系文档是主要关注的情况下,MRR特殊有效。倒数排名是第一个干系文档被找到的排名的倒数。MRR是多个查询的这些倒数排名的平均值。MRR的公式如下:

其中Q是查询的数目,是第q个查询的第一个干系文档的排名。
   MRR评估的是“平均来说,体系多快能够在相应用户查询时检索到第一个干系文档?”
  例如,在基于RAG的问答体系中,MRR至关紧张,因为它反映了体系能够多快地向用户出现正确答案。如果正确答案更频仍地出如今列表的顶部,MRR值将更高,表现检索体系更有效。
平均正确率(MAP)

平均正确率(MAP)是一种评估多个查询的检索正确度的度量指标。它同时考虑了检索的正确度和检索文档的次序。MAP定义为一组查询的平均正确率得分的平均值。为了盘算单个查询的平均正确率,需要在检索到的文档的排序列表中的每个位置盘算正确度,只考虑前K个检索到的文档,其中每个正确度都根据文档是否干系举行加权。多个查询的MAP公式如下:

其中Q是查询的数目,是查询q的平均正确率。
   MAP评估的是“平均来说,体系在多个查询中排名靠前的文档的正确度怎样?”
  例如,在基于RAG的搜索引擎中,MAP至关紧张,因为它考虑了检索的正确度和不同排名的检索结果,确保干系文档在搜索结果中更高地显示,从而通过首先出现最干系的信息来进步用户体验。


相应评估

相应评估适用于体系的天生组件。这些评估衡量体系根据检索到的文档提供的上下文有效地天生相应的能力。我们将相应评估分为两种类型:

老实度(基于检索)

老实度评估天生的相应是否正确,并且基于检索到的文档。它确保相应不包罗幻觉或错误信息。这个度量指标至关紧张,因为它将天生的相应追溯到其来源,确保信息基于可验证的真实情况。老实度有助于防止幻觉,即体系天生听起来公道但事实上不正确的相应。
为了衡量老实度,通常使用以下方法:

答案干系性

答案干系性衡量天生的相应对用户的查询有多好,并提供有效的信息。
四、使用LangSmith举行评估
了解了这些评估指标,该怎样举行评估,可以先通过使用LangSmith举行评估,LangSmith 是一个开发者平台,允许您调试、测试、评估和监控大语言模型 (LLM) 应用步伐,并且能够与 LangChain 无缝集成, 助您从开发原型顺利过渡到实际生产应用。

在LLM使命中,丈量正确性的一个挑战来自非结构化文本的影响。问答体系可能天生冗长的相应,使得传统的指标如 BLEU 或 ROUGE 变得不可靠。在这种情况下,使用标注良好的数据集和大语言模型 (LLM) 辅助评估器可以帮助您评估体系的相应质量。
针对一个RAG体系举行评估,主要步骤如下:

\1. 在LangChain代码中参加使用LangSmith
第一步:获取一个LangChain的API Key,登录LangSmith:https://smith.langchain.com/,参考下图创建API key:

第二步:设置以下参数后,LangSmith会自动举行跟踪管理。

\2. 准备测试数据
这里整理了三种准备测试数据的方式:数据导入,代码创建和使用LangSmith辅助创建。
第一种方法:CSV文件导入


第二种方法:代码创建
下面的代码实验后,也可以在LangSmith中新建一个 Retrieval QA Questions xxxxx 的测试集。
  1. # 问题与答案
  2. examples = [
  3.     (   
  4.         "What is LangChain?",        
  5.         "LangChain is an open-source framework for building applications using large language models. It is also the name of the company building LangSmith.",   
  6.     ),   
  7.     (     
  8.         "Can I trace my Llama V2 llm?",        
  9.         "So long as you are using one of LangChain's LLM implementations, all your calls can be traced",   
  10.     ),
  11. ]
  12. # 数据库创建部分
  13. from langsmith import Client
  14. client = Client()
  15. import uuid
  16. dataset_name = f"Retrieval QA Questions {str(uuid.uuid4())}"
  17. dataset = client.create_dataset(dataset_name=dataset_name)
  18. for q, a in examples:
  19.     client.create_example(     
  20.         inputs={"question": q}, outputs={"answer": a}, dataset_id=dataset.id   
  21.     )
复制代码
第三种方法:使用LangSmith辅助创建
创建的步骤如下:

\3. 使用LangSmith举行评估
测试数据准备好之后,就可以开始对体系举行评估了。LangSmith的后台可以天生评估的代码。



RAG QA问答的正确性评估器(Evaluator)包罗三个版本:“qa”、“context_qa”、“cot_qa”。
“qa”评估器,指示大语言模型 (LLM) 根据参考答案直接将相应评为“正确”或“错误”。
“context_qa”评估器指示 LLM 使用参考“上下文”来确定相应的正确性。用于只有上下文息争答,没有答案的情况。
“cot_qa”评估器与“context_qa”评估器雷同,但它指示 LLMChain 在得出最终结论前使用头脑链“推理”。
这通常会导致相应更好地与人工标签匹配,但会稍微增加 Token 和运行成本。
更多评估器,可以参考下面的文档:
https://docs.smith.langchain.com/old/evaluation/faq/evaluator-implementations
\4. 完备代码
  1. import langsmith
  2. from langchain import chat_models, prompts, smith
  3. from langchain.schema import output_parser
  4. from langchain_community.llms import Ollama
  5. from langchain_community.embeddings import OllamaEmbeddings
  6. import bs4
  7. from langchain import hub
  8. from langchain.text_splitter import RecursiveCharacterTextSplitter
  9. from langchain_community.document_loaders import WebBaseLoader
  10. from langchain_community.vectorstores import Chroma
  11. from langchain_core.output_parsers import StrOutputParser
  12. from langchain_core.runnables import RunnablePassthrough
  13. from langchain_community.document_loaders import UnstructuredHTML
  14. Loaderloader = UnstructuredHTMLLoader("./240327-ollama-20question.html")
  15. docs = loader.load()
  16. text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
  17. splits = text_splitter.split_documents(docs)
  18. vectorstore = Chroma.from_documents(documents=splits, embedding=OllamaEmbeddings(model="mofanke/acge_text_embedding"))
  19. retriever = vectorstore.as_retriever()
  20. from langchain.prompts import ChatPromptTempla
  21. tetemplate = """你是一个回答问题的助手。请使用以下检索到的背景信息来回答问题。如果你不知道答案,直接说你不知道。请用最多三句话来保持回答的简洁性。
  22. 问题:{question}
  23. 背景:{context}
  24. 答案:
  25. """
  26. prompt = ChatPromptTemplate.from_template(template)
  27. #llm = chat_models.ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
  28. llm = Ollama(model="qwen:72b", temperature=0)
  29. # Post-processing
  30. def format_docs(docs):
  31.     return "\n\n".join(doc.page_content for doc in docs)
  32. # Chain
  33. rag_chain = (
  34.     {"context": retriever | format_docs, "question": RunnablePassthrough()}   
  35.     | prompt   
  36.     | llm   
  37.     | StrOutputParser()
  38. )
  39. # 执行查询
  40. rag_chain.invoke("Ollama支持哪些模型?")
  41. # 定义评估设置(评估器,评估用的LLM等)
  42. eval_config = smith.RunEvalConfig(  
  43.     evaluators=[        
  44.         "cot_qa"   
  45.     ],   
  46.     custom_evaluators=[],   
  47.     eval_llm=Ollama(model="qwen:72b", temperature=0)
  48. )
  49. client = langsmith.Client()
  50. chain_results = client.run_on_dataset(
  51.     dataset_name="Self-RAG-Ollama-20QA",   
  52.     llm_or_chain_factory=rag_chain,   
  53.     evaluation=eval_config,   
  54.     project_name="test-crazy-rag-qw72b-qw72b",   
  55.     concurrency_level=5,   
  56.     verbose=True,
  57. )
复制代码
开发RAG体系自己并不困难,但评估RAG体系对于性能、实现持续改进、与业务目标保持同等、均衡成本、确保可靠性和顺应新方法至关紧张。这个全面的评估过程有助于构建强盛、高效和以用户为中央的RAG体系。
后续筹划继续写3-5篇,继续介绍RAG的评估框架和方法,点赞评论关注我,持续学习更精彩。
参考资料:
1.https://baoyu.io/translations/rag/12-rag-pain-points-and-proposed-solutions
\2. https://myscale.com/blog/zh/ultimate-guide-to-evaluate-rag-system/
\3. https://github.com/langchain-ai/langsmith-cookbook/blob/main/testing-examples/qa-correctness/qa-correctness.ipynb
怎样学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将紧张的AI大模型资料包罗AI大模型入门学习头脑导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完备版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从底子到前沿,把握人工智能的核心技能!

二、640套AI大模型报告合集

这套包罗640份报告的合集,涵盖了AI大模型的理论研究、技能实现、行业应用等多个方面。无论您是科研人员、工程师,照旧对AI大模型感爱好的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

三、AI大模型经典PDF籍

随着人工智能技能的飞速发展,AI大模型已经成为了当今科技范畴的一大热点。这些大型预练习模型,如GPT-3、BERT、XLNet等,以其强盛的语言理解和天生能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

四、AI大模型商业化落地方案


作为普通人,入局大模型时代需要持续学习和实践,不断进步自己的技能和认知程度,同时也需要有责任感和伦理意识,为人工智能的康健发展贡献气力。
本文转自 https://blog.csdn.net/zhishi0000/article/details/140964285?spm=1001.2014.3001.5501,如有侵权,请联系删除。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4