2026年【LangChain】5 评估

【LangChain】5 评估import os from zhipuai import ZhipuAI from dotenv import load dotenv find dotenv 读取本地 项目的环境变量 find dotenv 寻找并定位 env 文件的路径 load dotenv 读取该 env 文件 并将其中的环境变量加载到当前的运行环境中 如果你设置的是全局的环境变量 这行代码则没有任何作用

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



import os from zhipuai import ZhipuAI from dotenv import load_dotenv, find_dotenv# 读取本地/项目的环境变量。# find_dotenv()寻找并定位.env文件的路径

load_dotenv()读取该.env文件,并将其中的环境变量加载到当前的运行环境中

如果你设置的是全局的环境变量,这行代码则没有任何作用。

_ = load_dotenv(find_dotenv())# 获取环境变量 OPENAI_API_KEY key = “” client = ZhipuAI(api_key = key)

按照langchain链的方式进行构建

from langchain.chains.retrieval_qa.base import RetrievalQA #检索QA链,在文档上进行检索 from langchain_community.chat_models.zhipuai import ChatZhipuAI #openai模型 from langchain.document_loaders import CSVLoader #文档加载器,采用csv格式存储 from langchain.indexes import VectorstoreIndexCreator #导入向量存储索引创建器 from langchain.vectorstores import DocArrayInMemorySearch #向量存储
#加载中文数据 file = './data/product_data.csv' loader = CSVLoader(file_path=file,encoding="utf-8") data = loader.load()
#查看数据 import pandas as pd test_data = pd.read_csv(file,header=None) test_data

from langchain_community.embeddings.zhipuai import ZhipuAIEmbeddings# 使用智谱 AI 嵌入模型 embeddings = ZhipuAIEmbeddings(model="embedding-2", # 智谱 AI 的嵌入模型名称api_key=key # 替换为你的智谱 AI API Key ) ''' 将指定向量存储类,创建完成后,我们将从加载器中调用,通过文档记载器列表加载 ''' index = VectorstoreIndexCreator(embedding=embeddings,vectorstore_cls=DocArrayInMemorySearch ).from_loaders([loader])
#通过指定语言模型、链类型、检索器和我们要打印的详细程度来创建检索QA链 llm = ChatZhipuAI(model_name="glm-3-turbo",temperature = 0.0, zhipuai_api_key=key) qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=index.vectorstore.as_retriever(), verbose=True,chain_type_kwargs = {"document_separator": "<<<<>>>>>"} )
2.1 创建评估数据点

1、将数据点作为例子,查看一些数据,然后想出例子问题和答案,以便以后用于评估

data[10]#查看这里的一些文档,我们可以对其中发生的事情有所了解
Document(metadata={'source': './data/product_data.csv', 'row': 10}, page_content="product_name: 高清电视机 description: 规格: 尺寸:50''。 为什么我们热爱它: 我们的高清电视机拥有出色的画质和强大的音效,带来沉浸式的观看体验。 材质与护理: 使用干布清洁。 构造: 由塑料、金属和电子元件制成。 其他特性: 支持网络连接,可以在线观看视频。 配备遥控器。 在韩国制造。 有问题?请随时联系我们的客户服务团队,他们会解答您的所有问题。")
data[11]
Document(metadata={'source': './data/product_data.csv', 'row': 11}, page_content="product_name: 旅行背包 description: 规格: 尺寸:18'' x 12'' x 6''。 为什么我们热爱它: 我们的旅行背包拥有多个实用的内外袋,轻松装下您的必需品,是短途旅行的理想选择。 材质与护理: 可以手洗,自然晾干。 构造: 由防水尼龙制成。 其他特性: 附带可调节背带和安全锁。 在中国制造。 有问题?请随时联系我们的客户服务团队,他们会解答您的所有问题。")
创建测试用例数据
examples = [{"query": "高清电视机怎么进行护理?","answer": "使用干布清洁。"},{"query": "旅行背包有内外袋吗?","answer": "有。"} ]
通过LLM生成测试用例
from langchain.evaluation.qa import QAGenerateChain #导入QA生成链,它将接收文档,并从每个文档中创建一个问题答案对

由于QAGenerateChain类中使用的PROMPT是英文,故我们继承QAGenerateChain类,将PROMPT加上“请使用中文输出”。

下面是generate_chain.py文件中的QAGenerateChain类的源码

