首页 > 其他分享 >让模型评估模型:构建双代理RAG评估系统的步骤解析

让模型评估模型:构建双代理RAG评估系统的步骤解析

时间:2024-09-24 16:23:39浏览次数:10  
标签:RAG prompt knowledge AI 模型 engineering answer 评估


在当前大语言模型(LLM)应用开发的背景下,一个关键问题是如何评估模型输出的准确性。我们需要确定哪些评估指标能够有效衡量提示(prompt)的效果,以及在多大程度上需要对提示进行优化。

为解决这一问题,我们将介绍一个基于双代理的RAG(检索增强生成)评估系统。该系统使用生成代理和反馈代理,基于预定义的测试集对输出进行评估。或者更简单的说,我们使用一个模型来评估另外一个模型的输出。

在本文中将详细介绍如何构建这样一个RAG评估系统,并展示基于四种提示工程技术的不同结果,包括ReAct、思维链(Chain of Thought)、自一致性(Self-Consistency)和角色提示(Role Prompting)。

以下是该项目的整体架构图:

让模型评估模型:构建双代理RAG评估系统的步骤解析_lua

数据收集与摄入

此部分在 ingestion.py 中实现

数据收集过程使用了三篇文章作为源数据。在加载和分割数据后,我们对文本进行嵌入,并将嵌入向量存储在FAISS中。FAISS(Facebook AI Similarity Search)是由Meta开发的开源库,用于高效进行密集向量的相似性搜索和聚类。

以下是实现代码:

urls= [  
     "https://medium.com/@fareedkhandev/prompt-engineering-complete-guide-2968776f0431",  
     "https://medium.com/@researchgraph/prompt-engineering-21112dbfc789",  
     "https://blog.fabrichq.ai/what-is-prompt-engineering-a-detailed-guide-with-examples-4d3cbbd53792"  
 ]  
 loader=WebBaseLoader(urls)  
 # 文本分割器  
 text_splitter=RecursiveCharacterTextSplitter(  
     chunk_size=1000, chunk_overlap=20  
 )  
 documents=loader.load_and_split(text_splitter)  
 
 # LLM  
 embedder_llm=OpenAIModel().embed_model()  
 
 # 对文档块进行嵌入  
 vectorstore=FAISS.from_documents(documents, embedder_llm)  
 vectorstore.save_local("faiss_embed")  
 print("===== 数据摄入完成 ===== ")

创建测试集

此部分在 create_test_set.py 中实现

测试集的构建使用了Giskard工具。Giskard是一个开源工具,专为测试和改进机器学习模型而设计。它使用户能够创建、运行和自动化测试,以评估模型的性能、公平性和稳健性。

实现代码如下:

fromlangchain_community.document_loadersimportWebBaseLoader  
 fromlangchain.text_splitterimportRecursiveCharacterTextSplitter  
 # 用于构建测试集  
 fromgiskard.ragimportKnowledgeBase, generate_testset  
 # 数据框  
 importpandasaspd  
 fromLLM.modelsimportOpenAIModel  
 
 if__name__=='__main__':  
     urls= [  
         "https://medium.com/@fareedkhandev/prompt-engineering-complete-guide-2968776f0431",  
         "https://medium.com/@researchgraph/prompt-engineering-21112dbfc789",  
         "https://blog.fabrichq.ai/what-is-prompt-engineering-a-detailed-guide-with-examples-4d3cbbd53792"  
     ]  
     loader=WebBaseLoader(urls)  
     # 文本分割器  
     text_splitter=RecursiveCharacterTextSplitter(  
         chunk_size=1000, chunk_overlap=20  
     )  
     documents=loader.load_and_split(text_splitter)  
 
     df=pd.DataFrame([doc.page_contentfordocindocuments], columns=["text"])  
     print(df.head(10))  
 
     ## 将数据框添加到giskard KnowledgeBase  
     knowledge_base=KnowledgeBase(df)  
 
     # 生成测试集  
     test_set=generate_testset(  
         knowledge_base,  
         num_questions=10,  
         agent_description="A chatbot answering question about prompt engineering"  
     )  
     test_set.save("test-set.jsonl")

由于文本太多,生成的样例就不显示了

答案检索

此部分在 generation.py 中实现

本文的第一个流程是生成流程。我们从FAISS检索数据。实现代码如下:

generate_llm=OpenAIModel().generate_model()  
 embedder_llm=OpenAIModel().embed_model()  
 vectorstore=FAISS.load_local("faiss_embed", embedder_llm, allow_dangerous_deserialization=True)  
 
 retrieval_qa_chat_prompt= (retrieval)  
 
 prompt=ChatPromptTemplate.from_messages(  
     [  
         ("system", retrieval_qa_chat_prompt),  
         ("human", "{input}"),  
     ]  
 )
 combine_docs_chain=create_stuff_documents_chain(generate_llm, prompt)  
 retrival_chain=create_retrieval_chain(  
     retriever=vectorstore.as_retriever(),  
     combine_docs_chain=combine_docs_chain  
 )

