LangChain大型语言模型(LLM)应用开发(五):评估

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,以便在不同的应用程序中使用。

今天我们来学习DeepLearning.AI的在线课程:LangChain for LLM Application Development的第五门课:Evaluation(评估),所谓评估是指检验LLM回答的问题是否正确的方法,在上一篇博客Q&A over Documents中我们解释了如何通过langchain来实现对文档的问答功能,在文档的问答过程中LLM会就用户提出的关于文档内容的相关问题进行回答,那么今天我们需要研究的就是如何来检验LLM的回答是否正确?

要评估LLM回答问题的准确性大致需要下面几个步骤:

  1. 需要创建一组关于相关的问答测试集(包含了问题和标准答案)
  2. 让LLM回答测试集中的所有问题,并收集LLM给出的所有答案
  3. 将LLM的答案与问答测试集中的标准答案做比对,并给LLM的表现评分

下面我们就开始来讨论评估LLM表现吧!

创建基于文档问答的Q/A应用

首先我们还是要做一些基础性工作,比如设置openai的api key,导入一些langchain的基础库:

import pandas as pd
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import CSVLoader
from langchain.indexes import VectorstoreIndexCreator
from langchain.vectorstores import DocArrayInMemorySearch
import osfrom dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file

接下来我们需要导入一个csv文件,该文档主要包含2列,name和description,其中name表示商品的名称,description表示该商品的说明信息,我们需要对改文档的产品信息进行问答。

df=pd.read_csv("OutdoorClothingCatalog_1000.csv")df

 下面我们查看一下其中的某个商品信息:

print(df[:1].name.values[0])
print('------------------------')
print(df[:1].description.values[0])

 下面我们将该商品的信息翻译成中文,这样便于大家理解:

 接下来我们要创建一个用于回答文档内容的chain:RetrievalQA, 创建RetrievalQA需要包含以下几个步骤:

  1. 创建一个文档加载器CSVLoad实例
  2. 创建向量数据库索引index
  3. 创建llm
  4. 创建文档问答chain,RetrievalQA
#1.创建文档加载器
file = 'OutdoorClothingCatalog_1000.csv'
loader = CSVLoader(file_path=file)
data = loader.load()#2.创建向量数据库索引
index = VectorstoreIndexCreator(vectorstore_cls=DocArrayInMemorySearch
).from_loaders([loader])#3.创建llm
llm= ChatOpenAI(temperature = 0.0)#4.创建文档问答chain
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=index.vectorstore.as_retriever(), verbose=True,chain_type_kwargs = {"document_separator": "<<<<>>>>>"}
)

上述代码的主要功能及作用在LangChain大型语言模型(LLM)应用开发(四):Q&A over Documents这篇博客中都已说明,这里不再赘述。

设置测试的数据

下面我们查看一下经过档加载器CSVLoad加载后生成的data内的信息,这里我们抽取data中的第九和第十条数据看看它们的主要内容:

手动创建测试集 

需要说明的是这里我们的文档是csv文件,所以我们使用的是文档加载器是CSVLoader,CSVLoader会对csv文件中的每一行数据进行分割,所以这里看到的data[10],data[11]的内容则是csv文件中的第10,第11条数据的内容。下面我们根据这两条数据手动设置两条“问答对”,每一个“问答对”中包含一个query,一个answer:

examples = [{"query": "Do the Cozy Comfort Pullover Set\have side pockets?","answer": "Yes"},{"query": "What collection is the Ultra-Lofty \850 Stretch Down Hooded Jacket from?","answer": "The DownTek collection"}
]

让LLM生成Q/A测试用例

在我以前写的两篇博客中(使用大型语言模(LLM)构建系统(七):评估1,与 使用大型语言模(LLM)构建系统(七):评估2)我们使用的方法都是通过手动的方法来构建测试数据集,比如说我们可以手动创建10个问题和10个答案,然后让LLM回答这10个问题,再将LLM给出的答案与我们准备好的答案做比较,最后再给LLM打分。评估的流程大概就是这样,但是这里有一个问题,就是我们需要手动去创建所有的问题集和答案集,那会是一个非常耗费人力和时间的成本。那有没有一种可以自动创建大量问题集和答案集的方法呢?那当然是有的,今天我们就来介绍Langchain提供的方法:QAGenerateChain,我们可以通过QAGenerateChain来为我们的文档自动创建问答集:

from langchain.evaluation.qa import QAGenerateChainexample_gen_chain = QAGenerateChain.from_llm(ChatOpenAI())new_examples = example_gen_chain.apply([{"doc": t} for t in data[:5]])
print(new_examples)

 这里我们对上述代码做个简单说明,我们创建了一个QAGenerateChain,然后我们应用了QAGenerateChain的apply方法对data中的前5条数据创建了5个“问答对”,由于创建问答集是由LLM来自动完成的,因此会涉及到token成本的问题,所以我们这里出于演示的目的,只对data中的前5条数据创建问答集。

那QAGenerateChain是如何自动创建问题集的,一个简单的apply方法似乎隐藏了很多的细节,如果你对这个隐藏的细节感兴趣,那我们可以尝试用debug的方式来打开这个潘多拉魔盒:

import langchain#打开debug
langchain.debug = Truenew_examples = example_gen_chain.apply([{"doc": t} for t in data[:5]])#关闭debug
langchain.debug = False

 从上面展现的细节中我们可以看到,原来在QAGenerateChain中有一个内置的prompt,在这个内置的prompt的前缀信息中,以"Human"的角色要求LLM对给与它的文档产生一个question和answer。这个prompt的前缀信息大概就长这个样子:

 QAGenerateChain会在data中的每一条数据中都运用这个prompt模板,因此data中的每一条数据都会产生一条“问答对”。有了问答集以后,我们还需要对问答集进行解析,从中过滤出真正有用的信息,不过我们首先需要创建一个解析函数parse_strings:

def parse_strings(strings_list):parsed_list = []for s in strings_list:s = s.replace('\n\n','\n')split_s = s.split('\n')# Ensure there are 2 parts in the split stringif len(split_s) != 2:continuequestion_part, answer_part = split_s# Ensure each part has the correct prefixif not question_part.startswith('QUESTION: ') or not answer_part.startswith('ANSWER: '):continue# Remove the prefixes and strip leading/trailing whitespacequestion = question_part.replace('QUESTION: ', '').strip()answer = answer_part.replace('ANSWER: ', '').strip()parsed_list.append({"query": question, "answer": answer})return parsed_list#对问答集进行解析
new_examples = parse_strings([t['text'] for t in new_examples])
print(new_examples)

 这里经过解析以后我们的new_examples 中只包含了5个query和5个answer,没有其他多余的信息,这正是我们想要的测试集。

组合测试集

还记得我们前面手动创建的两个问答集吗?现在我们需要将之前手动创建的问答集合并到QAGenerateChain创建的问答集中,这样在答集中既有手动创建的例子又有llm自动创建的例子,这会使我们的测试集更加完善:

examples += new_examplesexamples 

 这里我们看到examples 的前两条数据就是我们先前手动创建的,接下来我们就需要让之前创建的文档问答chain来回答这个测试集里的问题,来看看LLM是怎么回答的吧:

qa.run(examples[0]["query"])

 

 这里我们看到qa回答了第0个问题:“Yes, the Cozy Comfort Pullover Set does have side pockets.” ,这里的第0个问题就是先前我们手动创建的第一个问题,并且我们手动创建的answer是 :"Yes", 这里我们发现问答chain qa回答的也是“Yes”,只是它比我们的答案还多了一段说明:“the Cozy Comfort Pullover Set does have side pockets.”。

你想知道问答chain qa是怎么找到问题的答案的吗?魔鬼往往隐藏在细节中,下面让我们打开debug,看看问答chain qa是如何找到问题的答案!