"""LLM Chain specifically for generating examples for question answering.""" from __future__ import annotationsfrom typing import Anyfrom langchain.base_language import BaseLanguageModel from langchain.chains.llm import LLMChain from langchain.evaluation.qa.generate_prompt import PROMPTclass QAGenerateChain(LLMChain):"""LLM Chain specifically for generating examples for question answering."""@classmethoddef from_llm(cls, llm: BaseLanguageModel, kwargs: Any) -> QAGenerateChain:"""Load QA Generate Chain from LLM."""return cls(llm=llm, prompt=PROMPT, kwargs)
# 下面是langchain.evaluation.qa.generate_prompt中的源码,我们在template的最后加上“请使用中文输出” # flake8: noqa from langchain.output_parsers.regex import RegexParser from langchain.prompts import PromptTemplatetemplate = """You are a teacher coming up with questions to ask on a quiz. Given the following document, please generate a question and answer based on that document.Example Format: 
  
    
    
      ... 
     
       QUESTION: question here ANSWER: answer hereThese questions should be detailed and be based explicitly on information in the document. Begin! 
      
        {doc} 
       
         请使用中文输出。 """ output_parser = RegexParser(regex=r"QUESTION: (.*?) ANSWER: (.*)", output_keys=["query", "answer"] ) PROMPT = PromptTemplate(input_variables=["doc"], template=template, output_parser=output_parser )PROMPT 
        
       
      
    
# 继承QAGenerateChain class MyQAGenerateChain(QAGenerateChain):"""LLM Chain specifically for generating examples for question answering."""@classmethoddef from_llm(cls, llm: BaseLanguageModel, kwargs: Any) -> QAGenerateChain:"""Load QA Generate Chain from LLM."""return cls(llm=llm, prompt=PROMPT, kwargs)
example_gen_chain = MyQAGenerateChain.from_llm(ChatZhipuAI(zhipuai_api_key=key))#通过传递chat open AI语言模型来创建这个链
new_examples = example_gen_chain.apply_and_parse([{"doc": t} for t in data[:5]] ) #我们可以创建许多例子
new_examples #查看用例数据
[{'query': '这款全自动咖啡机有哪几种预设的咖啡模式?','answer': '文档中并未明确列出全自动咖啡机具体有多少种预设的咖啡模式,但提到了“预设多种咖啡模式”,所以可以推断至少有不止一种咖啡模式供选择。具体模式需要在其他产品说明或客户服务处获取详细信息。 '},{'query': '这款电动牙刷具有哪些特性使其在市场上受到欢迎?','answer': '这款电动牙刷采用先进的刷头设计和强大的电机,提供了超凡的清洁力和舒适的刷牙体验。它还具有多种清洁模式和定时功能,并且可以通过USB充电,而且是在日本制造的。这些特性使其受到市场的欢迎。'},{'query': '这款橙味维生素C泡腾片每片含有多少毫克的维生素C?', 'answer': '每片含有500mg的维生素C。'},{'query': '根据产品描述,这款无线蓝牙耳机单个耳机的尺寸是多少?', 'answer': '单个耳机尺寸为1.5寸 x 1.3寸。'},{'query': '这款瑜伽垫的尺寸是多少?', 'answer': "这款瑜伽垫的尺寸是24'' x 68''。"}]
new_examples[0]
{'query': '这款全自动咖啡机有哪几种预设的咖啡模式?','answer': '文档中并未明确列出全自动咖啡机具体有多少种预设的咖啡模式,但提到了“预设多种咖啡模式”,所以可以推断至少有不止一种咖啡模式供选择。具体模式需要在其他产品说明或客户服务处获取详细信息。 '}
组合用例数据
examples += new_examples
qa.run(examples[0]["query"])
> Entering new RetrievalQA chain...> Finished chain. '根据提供的资料,高清电视机的护理方法是:使用干布清洁。'
3.1 如何评估新创建的实例
''' LingChainDebug工具可以了解运行一个实例通过链中间所经历的步骤 ''' import langchain langchain.debug = True
qa.run(examples[0]["query"])#重新运行与上面相同的示例,可以看到它开始打印出更多的信息
如何评估新创建的实例

与创建它们类似,可以运行链条来处理所有示例,然后查看输出并尝试弄清楚,发生了什么,它是否正确

predictions = qa.apply(examples) #为所有不同的示例创建预测 ‘’‘ 对预测的结果进行评估,导入QA问题回答,评估链,通过语言模型创建此链 ’‘’ from langchain.evaluation.qa import QAEvalChain #导入QA问题回答,评估链 llm = ChatZhipuAI(model_name=“glm-3-turbo”,temperature = 0.0, zhipuai_api_key=key) eval_chain = QAEvalChain.from_llm(llm) graded_outputs = eval_chain.evaluate(examples, predictions)#在此链上调用evaluate,进行评估
4.1 评估思路

当它面前有整个文档时,它可以生成一个真实的答案,我们将打印出预测的答,当它进行QA链时,使用embedding和向量数据库进行检索时,将其传递到语言模型中,然后尝试猜测预测的答案,我们还将打印出成绩,这也是语言模型生成的。当它要求评估链评估正在发生的事情时,以及它是否正确或不正确。因此,当我们循环遍历所有这些示例并将它们打印出来时,可以详细了解每个示例

#我们将传入示例和预测,得到一堆分级输出,循环遍历它们打印答案 for i, eg in enumerate(examples):print(f“例 {i}:”)print(“问题: ” + predictions[i][‘query’])print(“真实答案: ” + predictions[i][‘answer’])print(“预测答案: ” + predictions[i][‘result’])print(“预测成绩: ” + graded_outputs[i][‘results’])print()

例 0: 问题: 高清电视机怎么进行护理? 真实答案: 使用干布清洁。 预测答案: 根据提供的资料,高清电视机的护理方法是:使用干布清洁。 预测成绩: CORRECT例 1: 问题: 旅行背包有内外袋吗? 真实答案: 有。 预测答案: 是的,旅行背包拥有多个实用的内外袋。 预测成绩: CORRECT例 2: 问题: 这款全自动咖啡机有哪几种预设的咖啡模式? 真实答案: 文档中并未明确列出全自动咖啡机具体有多少种预设的咖啡模式,但提到了“预设多种咖啡模式”,所以可以推断至少有不止一种咖啡模式供选择。具体模式需要在其他产品说明或客户服务处获取详细信息。 预测答案: 根据提供的文本信息,这款全自动咖啡机有“预设多种咖啡模式”,但具体是哪几种模式并未列出。 预测成绩: CORRECT例 3: 问题: 这款电动牙刷具有哪些特性使其在市场上受到欢迎? 真实答案: 这款电动牙刷采用先进的刷头设计和强大的电机,提供了超凡的清洁力和舒适的刷牙体验。它还具有多种清洁模式和定时功能,并且可以通过USB充电,而且是在日本制造的。这些特性使其受到市场的欢迎。 预测答案: 根据提供的描述,这款电动牙刷在市场上受到欢迎的原因包括:1. 先进的刷头设计和强大的电机:这提供了超凡的清洁力。

  1. 舒适的刷牙体验:除了清洁力,它也注重使用感受。
  2. 多种清洁模式:可以满足不同用户的需求。
  3. 定时功能:有助于用户保持良好的刷牙习惯。
  4. USB充电:提供了便捷的充电方式。
  5. 在日本制造:可能暗示着较高的品质或工艺标准。 预测成绩: CORRECT例 4: 问题: 这款橙味维生素C泡腾片每片含有多少毫克的维生素C? 真实答案: 每片含有500mg的维生素C。 预测答案: 这款橙味维生素C泡腾片每片含有500毫克的维生素C。 预测成绩: CORRECT例 5: 问题: 根据产品描述,这款无线蓝牙耳机单个耳机的尺寸是多少? 真实答案: 单个耳机尺寸为1.5寸 x 1.3寸。 预测答案: 根据产品描述,这款无线蓝牙耳机单个耳机的尺寸是1.5‘’ x 1.3‘’。 预测成绩: CORRECT例 6: 问题: 这款瑜伽垫的尺寸是多少? 真实答案: 这款瑜伽垫的尺寸是24‘’ x 68‘’。 预测答案: 根据您提供的上下文,有两款瑜伽垫:1. 瑜伽垫 (Yoga Mat): 尺寸是 24‘’ x 68‘’。
  6. 防滑瑜伽垫 (Non-slip Yoga Mat): 尺寸是 72‘’ x 24‘’。 预测成绩: CORRECT 对于每个示例,它看起来都是正确的,让我们看看第一个例子。 这里的问题是,舒适的套头衫套装,有侧口袋吗?真正的答案,我们创建了这个,是肯定的。模型预测的答案是舒适的套头衫套装条纹,确实有侧口袋。因此,我们可以理解这是一个正确的答案。它将其评为正确。
    4.2 结果分析
    使用模型评估的优势

    你有这些答案,它们是任意的字符串。没有单一的真实字符串是最好的可能答案,有许多不同的变体,只要它们具有相同的语义,它们应该被评为相似。如果使用正则进行精准匹配就会丢失语义信息,到目前为止存在的许多评估指标都不够好。目前最有趣和最受欢迎的之一就是使用语言模型进行评估。

小讯
上一篇 2026-04-08 13:41
下一篇 2026-04-08 13:39

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/251000.html