评估

此部分在 evaluation.py 中实现

评估过程中向LLM提供三个输入:问题、AI答案(第一个LLM的输出)和实际答案(从测试集中检索)。实现代码如下:

defRAG_eval(question, AI_answer, Actual_answer, prompt):  
     evaluation_prompt_template=PromptTemplate(  
         input_variables=[  
             "question", "AI_answer", "Actual_answer"  
         ],  
         template=prompt  
     )  
     generate_llm=OpenAIModel().generate_model()  
 
     optimization_chain=evaluation_prompt_template|generate_llm|StrOutputParser()  
 
     result_optimization=optimization_chain.invoke(  
         {"question": question, "AI_answer": AI_answer, "Actual_answer": Actual_answer})  
     returnresult_optimization

链接整合

此部分在 main.py 中实现

主文件遍历测试数据,使用问题作为第一个LLM的输入。然后将第一个LLM的输出用作第二个LLM的输入。实现代码如下:

foritemindata:  
     question= {"input": item['question']}  
     # 生成回答  
     result=retrival_chain.invoke(input=question)  
     AI_answer=result['answer']  
     # 获取实际答案  
     Actual_answer=item['reference_answer']  
 
     # 将所有内容提供给第二个LLM  
     Evaluation=RAG_eval(  
         question=question,  
         AI_answer=AI_answer,  
         Actual_answer=Actual_answer,  
         prompt=evaluation_self_consistency_prompting  
     )  
 
     print(f"AI_answer:{AI_answer}")  
     print(Evaluation)

实验结果

评估组件采用了四种不同的提示工程技术:

  1. 思维链(Chain of Thought)
  2. ReAct
  3. 角色提示(Role Prompting)
  4. 自一致性(Self-Consistency)

以下是基于这四种不同提示技术的评估代理对测试集第一个问题的输出示例:

问题: What is the purpose of incorporating knowledge in prompt engineering?

实际答案: Incorporating knowledge or information in prompt engineering enhances the model’s prediction accuracy. By providing relevant knowledge or information related to the task at hand, the model can leverage this additional context to make more accurate predictions. This technique enables the model to tap into external resources or pre-existing knowledge to improve its understanding and generate more informed responses

**AI答案:**Incorporating knowledge in prompt engineering enhances the quality of responses by guiding AI models to provide not just answers, but also relevant context and insights. This leads to more informative and meaningful interactions, improving user experience and understanding.

使用思维链输出的**评估结果:**The student’s answer correctly identifies that incorporating knowledge enhances the quality of responses and improves user experience. However, it lacks emphasis on the model’s prediction accuracy and the importance of leveraging external resources or pre-existing knowledge, which are key components of the actual answer. This omission affects the completeness and correctness of the response.

使用ReAct输出评估结果**:**The student’s answer correctly identifies that incorporating knowledge enhances the quality of responses and improves user experience. However, it lacks emphasis on the specific aspect of prediction accuracy and the importance of leveraging external resources or pre-existing knowledge, which are key components of the actual answer. This omission affects the completeness of the response, leading to a lower evaluation percentage.

使用角色提示输出评估结果**:**The student’s response accurately captures the essence of incorporating knowledge in prompt engineering by emphasizing the enhancement of response quality and user experience. However, it lacks specific mention of prediction accuracy and the model’s ability to leverage external resources, which are key aspects of the actual response.

使用自一致性输出评估结果**:**The student’s answer captures the essence of enhancing the quality of responses through knowledge incorporation, but it lacks specific mention of prediction accuracy and the model’s ability to leverage external resources. The initial evaluation was slightly optimistic, but upon reevaluation, it became clear that the answer did not fully align with the actual answer’s emphasis on prediction accuracy and context utilization

实验结果分析

下图展示了四种提示工程技术的准确性比较。每种技术由图中的一条独立线条表示,X轴上的10个数据点对应测试数据的索引值,Y轴表示准确性值。

让模型评估模型:构建双代理RAG评估系统的步骤解析_大语言模型_02

在评估过程中,准确性达到85%及以上的响应视为真正准确(True),低于85%则视为不准确(False)。下面的条形图展示了基于每种提示工程技术的评估结果中True和False的计数。

让模型评估模型:构建双代理RAG评估系统的步骤解析_lua_03

实验结果显示,ReAct和思维链(Chain of Thought)的性能几乎相似,而自一致性(Self-Consistency)则表现出完全相反的行为。角色提示(Role Prompting)在所有方法中表现最不稳定。

一些发现

  1. 评估代理的所有响应虽然在内容上相近,都提到了类似的缺失元素,但反馈之间的差异主要体现在具体措辞和强调点上,这些细微差别可能会对最终的评分过程产生影响。
  2. 角色提示和自一致性技术倾向于强调结果的积极方面,而ReAct和思维链则更多地使用特定措辞来突出回答中的缺失部分。

总结