langchain.debug = Trueqa.run(examples[0]["query"])langchain.debug = False

 这里我们稍微对问答chain qa寻找答案的过程进行一些说明,首先qa拿到问题,然后根据问题去向量数据库中搜索和问题相关的产品信息(会在全部产品中搜索),由于向量数据库中可能会存在多条产品信息和问题相关,因此这里会用“<<<<>>>>>”来分隔搜索到的多个产品信息,这里所谓的搜索是指向量间的相似度计算和比较,首先将问题转换成向量,再计算问题向量和数据库中每个向量的相似度,获取相似度最高的n条向量,然后再将这些相似的向量再转换成对应的文本即可。当这些步骤完成以后我们就看到了上述的结果,其中罗列了question和content,question是我们提出的问题,而“content”则是搜索到的多个相关产品信息,它们被用“<<<<>>>>>”分隔。这里需要加入一个我的个人判断:在搜索相关文档的时候应该是没有llm参与的,因此不会产生token成本的问题。在有了问题和相关产品信息后,接下来就需要LLM登场了,这里就会有一个prompt,在这个prompt中有一个System前缀信息,它告诉llm需要做什么,紧接着前缀信息的是多个产品信息,它们被用<<<<>>>>>进行分隔,最后是我们的问题,这里用Human来标识我们的问题。

 

 下面是输出部分,LLM会根据给它的prompt输出一个内容较多的json格式的结果,其中包含了问题的答案:

 

 最后经过过滤,得到了最终的答案:

前面我们让问答chain qa回答了测试集中的一个问题,下面我们要做的是让qa来回答测试集中的所有问题:

predictions = qa.apply(examples)

  

 基于LLM的自我评估

让我们来理一下思路,首先我们让LLM自动创建了问答测试集,接着我们又让LLM回答了测试集中所有的问题并得到了所有问题的回复信息。接下来我们要做的就是将这些问题的回复信息与测试集里的答案进行比对,更其妙的是这个比对过程也将是由LLM自己来完成,也就是说我们的LLM既当球员,又当裁判,最后再由“裁判”给出比对的结果,不过我需要指出的这里既当球员,又当裁判的LLM并非是同一个chain构成的,它们来自于不同的chain,也就是说这些chain的职能是不同的:

from langchain.evaluation.qa import QAEvalChain#创建LLM
llm = ChatOpenAI(temperature=0)#创建评估chain
eval_chain = QAEvalChain.from_llm(llm)#生成评估结果
graded_outputs = eval_chain.evaluate(examples, predictions)#统计评估结果
for i, eg in enumerate(examples):print(f"Example {i}:")print("Question: " + predictions[i]['query'])print("Real Answer: " + predictions[i]['answer'])print("Predicted Answer: " + predictions[i]['result'])print("Predicted Grade: " + graded_outputs[i]['text'])print()

 从上面的返回结果中我们看到,每一个问题中都包含了Question,Real Answer,Predicted Anser和Predicted Grade 四组内容,其中Real Answer是有先前的QAGenerateChain创建的问答测试集中的答案,而Predicted Answer则是由我们的问答chain qa回答的问题,最后的Predicted Grade则是由上面代码中的QAEvalChain回答的。

总结

今天我们学习了如何利用Langchain来评估LLM的表现,和以前评估openai模型的方法不同的是,这里我们使用的是全自动方式,即全自动方式生成测试集,然后全自动的给出问题的预测结果,最好全自动的评估预测结果的准确性,通过这种全自动的方式解放了我们的双手,使我们不需要因为没有测试数据集而苦恼,大大提高了生产率。

参考资料

QA Generation | 🦜️🔗 Langchain

Question Answering | 🦜️🔗 Langchain

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

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

相关文章

你不知道的 async、await 魔鬼细节

点击上方 前端Q&#xff0c;关注公众号 回复加群&#xff0c;加入前端Q技术交流群 作者&#xff1a;Squirrel_ https://juejin.cn/post/7194744938276323384 0、前言 关于promise、async/await的使用相信很多小伙伴都比较熟悉了&#xff0c;但是提到事件循环机制输出结果类似的…

我与ChatGPT又聊了聊:什么是真正的云原生大数据平台