本文展示了如何构建一个基于双代理的RAG(检索增强生成)评估系统,该系统使用两个大语言模型(LLM):一个用于生成响应,另一个用于提供反馈。通过采用四种不同的提示工程技术——思维链、ReAct、角色提示和自一致性,我们能够全面评估AI生成响应的准确性和质量。

实验结果表明:

  1. ReAct和思维链技术在性能上表现相似,这可能是因为它们都强调了结构化思考过程。
  2. 自一致性技术经常产生与其他方法相反的结果,这突显了在评估过程中考虑多个角度的重要性。
  3. 角色提示技术被证明是最不可靠的,这可能是由于其在不同上下文中的不一致性。


作者:Homayoun S.


标签:RAG,prompt,knowledge,AI,模型,engineering,answer,评估
From: https://blog.51cto.com/deephub/12100838

相关文章

  • 可编辑PPT | 企业架构(EA)治理+IT现状评估+业务能力构建项目解决方案
    在当今数字化时代,企业架构(EnterpriseArchitecture,EA)是企业实现战略目标和提升竞争力的关键。本文涵盖了企业架构设计、IT现状诊断以及业务能力构建设计规划等多个方面。一、企业架构设计咨询项目是企业实现战略转型和创新发展的关键步骤。它通过全面分析和规划,帮助企业构......
  • 机器学习模型中特征贡献度分析:预测贡献与错误贡献
    在机器学习领域,特征重要性分析是一种广泛应用的模型解释工具。但是特征重要性并不等同于特征质量。本文将探讨特征重要性与特征有效性之间的关系,并引入两个关键概念:预测贡献度和错误贡献度。核心概念预测贡献度:衡量特征在模型预测中的权重,反映模型在训练集上识别的模式。这与传统的......
  • 利用未标记数据的半监督学习在模型训练中的效果评估
    数据科学家在实践中经常面临的一个关键挑战是缺乏足够的标记数据来训练可靠且准确的模型。标记数据对于监督学习任务(如分类或回归)至关重要。但是在许多领域,获取标记数据往往成本高昂、耗时或不切实际。相比之下,未标记数据通常较易获取,但无法直接用于模型训练。如何利用未标记数据来......
  • 抛开线性回归模型,基于树模型来尝试构建回归模型,可视化绘制树状层级结构
    一提到回归,可能很多人第一时间脑海里想到的就是线性回归模型,的确,线性回归器可以说是非常常用的模型了。线性回归模型广泛应用于各种领域,如经济学、金融学、社会科学、工程学等。它可以用于预测、因果分析、趋势分析等。线性回归模型是一种广泛应用于统计学和机器学习中的预测模......
  • 阅读《AI大模型开发之路》的十大理由
    作为一名技术博主,我最近读完了《AI大模型开发之路》这本书,深感这是一部值得推荐的佳作。如果你对AI大模型感兴趣,或者希望在这个领域有所提升,那么这本书绝对不容错过。以下是我推荐你阅读《AI大模型开发之路》的十大理由:1.全面覆盖AI大模型开发的各个方面从基础理论到实践应......
  • 杠杆(leverage)
    在金融和经济领域中,杠杆和加杠杆是非常重要的概念,通常用于描述借贷、投资和企业运营中如何利用借入资金或债务来放大收益的行为。它们可以增加潜在的收益,但也会增加风险。1.杠杆(Leverage)杠杆是指使用借款资金来进行投资或运营,以期望通过借来的资金获取更高的收益。在没有杠杆的......
  • 浏览器进程模型大揭秘:从原理到实践
    浏览器的进程模型何为进程?程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程。每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。何为线程?有了进程后,就可以运行程序的代码了。运行代码的「人」称之为「线程」。一个进程至少有一个线程,所以......
  • MMD模型及动作一键完美导入UE5-IVP5U插件方案(二)
    1、下载并启用IVP5U插件1、下载IVP5U插件,IVP5U,点击Latest下载对应引擎版本,将插件放到Plugins目录,同时将.uplugin文件的EnableByDefault改为false2、然后通过Edit->Plugins启用插件2、导入pmx模型1、直接在Content的某个目录拖入pmx模型,选择默认参数2、导入模型成功......
  • 自学大模型LLM,看这本书就够了!帮你快速入门大模型!(含PDF)
    一、Transformer模型介绍Transformer模型是一种基于自注意力机制的深度神经网络模型,在自然语言处理(NLP)领域取得了显著的成果,并在机器翻译、文本摘要、问答系统等多个任务中表现出色。1.基本原理Transformer模型主要由自注意力机制和前馈神经网络两部分组成。(1)自注意力机制:功能:自注......
  • 下载 |《2024年AI Agent行业报告》——大模型时代的“APP”,探索新一代人机交互及协作
    前言随着大型模型在各行各业的广泛应用,基于大型模型的人工智能体(AIAgent)迎来了快速发展的阶段。研究AIAgent是人类不断接近人工通用智能(AGI)的探索之一。知名AIAgent项目AutoGPT已经在GitHub的星星数已经达到140,000颗,进一步反映了用户对于AIAgents项目的广泛兴趣和支持。随......