图片来源 | 文心一格 小智&#xff1a;传统大数据平台是什么样的&#xff1f;企业使用传统大数据平台有哪些弊端&#xff1f; 小智&#xff1a;云原生为什么这么火&#xff1f;企业如何借助云原生实现数据驱动&#xff1f; 小智&#xff1a;你听过在Kubernetes上部署的容器化云…

【云原生】我将ChatGPT变成Kubernetes 和Helm 终端

{kubectl get po&#xff0c;deploy&#xff0c;svc}{kubectl run --imagenginx nginx-app --port80 --env“DOMAINcluster”}{kubectl expose deployment nginx-app --port80 --namenginx-http}{kubectl get po&#xff0c;svc&#xff0c;deploy}{curl 10.100.67.94:80}{helm…

关于云原生,我问了 ChatGPT 几个问题......

2 个月用户破亿&#xff0c;一举超过 Tik Tok 成为史上增速最快的消费级应用程序&#xff0c;ChatGPT 的诞生给沉寂的科技圈丢下了一块巨大的石头。这场生成式 AI 掀起的浪潮&#xff0c;让人不禁重回到当年人类智慧的大溃败——AlphaGo 战胜李世石&#xff0c;震撼依旧但其背后…

教你接入GPT4,不用梯子也能玩

介绍 chatgpt最近十分火爆&#xff0c;但大多少开发接入的都是gpt3.5&#xff0c;今天教教大家如何快速接入gpt4 使用 接入很简单&#xff0c;需要去API文档获取你的token填入&#xff0c;每个账号都有白嫖次数&#xff0c;以下是node代码 const { data } await axios({url…

GPT:你知道这五年我怎么过的么?

时间轴 GPT 首先最初版的GPT&#xff0c;来源于论文Improving Language Understanding by Generative Pre-Training&#xff08;翻译过来就是&#xff1a;使用通用的预训练来提升语言的理解能力&#xff09;。GPT这个名字其实并没有在论文中提到过&#xff0c;后人将论文名最后…

【2023.5.3~2023.5.9】CTF刷题记录

目录 日期&#xff1a;2023.5.3 题目&#xff1a;[GWCTF 2019]pyre 日期&#xff1a;2023.5.4 题目&#xff1a;[ACTF新生赛2020]easyre 题目&#xff1a;DASCTF Apr.2023 X SU战队2023开局之战 【简单】easyRE 日期&#xff1a;2023.5.5 题目&#xff1a;findit 题目&…

浅尝Transformer和LLM

文章目录 TransformerTransformer的衍生BERTPre-trainingBERT与其他方法的关系怎么用BERT做生成式任务&#xff1f; GPTPre-trainingFine-Tuning Transformer工具开源库特点 LLM系列推理服务 大语言模型势不可挡啊。 哲学上来说&#xff0c;语言就是我们的一切&#xff0c;语言…

【stable diffusion原理解读通俗易懂,史诗级万字爆肝长文,喂到你嘴里】

文章目录 一、前言&#xff08;可跳过&#xff09;二、stable diffusion1.clip2.diffusion modelforward diffusion &#xff08;前向扩散&#xff09;逆向扩散&#xff08;reverse diffusion&#xff09;采样图阶段小结 3.Unet modeltimestep_embedding采用正余弦编码 三、sta…

旋转的base,你见过吗wp

一、题目 前几天在ctfshow的qq交流群里看到有个师傅在问一道名为“旋转的base&#xff0c;你见过吗”的题目&#xff08;但这道题不是ctfshow平台上的啦&#xff0c;后来听说好像是个比赛题&#xff09;&#xff0c;题目给出了一串编码过的字符串&#xff0c;但看题目名也能知…

OtterCTF—内存取证wp

目录 前言 一、工具说明 二、题目解析 1.What the password? 2.General Info 3.Play Time 4.Name Game 5.Name Game 2 6.Silly Rick 7.Hide And Seek 8.Path To Glory 9.Path To Glory 2 10.Bit 4 Bit 11.Graphics For The Weak 12.Recovery 13.Closure 总结 前言 前几天有幸…

电商打工人的饭碗,AIGC还端不走

文 | 螳螂观察 作者 | 鲸胖胖 以ChatGPT、Midjourney、文心一言等为代表的AIGC产品&#xff0c;已经在全球掀起新一轮的AI技术变革新浪潮&#xff0c;再度刷新了人们对AI的认知&#xff0c;多个行业的商业模式和生态必然在未来会被彻底重构。 前不久&#xff0c;36氪就测使用…

巴比特 | 元宇宙每日必读:用虹膜信息换基本收入?OpenAI创始人顶着质疑声为其Web3项目Worldcoin再寻1亿美元融资...

摘要&#xff1a;据元宇宙日爆报道&#xff0c;OpenAl的CEO要为他两年前创办的币圈项目worldcoin再寻1亿美元融资&#xff0c;该项目于5月8日面向全球推出加密钱包WorldApp&#xff0c;要给“无条件为全民空投代币”&#xff0c;此外&#xff0c;项目方还为这款钱包的推出发行了…

类 ChatGPT 开源软件,开发者用的上吗?

声明&#xff1a;本文是 Preethi Cheguri 所著文章《ChatGPT Equivalent Is Open-Source, But it Is of No Use to Developers》的中文译文。 原文链接&#xff1a;https://www.analyticsinsight.net/chatgpt-equivalent-is-open-source-but-it-is-of-no-use-to-developers/ 类…

【原创】运维工程师涨薪计划,chatGPT帮你做规划

文章目录 1、运维工程师怎么涨薪呢&#xff1f;a&#xff09;加大深度b&#xff09;加大广度 2、运维工程师何处去呢&#xff1f;3、chatGPT告诉你3年、5年、10年运维和开发的现状&#xff1b;有运维经验的工程师&#xff0c;搞开发好吗薪资会有显著提升吗以数据证明&#xff0…

计算机视觉实战--OpenCV进行红绿灯识别

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 OpenCV是一个开源的计算机视觉库&#xff0c;可以用于实现各种图像和视频处理任务&#xff0c;包括红绿灯识别。可以帮助自动驾驶汽车、智能交通系统等设备准确地识别红绿灯的状态&#xff0c;以便做出正确的决策。今天&a…

时隔 3 年,全新 Linux QQ 正式开启公测!

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) 2019 年&#xff0c;腾讯低调发布了 Linux QQ 的更新&#xff0c;目前版本停留在 2.0 Beta2。 时隔 3 年&#xff0c;QQ for Linux 基于 NT 技术架构迎来全新升级。今日&#xff08;12 月 7 日&#xff09;起&#x…

USG防火墙------内外网用户通过外网IP访问内部服务器(NAT)

实现需求&#xff1a;用户通过内外网用户通过公网IP访问内部服务器。 一、局域网配置&#xff1a;交换机(SW7)、防火墙&#xff08;FW3&#xff09;、服务器&#xff08;Server1&#xff09;、客户端&#xff08;Client1&#xff09; 二、配置思路 1、配置防火墙接口和IP地址…

趋势交易策略的买卖点选择,几种趋势介绍

这一篇来给大家说说顺势而为的趋势里面的交易策略。 清晰流畅的趋势都是比较难得的。那样的趋势一旦出现了&#xff0c;股价的运行 就会表现出一定的规律&#xff0c;即在上升趋势中表现出“更高的高点和更高的低点”&#xff0c;在下跌趋势中 表现出“更低的高点和更低的低点…

近期的热点风险事件都与这些内容相关

今天是母亲节&#xff0c;您辛苦了&#xff01;愿妈妈们被岁月温柔以待图片 2022年青山伦镍事件&#xff0c;上演了一出《生死时速》大片&#xff0c;国际金融市场的猎杀、逼仓、巨亏等戏码&#xff0c;作为普通吃瓜群众可能只是当成饭后茶余的谈资&#xff0c;但其背后蕴藏着…