吴恩达大模型教程笔记(六)
LangChain_微调ChatGPT提示词_RAG模型应用_agent_生成式AI - P21:3. 第二篇 - RAG 指标三元组(RAG Triad of metrics) 中英文字幕 - 吴恩达大模型 - BV1gLeueWE5N
本节课我们将深入探讨评估,我们将带你了解如何评估服务器架设的核心概念,具体来说,我们将介绍三叉戟,用于拉执行三个主要步骤的度量标准,上下文相关性,基于事实的答案无关性,这些是反馈函数可扩展框架的示例。
LLM应用的程序化评估,然后,我们将教你如何合成生成评估数据集,给定任何无结构化语料库,我们现在开始,我将使用笔记本带你走遍三叉戟,答案相关性,上下文相关性和基于事实的答案无关性。
以理解如何使用真正的镜头来检测幻觉。
到这个点,你已经安装了真正的镜头和Lama索引。
所以我不会显示那个步骤,对你来说,第一步将是设置OpenAI API密钥,OpenAI密钥用于三叉戟的完成步骤,并使用真正的镜头实施评估,所以,这里有一个代码片段,它正好这样做。
我们现在已经设置好了OpenAI密钥,下一个部分,我将快速回顾使用Lama Index Jerry的查询引擎构建,Jerry已经在第一课中走你走过了,在详细程度上,我们将主要建立在那个课程上,现在。
第一步是设置一个真正的对象,从真正的镜头,我们将导入真正的类,然后,我们将设置一个真正的对象,这个类的一个实例,然后,这个对象将被用于重置数据库,这个数据库将在后来的某个时候用于记录提示,响应。
Llama Index应用程序的中间结果,以及各种评估的结果,我们将使用真正的镜头,现在,让我们设置Lama Index读者,所以,这个代码片段从目录中读取这个PDF文档。
由Andrew Eng编写的关于如何在AI中建立职业生涯的文章,然后,将此数据加载到文档对象中。
下一步是将所有内容合并为一个大型文档,而不是每个页面都有一个文档,这是默认设置,接下来。
我们设置句子索引,利用Llama Index的一些工具,所以你可以看到这里,我们正在使用OpenAI GPT 3。5 Turbo,设置在零点温度,一个将被用于完成rag的llm。
嵌入模型被设置为bg small和版本一点五,并且所有内容都正在被句子索引对象索引。
接下来我们设置句子窗口引擎,这是后来将被使用的查询引擎,从高级rag应用中有效地进行检索。
现在我们已经为基于句子窗口的rag设置了查询引擎,让我们通过实际提问来看看效果。
你如何创建你的ai投资组合,这将返回一个包含最终从lla响应的全对象,检索的上下文片段,以及一些额外的元数据。
让我们来看看最终响应的样子。
所以这里你可以看到基于句子窗口拖动产生的最终响应,它表面上提供了一个对这个问题'如何创建你的ai投资组合'的相当好的回答,稍后,我们将看到如何将这种形式的答案与rag三叉戟进行比较。
以建立信心并识别rag这种形式的失败模式,现在,我们已经有一个看起来在表面上相当好对这个问题的响应的例子,我们将看到如何利用反馈函数,例如,使用三段式评估这种响应方式,同时识别失败模式。
并建立信心或迭代以改进llm应用。
现在我们已经设置了基于句子窗口的拖放应用,让我们看看如何使用三段式来评估它,在开始之前,我们将做一些清理工作。
第一步是这个代码片段,它让我们从笔记本内部启动流体面板,从笔记本内部查看仪表板,稍后你会看到,这将使用仪表板来查看评估结果的结果,并且进行实验,查看不同的应用选择,并查看哪个在下一个阶段表现更好。
我们初始化为默认提供者openai gpt three point five turbo,以进行我们的评估,这个提供者将被用于实现不同的反馈函数或评估,例如,上下文相关性,答案相关性和锚定性。
现在让我们深入探讨rag triad的每个评估,我们将在幻灯片和笔记本之间来回切换,以便给您提供完整的上下文。
首先,我们将讨论答案的相关性。
记住,答案的相关性是检查的,是否最终的响应与用户提出的查询相关,为了给您一个关于答案的相关性可能输出的具体例子。
这里是一个例子,用户提出了问题,如何利他主义在构建职业生涯中有益,这是来自申请材料的响应,并答案的相关性评估产生两个输出项,一个是在0到1的尺度上的得分,答案被评估为高度相关,因此它得到了0。9的分数。
第二部分是支持证据或理由,或者是产生这个评分的思考链,所以这里你可以看到,答案本身中找到的支持证据,这表明alammi评估认为它是有意义和相关的答案,我还想利用这个机会来介绍反馈函数的抽象。
答案相关性是反馈函数的一个具体例子,更一般地说,反馈函数提供了一个0到1的分数,在审查llm应用的输入、输出和中间结果后,让我们现在来看看反馈函数的结构。
使用答案相关性反馈函数作为具体例子,第一个组件是提供者,在这个情况下,我们可以看到,我们正在使用openai的llm来实施这些反馈函数,请注意,反馈函数不一定必须使用llm。
我们也可以使用bert模型和其他类型的机制来实施反馈函数,我会在后面的课堂上详细讨论这一点,第二个组件是利用那个提供者,我们将实现一个反馈函数,在这个情况下,那就是相关性反馈函数,我们给它一个名字。
一个人类可读的名字,将在我们的评估仪表板中显示,对于这个特定的反馈函数,我们运行它于用户输入,用户查询,并且它也接受输入,最终的输出或响应来自应用,所以,给定用户问题和rag的最终答案。
这个反馈函数将使用llm提供者,如openai gpt 3。5,来计算对问题的响应的相关性得分,此外,它还将提供支持证据或思考链的论证,以证明那个得分。
现在,让我们回到笔记本,看看代码的详细情况,现在,让我们看看如何在代码中定义问题答案相关性反馈函数。
现在,让我们看看如何从true和well定义问题答案相关性反馈函数在代码中,我们将导入反馈类,然后,我们设置问题答案相关性反馈函数的不同部分,我们已经在讨论中设置。
首先,我们有提供者,它是openai gpt 3。5,我们设置这个特定的反馈函数,其中,相关得分也将增强思考链论证,就像我在幻灯片中所示的,我们给这个反馈函数一个人类可理解的名字,我们叫它答案元素。
这将在仪表板中显示,使用户能够理解反馈函数正在设置的内容,然后,我们也将反馈函数赋予输入访问权,那就是提示,以及输出,在这个设置下,rag应用产生的最终响应是什么。
在笔记本的后面,我们将看到如何将这个反馈函数应用到一组记录上,获取与答案相关的评估分数,以及为那个特定答案提供链式思考理由,那是在评估中被判断为适当的分数。
接下来我们将深入探讨的下一个反馈函数是上下文相关性,记得上下文相关性是检查的,给定查询的检索过程有多好,我们将从向量数据库中查看每片检索的上下文,并评估这块上下文与所问问题的相关性如何。
让我们看一个简单的例子,用户提示中的问题在这里是,如何在职业生涯中受益于利他主义,这是检索到的两片上下文,在评估上下文相关性后,这些片检索的上下文 each 都会得到一个介于零和一的分数。
你可以在这里看到,左边的上下文获得了相关性得分为零点五,右边的上下文获得了相关性得分为零点七,因此,它被评估为与这个特定查询更相关,然后,平均上下文,相关性得分。
是这些检索的上下文片段相关性得分的平均值,也得到了报告,现在让我们看看反馈函数对于上下文相关性的结构,这个结构的各种部分与答案元素的结构相似,我们几分钟前就审查过了。
有一个提供者是open ai,并且反馈功能是利用那个提供者来实现上下文相关性反馈功能的,与这个特定反馈函数输入的不同之处在于,除了用户输入或提示之外,我们还将这个反馈函数分享,一个指向检索上下文的指针。
那就是在rag应用执行过程中的中间结果,我们为每个检索的上下文片段返回一个分数,评估这个上下文与被询问的查询的相关性或质量如何,然后,我们将这些分数聚合并平均所有检索的上下文片段,以获取最终分数。
你现在会发现,在答案相关性反馈函数中,我们只使用了原始输入,在这个反馈函数中,提示和rag的最终响应,我们正在使用用户输入或提示以及中间结果,检索上下文集,为了评估这两个例子之间的检索质量。
反馈函数的全部力量通过使用输入得以利用,通过评估rag的应用程序的输出和中间结果来评估其质量。
现在我们已经设置了上下文选择,我们有条件在代码中定义上下文相关性反馈函数,你会发现这基本上是我走过并解释的代码片段。
在幻灯片上,我们仍然在使用openai,作为提供者,Gpt三点五作为评估llm,我们正在调用问题陈述或上下文相关性反馈函数,它获取输入提示,一组检索到的上下文片段。
它对每个检索到的上下文片段运行评估函数,单独,为它们每个人获取一个得分,然后,将它们平均起来,以报告一个最终的聚合得分。现在,还有一个你可以使用的变体,如果你喜欢。
除了为每个检索的上下文报告相关的得分外,你还可以增强它以链式思考推理,这样,评估的llm不仅可以提供得分,还可以提供对其评估得分的论证或解释,这可以通过使用u s相关性和链式思考推理方法实现,推理方法。
如果我给你一个具体的例子,你可以在这里看到问题或用户提示,你可以看到,这是一个问题或用户提示,如何利他主义在构建职业生涯中受益。
这是检索到的上下文片段的一个例子,并从安德鲁关于这个话题的文章中删除一段,你可以看到上下文相关性反馈函数给出了一个得分为0。7,以0到1的尺度来评估这个检索到的上下文片段。
因为我们还在评估中引用了链式思考推理,它提供了这个得分为0。7的论证,现在让我为您展示设置上下文相关性反馈函数的代码片段,我们以与前一个反馈函数相同的方式启动它,利用llm提供者为评估,如果你记得。
这就是'打开'的意思,AI GPT 3。5。
然后,我们定义了基于的反馈函数,这个定义结构上非常类似于上下文相关性的定义。
基于的度量带有链式思考理由。
解释分数,就像我在幻灯片上讨论的那样,我们给它起了名字叫做基于的,这是很容易理解的。
并且它获得了RAG应用程序检索的上下文集的访问权,与上下文相关性和最终输出或回应的rag类似,然后,最终回应中的每一句都得到一个基于分数的锚定,这些被聚合平均,以产生对完整回应的最终锚定测试分数。
在这里的语境选择,是与设置语境相关性反馈函数时使用的相同语境选择。
如果你记得,仅仅从rag的检索步骤中获取一组检索到的上下文片段,然后可以访问该列表中的每个节点,从该节点中恢复上下文的文本,然后继续处理那个,同时进行上下文相关性和锚定性评估。
我们现在已经准备好开始执行拉格应用评估。
我们已经设置了所有三个反馈函数,答案相关性,上下文相关性和锚定性,我们所需的只是一个可以进行应用和评价的评估集,并查看它们的表现,并如果存在迭代和进一步改进的机会,让我们现在来看看评估和迭代的工作流程。
以改进llm应用,我们将从之前课程中引入的基本拉格 llama index 开始,我们已经已经使用真镜头拉格三叉戟对其进行了评估。
我们将稍微关注与上下文大小相关的失败模式,然后,我们将迭代这个基本拉格使用高级拖放技术,下一个是 llama index 句子窗口拉格,我们将重新评估这个新的先进拖放与真镜头拉格三叉戟,专注于这些问题。
我们是否在特定上下文中看到改进。
其他指标如何,我们专注于上下文相关性,是因为常常会出现失败模式,因为上下文太小,一旦你增加到某个点,你可能看到上下文相关性的改进,此外,当上下文相关性提高时,我们常常发现锚定性也有所提高。
因为在完成步骤中,llm有足够的相关上下文来产生总结,如果没有足够的相关上下文,它倾向于利用其内部知识从预训练数据集中,来尝试填补这些空白,这导致锚定性的丧失,最后,我们将尝试不同窗口大小。
以找出哪种窗口大小产生最佳评估指标,记住,如果窗口大小太小,可能没有足够的相关上下文来获得好的上下文相关性和锚定性得分,如果窗口大小变得太大,另一方面,不相关的上下文可能会渗入最终响应。
导致在锚定性或答案元素方面的不高分。
我们已经走过了三个评估或反馈函数的例子,上下文相关性和相关性与锚定性在我们的笔记本中,所有 three 都是使用 llm 评估实现的,我想指出,反馈函数可以以不同的方式实现。
我们常常看到实践者从真实事件开始,这可能是昂贵的来收集,但仍然是一个良好的起点,我们还看到人们利用人类来做评估,这也是有帮助和有意义的,但在实践中,真实事件难以扩展,只是为了给你一个具体的例子。
想象一个摘要用例,当有大段文本时,然后llm生成一个摘要,人类专家将给这个摘要打分,指示其质量如何,这也可以用于其他用例,如聊天机器人或甚至分类用例,人类的恶行在某些方面与事实类似。
就像当llm产生输出时,或应用产生输出时,那个应用的人类用户将对那个输出进行评分,它多好,与真实事件相比,这是因为,这些人类用户可能不像产生精心编辑的真实事件的那些人那样专家,在主题上,尽管如此。
这是一个非常有意义的评估,它将比真实值规模更大,但我们对它的信心程度较低,从研究文献中得出的一个非常有趣的结果是,如果你问一组人类对一个问题进行评分,大约有八十 percent 的协议,有趣的是。
当你使用 for 评估时,法律评估与人类评估之间的协议也大约是八十二十,五 percent 标记,因此,这表明 llm 评估与人类评估相当,对于它们已被应用的基准数据集。
所以反馈函数为我们提供了一种程序化方式,以便扩大评估。
除了您看到的 lm 阀,反馈函数还提供,我们可以实现传统的自然语言处理指标,如Rouche分数和Blue分数。
它们在某些情况下可能会有所帮助,但它们有一个弱点,那就是它们非常语法化,它们寻找两个文本片段中单词的重叠。
例如,如果你有一个倾向于河岸的文本片段,而另一个倾向于金融银行,从语法上看,它们可能会被视为相似,这些引用可能会被传统自然语言处理评估视为相似的引用,而,周围的上下文将被用于提供更有意义的评估。
当你在使用像gpt这样的大规模语言模型时,四,或者是像bird模型这样的中型语言模型时,并且要进行你的评估时。
在本课程中我们已经给了你三个反馈函数和评价的例子,不相关性,上下文,相关性和基于上下文的真实性,真实的镜头提供了一个更广泛的评价集,以确保你构建的应用程序诚实。
无害且有益,所有这些都在开源库中可用,我们鼓励你尝试它们,在你完成课程并构建你的llm应用程序时。
现在我们已经设置了所有反馈功能,我们可以设置一个对象来开始记录。
它将用于记录在各种记录上的应用程序执行。
在这里,我们可以看到正在导入这个真lama类,创建了这个真recorder对象,这个真lama类的对象,这是我们的真lens与lama index的集成。
它接受了我们从lama index earlier创建的句子窗口引擎,设置应用程序ID,并使用我们 earlier 创造的 rag triad 的三个反馈函数。
这个真recorder对象将在稍后用于运行lama index应用程序,以及这些反馈函数的评估,并将所有记录保存在本地数据库中。
现在让我们在这个设置中加载一些评估问题,评估问题已经在这个文本文件中设置好了,然后我们只需执行这个代码片段来加载它们。
让我们快速看一下我们将用于评价的这些问题。
可以看到构建人工智能职业生涯的关键是什么等,这个文件,你可以自己编辑并添加你可能想要得到答案的问题,Andrew,你也可以直接向问题列表添加问题,让我们看看val questions列表。
你可以看到这个问题已经被添加到末尾,去添加你自己的问题,现在,我们已准备好进入这个笔记本中最激动人心的一步,用这个代码片段,我们可以在每个问题上执行句子窗口引擎,我们在刚刚看过的eval问题列表中。
然后使用真recorder,我们将每个记录与rag triad进行比较,我们将记录提示,响应,中间结果和评估结果在真数据库中。
你可以在这里看到,每当。
对于每个记录的步骤执行完成时,都有一个对于记录的哈希,未知,当记录被添加时,这里有一个指示,表明那个步骤执行有效,此外,答案相关性的反馈已经完成,等等,对于上下文相关性等等,现在,我们完成了记录。
我们可以在笔记本中查看日志,通过执行,通过获取记录和反馈,并且执行这段代码。
片段,我并不希望你一定要阅读这里所有的信息。
我想强调的主要点是,你可以看到应用程序的深度仪器化。
大量的信息通过真记录器被日志。
以及关于提示响应的信息。
评估结果和其他信息可以帮助识别应用程序的失败模式,并且用于应用程序迭代和改进的信息。
所有这些信息都是可灵活的json格式。
所以它们可以被导出并消费由下游过程后续处理。
让我们来看看一些更人性化的提示格式,包含此代码的响应和反馈函数评估。
你可以看到,对于每个输入,提示或问题,我们看到输出和他们在各自上下文中的相关性得分,基于的事实性和答案的相关性。
并且对于列表中的每个问题,都会对其进行这样的评估。
下划线问题。
点文本,你可以在这里看到,最后一个问题是,我怎么能在,'Ai'是我在列表末尾手动添加的问题。
在运行评估时,你可能会看到一个nan,这可能是因为API调用失败的结果。
你需要重新运行它,以确保执行成功完成。
我刚刚向你展示了评估的记录级视图,提示,回答和评估,现在,让我们在领导者板上获取聚合视图。
这聚合了所有这些个记录,并产生了该数据库中十个记录的平均得分,所以你可以在领导者板上看到,对所有十个记录的聚合视图,我们曾经说过id到f one,平均上下文相关性是零点五六,同样。
他们的平均得分对于扎根性和相关性和延迟,在所有被问到拉格应用的十个记录中,然后成本是这些十个记录的总成本,以美元计,获取这个聚合视图很有用,以便看到您的应用程序的性能如何。
以及延迟和成本的水平,除了笔记本界面之外,True lens 还提供了一个本地流线图应用仪表板,通过它可以查看您正在构建的应用程序,查看评估结果,深入到记录级别。
视图以获取应用程序性能的聚合和详细评估视图。
因此,我们可以使用真女儿的仪表板方法启动仪表板,这设置在一个特定URL的本地数据库,现在,一旦我点击这个,这可能会在一些窗口中显示。
这不是在这个框架内的,让我们花几分钟时间来浏览这个仪表板,你可以在这里看到,应用程序性能的总体视图,应用程序已处理并评估了11条记录,平均延迟为3。555秒,我们有总成本,被LLAMPS处理的总令牌数。
然后,对于上下文相关性的RAG三元组,我们有得分,接地性得分为0。56,答案相关性得分为0。86,上下文相关性得分为0。92,我们可以在这里选择应用程序,以获取更详细的记录级别视图。
对于每个记录,你可以看到用户输入。
提示,响应,这些元数据,时间戳。
然后,对于答案相关性、上下文相关性和接地性的得分,已经被记录下来,还包括延迟,总令牌数,和总成本,让我为包含LLM指示评估的行选择一行,指示说嗯,DEM。
RAG应用程序做得很好,让我们点击箭头后选择这一行。
我们可以向下滚动,并从表中获取该行的不同组件的详细视图。
所以,这里的问题。
提示是成为AI好的第一步是什么,RAG的最终响应是学习基础的技术技能,在这里,你可以看到答案相关性被视为1,在0到1的尺度上。
这是一个相关的,非常不相关的答案,相对于所问的问题,在这里,你可以看到上下文相关性,平均上下文相关性得分为0。8,对于检索到的两个上下文部分,它们分别得到了0。8的分数,你可以看到思考链。
LM评估为什么给这个特定的响应得分为0。8,以及在检索步骤,然后,在这里,你可以看到接地性评估,这是最终答案的一个从句,嗯,它得到了1的分数,在这里,你可以看到得分的原因。
在检索步骤,然后是在这里,你可以看到接地性评估,这是最终答案的一个部分,嗯,它得到了1的分数,在这里,你可以看到得分的原因。
你可以看到,这是一句陈述句,支持证据证明了它,因此,它在0到1的评分尺度上获得了满分1分,或者在0到10的评分尺度上获得了满分10分,在0到10的评分尺度上。
所以,之前我们通过幻灯片讨论的那种推理和信息。
现在,你在笔记本中可以看到,非常整洁地体现在这个溪流中,本地应用程序,运行在你的机器上。
你也可以获得一个详细的时间线视图,以及获取到完整的JSON对象。
现在,让我们看一个例子,布条没有做得那么好,当我浏览评估时,我看到这一行有一个低的基础,得分为0。5分,所以,让我们点击那个,它会带来这个例子。
问题是,利他主义如何有益于构建职业生涯,回答是。
如果向下滚动到基础评估,然后,最终响应中的两句话都有低,圆整了得分,让我们选择其中一个,看看为什么基础得分低,所以你可以看到,整体响应被分解为四个陈述,并且前两个是好的。
但后两个没有在检索的语境片段中提供足够的支持证据,特别是如果你看看这个最后一个,Allam的最后输出说,此外,实践利他主义可以贡献到个人的满足感和目的感,这可以增强动力和整体福祉。
最终有益于职业生涯的成功,虽然这可能确实如此,在检索的语境片段中找不到支持证据,来支撑那个陈述,这就是为什么我们的评估给这个得分给了低分,你可以在仪表板上玩一玩,探索一些其他不太成功的例子。
比如a la,最后的布条输出,没有做得那么好,以了解一些非常常见的失败模式,当您使用rag应用程序时,一些这些将会在我们进入关于更先进rag技术的研讨会时得到解决。
这些技术在处理这些失败模式方面做得更好,第二课就结束在这里。
在下一课中,我们将走遍基于句子窗口的检索机制和先进的rag技术,并也将向您展示如何评估这个高级技术,利用rag三叉戟和真矛。
LangChain_微调ChatGPT提示词_RAG模型应用_agent_生成式AI - P22:4. 第三篇 - 句子窗口检索(Sentence Window Retrieval) 中英文字幕 - 吴恩达大模型 - BV1gLeueWE5N
在这节课中,我们将深入研究一种高级的拉格技术,我们的句子窗口检索方法。
在这种方法中,我们基于较小的句子进行检索,以更好地匹配相关上下文,然后,根据扩展的上下文窗口合成句子,让我们看看如何为某些上下文设置它,标准的拉格管道使用相同的文本干来同时进行嵌入和合成。
问题是,嵌入基础检索通常与较小的片段工作得很好,而llm需要更多的上下文和大的片段来合成一个好的答案,句子窗口检索做的就是稍微分离这两个。
我们首先对较小的片段或句子进行嵌入,并将其存储在向量数据库中,我们还为每个片段添加了前后出现的句子的上下文,在检索时,我们检索与问题最相关的句子,使用相似性搜索,然后,将句子替换为完整的周围上下文。
这允许我们扩大实际上被馈入概要的上下文,为了回答问题,这个笔记本将介绍构建一个使用单个索引的句子窗口检索器所需的各种组件,各种组件将在最后详细覆盖。
Anion将展示如何实验参数和评估与真实错误相关的性能,这是同样的设置,你在之前的课程中已经使用过,所以确保安装了相关的包,例如。
llama index和true lines email用于这个快速启动,你需要一个类似于之前许可证的开放ai密钥,这个开放ai密钥用于嵌入,嗯,Lens,以及评估部分。
现在我们设置并检查我们的文档,以便用于迭代和实验,类似第一课,我们鼓励你上传你自己的pdf文件,以及之前,我们将加载如何在人工智能中构建职业生涯的电子书。
它是之前的同一份文档,所以我们看到它是一份文档列表,共有四十一页,对象模式是文档对象,这里是从第一页的一些样本文本。
接下来的部分将将这些合并为一个文档,因为它有助于使用更先进的检索器时提高整体文本分割的准确性。
现在让我们设置句子窗口检索方法,我们将详细解释如何设置这个,我们将从窗口大小为三,top k值为六开始,首先,我们将导入我们称为句子窗口节点解析器的对象。
句子窗口节点解析器是一个对象,它将文档分成单独的句子,然后,为每个句子片段添加周围上下文的增强,这里我们演示如何节点解析器与一个小例子工作,我们看到我们的文本,它有三个句子,被分成了三个节点。
每个节点包含一个句子,包含一个包含更大句子周围上下文的元数据,我们将在这里展示第二个节点的元数据看什么样子,你看到这个元数据包含原始句子,但也包含在它前后出现的句子,我们鼓励你尝试自己的文本,例如。
让我们试试这样。
对于这个样本文本,让我们看看周围的元数据,对于第一个节点,由于窗口大小为三,我们有两个额外的相邻节点出现在前面,当然,嗯,在它后面没有,因为它是第一个节点,所以我们看到有原始句子或你好。
但也是fubar和ta,下一步实际上是构建索引,并且我们首先会做是设置一个lone,在这个情况下我们将使用open,嗯,具体来说。
Gpt t three five five turbo with the temperature zero dot one。
下一步是设置一个service contacts对象,哪个,作为提醒,是一个包含所有必要联系以用于索引的包装对象,包括l one嵌入模型和节点解析器。
请注意,我们指定的嵌入模型是bg small模型,我们实际上从hugging face下载并本地运行它,这是一个紧凑,快速且准确于其大小的嵌入模型,我们也可以使用其他嵌入模型,例如。
一个相关模型是bg large,我们在下面的注释代码中有这个模型,下一步是设置向量存储索引与源文档,因为我们已经定义了节点解析器作为服务上下文的一部分,这将做是它会取源文档。
将其转换为一系列附加了周围上下文的句子,并嵌入它,并加载到向量排序中,我们可以将索引保存到磁盘上,以便您可以后来加载它而不必重建它。
如果您已经构建了索引,保存了它,并且您不想重建它,这里有一个有用的代码块,允许您从现有的文件加载索引,如果存在,否则它将构建它,索引现在构建好了,下一步是设置并运行Android查询。
我们将定义我们称为元数据替换后处理器的东西,这取存储在元数据中的值,并替换节点的文本为该值。
因此,这是在获取笔记并发送笔记到大纲之前完成的,我们将首先解释这是如何工作的。
使用我们使用句子窗口节点解析器创建的节点,我们可以测试这个后处理器。
请注意,我们备份了原始节点,让我们再看一下第二个节点,太好了,让我们在这些节点上应用后处理器,如果我们现在查看第二个节点的文本,我们可以看到它已经被替换为一个完整的上下文。
包括在当前节点之前和之后的句子,下一步是添加句子变换重新排序模型,这取查询并检索节点,并按相关性重新排序节点,使用专门为任务设计的模型,一般来说,您将使初始相似度top k更大。
然后重新排序器将恢复节点并返回一个小的top end,所以过滤出一个较小的集,一个重新排序器的例子是bg reanker base,这是基于bg嵌入的重排序器。
这串字符串代表从hugging face命名的模型,您可以在hugging face上找到更多关于模型的详细信息,让我们看看这是如何重新排序的,我们将输入一些玩具数据。
然后看看重新排序器如何实际重新排序,原始节点到一个新的节点集,让我们假设原始查询是我想要一只狗,并且原始节点的得分是这是只猫,但得分是0。6,然后这是只狗,得分是0。4,直觉上。
您将期望第二个节点实际上有一个更高的得分,所以它与查询匹配得更好,这就是重新排序器可以发挥作用的地方,在这里我们看到重新排序器正确地浮出水面并已知关于狗的信息,并给它了一个高的相关性得分。
现在让我们将此应用于我们之前提到的实际查询。
我们要求的相似度top k大于top end值,我们选择了为重新排序器,以便给重新排序器一个公平的机会来浮出水面正确的信息,我们设置了top k为6和top end等于2。
这意味着我们首先获取最相似的6个片段,使用句子检索,然后我们过滤出使用句子重新排序器最相关的两个冠军。
现在,我们已经设置好了完整的查询引擎,让我们运行一个基本的示例,让我们对这个数据集提一个问题。
我们获取到关于在ai领域建立职业生涯的关键是什么,然后我们得到响应,我们看到最终的响应是,在ai领域建立职业生涯的关键是。
学习基础的技术技能,参与项目并找到实习机会。
现在,我们已经将句子窗口查询引擎设置好了,让我们把所有的东西都放在一起,我们将大量的代码放入这个笔记本细胞中,但是请注意,这与util y文件中的函数本质上是一样的。
我们有用于构建我们之前在这本笔记本中展示的句子窗口索引的功能,它包括由节点解析器使用句子的能力,从文档中提取句子并增强其周围上下文,它包含设置句子上下文或使用服务上下文对象的功能。
它还包括使用源文档和服务联系人设置向量排序索引的功能,包含行和击球模型,并且没有解析器,这个部分的实际内容是获取句子窗口查询引擎,我们展示了它包括获取句子窗口检索器。
使用元数据替换后处理器实际上替换节点为周围上下文,然后最后使用重排模块过滤出顶级结果。
我们使用as查询和模块将所有这些结合起来。
首先,让我们调用构建句子窗口索引函数,使用源文档,鹰,以及保存目录,然后,让我们调用第二个函数来获取查询和伟大的含义,你现在准备好尝试句子窗口检索了,在下一节关于棕榈的章节中。
我们将向您展示如何实际运行评估,使用句子窗口检索器,以便您可以评估结果,并实际上玩出参数,看看这对您引擎性能有何影响,在这些例子之后,我们鼓励你添加自己的问题,甚至找到属于自己的评估基准。
只是为了玩一玩,看看一切都如何工作,谢谢杰瑞,现在,你已经设置了句子窗口检索器,让我们看看如何用三段式评估它,并比较其性能与基本三段式,带有实验跟踪,现在,让我们看看如何评估和迭代于句子窗口大小参数。
为了在评估指标之间做出正确的权衡,应用程序的质量和运行应用和评价的成本,我们将逐渐增加句子窗口的大小,从第一个版本开始,使用船员镜头和破布三叉戟评估这些连续的应用版本,跟踪实验以选择最佳的句子窗口大小。
随着我们进行这个练习,我们将想要了解标记使用或成本的权衡,随着窗口大小的增加,标记使用和成本会增加,在许多情况下,上下文的相关性会同时增加,在开始增加窗口大小时,我们预期会提高上下文的相关性,因此。
也会间接提高锚定性,那个的原因之一是当检索步骤没有产生足够的相关上下文时,在完成步骤中的llm倾向于通过利用预训练阶段的,现有知识来填补这些空白,而不是明确依赖于检索到的上下文片段。
这种选择可能会导致更低的接地分数,因为回忆,接地性意味着最终响应的组件应该可以追溯到检索到的上下文片段,因此,我们期待的是,随着您不断增大句子窗口大小,上下文的相关性会增加到某个点,接地性也会增加。
然后,从那一点之外,我们将看到上下文的相关性是增减不一的,扎根性也很可能遵循类似的模式,此外,上下文相关性和扎根性之间还存在一个非常有趣的关系,你可以在实践中看到,当上下文相关性低时,扎根性也往往较低。
这是因为,因为llm通常会尝试填充检索到的上下文片段中的缺口,通过利用预训练阶段的知识,这导致了扎根性的减少,即使答案实际上在语境相关性增加时变得相当相关,基础性也倾向于在某个点上增加。
但如果上下文大小变得太大,即使上下文相关性很高,可能出现基础性的降低,因为llm可能会被过大的上下文所淹没,并回归到训练阶段的预存知识库。
现在让我们尝试句子窗口的大小,我会带你通过一个笔记本来加载一些问题进行评估,然后逐渐增加句子窗口大小,并观察这对该rag的影响,首先,评估三叉戟指标。
我们加载一套预先生成的评估问题,在这里,你可以看到一些这些问题,从这份列表中,接下来,我们运行评估,对于预加载的评估问题集合中的每个问题,然后,使用真正的记录器对象,我们记录提示,响应,应用的中间结果。
以及真数据库中的评估结果,现在让我们调整句子窗口大小参数,看看那个的影响,对不同的三角形评估指标,我们将首先重置真数据库,使用这段代码片段,我们将句子窗口大小设置为一,你会发现在这条指令中。
所有其他的一切都与以前相同,然后,我们使用获取句子窗口查询引擎设置句子窗口引擎,与这个索引相关联,接下来,我们已准备好以句子窗口大小设置为一的方式设置真正的记录器。
这设置了拉格三重奏的所有反馈函数定义,包括答案相关性,上下文相关性和锚定性,现在,我们已经一切就绪,可以运行评估,对于设置,以句子窗口大小设置为一,和所有相关的提示,响应,中间结果。
并且这些反馈函数的评估结果,我们将登录到真实数据库,哦,K,现在运行得非常好,让我们在仪表板上查看它,你将看到,这个指令启动了一个本地托管的流let应用,并且你可以点击。
链接来到达修剪它,所以,应用排行榜展示了我们通过二十一个记录运行的所有聚合指标,并使用真实长矛进行了评估,这里的平均延迟是4。5秒,7秒,总成本大约是两分钱,处理总token的数量大约是9,000个。
你可以看到评估指标,应用在无关性和扎根性方面表现良好,但在上下文相关性方面,它表现较差,现在,让我们深入探讨由应用程序处理的个别记录。
评估,如果我滚动到右侧,我可以看到一些例子,在这些指标上,应用程序表现不佳,所以让我选择这行。
然后,我们可以。
更深入地检查它对他的影响。
所以,这里的问题是在项目选择和执行的背景下。
解释准备就绪和准备、发射、瞄准的方法之间的差异。
提供每个方法可能更有益的例子,"你可以在这里详细看到从布条中收集到的整体反应"。
"然后如果我们往下滚动","我们可以看到接地性的总分"。
"上下文相关性和答案相关性"。
"在这个例子中,检索到了两段上下文","并且对于检索的上下文的一部分","上下文相关性相当低","让我们深入探讨那个例子,仔细看看","在这里,通过这个例子,你将看到上下文的部分非常小。",记住。
我们正在使用一个句子窗口的大小为一,这意味着我们在开始和结束时各添加了一句额外的句子,在检索的上下文周围,这将产生一个相对较小的缺失重要信息的上下文片段,这将使其与被问的问题相似相关,如果你看接地性。
你会看到这两个检索到的上下文片段都在最终总结中,接地的,得分相当低,让我们选择得分更高的接地性得分,它有更多的理由,如果我们看看这个例子。
在这里,我们看到在开始有一些句子,对于这些句子,检索到的上下文中有很好的支持证据,因此这里的得分很高,它是在0到10的尺度上的10分,但对于这些句子在这里,没有支持证据,因此接地性得分是0。
让我们拿一个具体的例子,也许这个,我认为它经常在执行成本相对较低的情况下使用,并且快速迭代和适应的能力比前期规划更重要,这感觉像是一个可能的文本,这可能作为对问题的响应的一部分有用。
然而它不在检索到的上下文中,所以它不是由检索到的上下文支持的任何证据,这可能是模型在训练阶段学到的一部分,要么是从同一文档,安德鲁在这里的职业建议文档,或者是关于AI职业建议的其他来源,讨论同样的主题。
模型可能学到了类似的信息,但它不是基于那个的,句子不是由检索到的上下文支持的,在这个特定情况下,所以这是一个普遍问题,并且句子窗口太小,上下文相关性往往较低,因此,接地性也变得缓慢。
因为LLM开始使用其训练阶段的预存知识,来开始回答问题,而不是仅仅依赖提供的上下文,现在我已经展示了一个失败模式,当句子窗口设置为1时。
我想走通几个步骤,看看指标如何改善,随着我们改变句子窗口大小,以快速浏览笔记本,我将重新加载评估问题,但在这种情况下,只设置一个问题,模型有问题的问题,这个问题,我们刚刚用句子窗口大小设置为1时走过。
这个问题,我们刚刚讨论过,然后,我想将这个与句子窗口大小为的句子一起运行,他说两个、三个Discord片段将要。
设置句子窗口大小为的rag,设置三个,并且也设置真记录器,我们现在已经设置了反馈函数的定义,除了句子窗口大小设置为三的rag之外。
接下来,我们将使用那个井来运行评估,对于我们详细审查的特定评估问题,使用句子窗口大小为一,在那里,我们观察到成功运行的失败模式。
现在,让我们看看这个句子窗口引擎的结果,设置为三,在真镜头仪表板中,你可以在这里看到结果,我在一个记录上运行它,那是有问题的记录,当我们看句子窗口大小为一时,你可以看到上下文的相关性大大增加。
它从零点五七增加到零点九现在,如果我选择应用程序并查看这个例子。
在更详细的情况下,现在,我们来看看与句子窗口大小为一时我们查看的同一个问题。
现在,我们处于三。
这里是完整的最终响应现在,如果你看检索到的上下文片段。
你会注意到,这个特定的检索上下文与早期我们写的上下文相似。
但现在它有了扩展,因为更大的句子窗口大小,如果你看这个部分的得分。
我们将看到,这个上下文获得了一个上下文相关性得分为零点九,这比早期获得分数为零点八的较小上下文更高,这个例子表明,随着句子窗口大小的扩大,即使是相对良好的检索上下文也可以变得更好。
一旦完成这些显著改进的上下文部分,接地得分会上升很多,我们看到,通过在这些高度相关的上下文中找到支持证据,接地得分实际上上升到一,因此,将句子窗口大小从一增加到三,导致了rag三叉戟评估指标的显著改进。
接地性和上下文相关性都显著提高。
以及答案相关性。
现在,我们可以看句子窗口设置为五。
如果你看这里的指标,有几件事需要注意,一个是总标记数增加了,这可能会对成本产生影响,如果我们增加记录的数量,这就是我之前提到的一种权衡,随着句子窗口大小的增加,它变得更加昂贵,因为更多的标记被处理,嗯。
在评估期间,由LMS处理,另一个值得注意的事情是,尽管上下文相关性和答案无关性保持不变,扎根性实际上随着句子窗口大小的增加而下降,这可能发生在某个点之后,因为随着上下文大小的增加。
LLM在完成步骤中可能会被过多的信息所淹没,在摘要过程中,它可能会开始引入自己已有的知识,而不是仅在检索到的上下文片段中的信息,所以,让我们在这里总结一下,结果,当我们从一句增加到三句,再到五句时。
三句,对于我们特定的评估来说,三句的大小是最佳选择,我们看到上下文相关性和答案相关性,以及扎根性的增加,当我们从一句增加到三句时,然后,在增加到五句时,扎根性步骤可能会有所减少或退化。
当你在笔记本中尝试时,增加到五句的大小,我们鼓励你使用更多的记录重新运行它,在这两步中,检查个别记录,哪些对特定指标如上下文相关性或扎根性造成问题,并获取一些直觉,建立一些直觉,了解失败模式的原因。
并知道如何解决它们,在下一节中,我们将看另一个高级拖放技术,自动合并,以解决一些失败模式。
不相关的上下文可能会渗入最终响应,导致,嗯,不。
LangChain_微调ChatGPT提示词_RAG模型应用_agent_生成式AI - P23:5. 第四篇 - 自动合并检索(Auto-merging Retrieval) 中英文字幕 - 吴恩达大模型 - BV1gLeueWE5N
在这节课中,我们将深入研究另一个高级拉格技术,自动重排。
原始方法的问题,是你正在检索一堆碎片化的上下文块,以便将其放入lm上下文菜单中,碎片化更严重,在这里,如果你的块大小越小,我们使用自动合并启发式将较小的块合并为大的父块,以帮助确保上下文的连贯性。
让我们看看如何设置它,在这个部分,我们将讨论自动合并和检索,标准拉格管道的问题,是你正在检索一堆碎片化的上下文块,以便将其放入lm上下文窗口中,并且碎片化更严重,你的父块大小越小,例如。
你可能会返回两个或更多的检索父块,大致相同的部分,但实际上对这些块的顺序没有保证,这可能会阻碍专辑对这一检索上下文的合成能力,在它的上下文窗口中。
所以,自动合并检索做的事情是首先,找到连接更大父块的较小块层次,在检索时,每个父块可以有一些子块,如果连接到一个父块的较小块集超过了某个百分比阈值,那么我们将较小的块合并为大的父块,因此。
我们检索更大的父块来帮助确保更连贯的上下文,现在让我们看看如何设置它。
这个笔记本将介绍构建自动检索所需的各种组件,与llama索引一起,各个组件将详细覆盖,类似于之前的部分,最后,Monohan将展示如何实验参数和评估与真实错误相关的性能,类似于之前。
我们将加载openai api密钥,我们将使用我们utifile中的便利辅助函数来加载它。
与之前的课程类似,我们还将使用如何构建人工智能职业生涯的pdf,与之前类似,我们鼓励您尝试自己的文件。
我们加载四个文档对象,并将它们合并为一个大型文档,这使得我们更适应于文本,与我们的高级检索方法混合。
我们现在准备好设置我们的自动合并重排器,这将包括几个不同的部分,第一步是定义我们称为层次节点解析器的东西,为了使用自动合并检索器,我们需要按照层次化的方式解析我们的节点。
这意味着节点被解析并按减小的尺寸排序,并包含对其父节点关系的引用,在这里,我们将演示节点解析器如何与一个小例子一起工作。
我们创建了一个玩具解析器,使用小块大小来演示,请注意,我们使用的块大小是二,四,八,五,十二,和一二八,你可以更改树干大小为任何你喜欢的递减顺序,我们以四倍因子来做这件事,现在让我们从文档中获取音符集。
这实际上返回所有有关节点,这返回所有叶节点,中间节点,以及父节点,有,所以,叶节点、中间节点和父节点之间将有相当程度的信息内容和重叠,中间和父节点,如果我们只想检索叶子节点。
我们可以在lama索引中调用一个函数,称为间隙叶子节点,我们可以看看那看起来什么样子。
在这个例子中,我们在原始节点的集合中调用叶子节点,我们查看第三十一个节点以查看文本,我们看到文本主干实际上相当小,这是一个叶子节点的例子,因为叶子节点是最小的一块大小为一百二十八个标记。
这就是你如何增强数学背景的方法,为了找出你需要知道的重要内容,现在我们已经展示了叶节点的样子,我们也可以探索世界之间的关系,我们可以打印出上述节点的父节点,并观察到它是包含叶节点文本的更大部分。
但也更更具体地,父节点包含512个标记,而具有包含128个标记的4个叶节点。
有4个叶节点,因为每次树干大小都被一个因子四分开,这是第三十一叶节点的父节点看起来的样子,现在我们已经展示了节点的层次结构,我们现在可以构建我们的索引,我们将使用openai lone。
特别是gpt t three point five turbo,我们还将定义一个包含l one嵌入模型的服务上下文对象,以及层次化节点解析器,与前面的笔记本一样,我们将使用bg small和嵌入模型。
下一步是构建我们的索引,"索引的工作方式是,我们实际上在叶子节点上构建一个向量索引"。"所有其他中间节点和父节点都被存储在启动坞中","并在检索时动态地检索","但实际上。
我们在最初的顶部抓取的是什么","K嵌入查找特指叶节点","这就是我们在这个代码中定义的存储联系人对象的嵌入方式。"。
"默认情况下,它被初始化为内存文档存储","我们称存储联系人为码头存储点"。"向内存文档存储中添加文档,以添加所有这个存储的所有节点",然而,当我们在这里创建我们的向量存储索引,叫做自动合并索引时。
我们只传递向量索引的叶节点,这意味着特别是叶节点使用嵌入模型嵌入,并且也进行了索引,但我们也传递了存储上下文以及服务上下文,因此,向量索引知道包含所有节点的底层存储。
最后,我们持久化这个索引,如果你已经构建了这个索引,并且想要从存储中加载它,你可以只是复制和粘贴这段代码,这将重建索引。
如果它不存在,就从存储中加载它,最后一步,现在我们已经定义了自动合并索引,是设置检索器和运行查询引擎,自动合并检索器控制着涌现的逻辑,如果给定父母的子节点被大多数检索出来,它们将被替换为父母,相反。
为了使这种合并工作良好,我们为叶节点设置了一个大的top k,并记住叶节点也有一个较小的块大小为一二八,为了减少标记使用,在合并完成后,我们应用一个重新排序器,例如,我们可能会检索前十二个合并。
并将结果限制为前十个,然后重新排序为前六个,重新排序器的顶部可能看起来更大,但请记住,基础的块大小只有一百二十八个标记。
然后,位于那个之上的下一个父级是五百十二个标记,我们导入了一个名为自动版本检索的类,然后,我们定义了一个句子变换重新排序模块,我们将自动合并检索器和重写模块结合在一起,集成到我们的检索查询引擎中。
它处理检索和合成。
现在,我们已经设置好了所有这些,并且要添加,让我们实际测试网络和AI的重要性,例如问题,我们得到了一个响应。
我们看到它说网络在AI中很重要,因为它允许个人有一个强大的专业网络,下一步是把所有的都放在一起。
"我们将创建两个高级函数,用于自动合并索引。","除了那个自动合并查询引擎之外","这基本上捕获了我们刚刚向你展示的所有步骤","并首先构建自动合并索引的功能"。
"我们将使用层次节点解析器来解析出子节点的层次结构。","向父节点","将挑战服务环境","我们将从叶节点创建向量存储的索引","但也链接到所有节点的文档存储"。
"第二个功能自动合并查询引擎利用我们的自动合并检索器",能够动态地将叶子节点合并到父节点中,并且使用我们的排名模块,然后将其与整体重试查询引擎结合,因此,我们使用构建自动合并索引函数来构建索引。
使用原始来源股票比特,lm设置为大于等于3。5涡轮。
以及合并索引作为保存目录,然后对于查询引擎,我们调用基于索引的获取自动查询引擎,以及我们设置相似度top k等于6,下一步,pop将展示如何评估自动合并检索器,并且迭代参数使用tri。
我们鼓励你也尝试自己提出问题,并且迭代自动合并或检索的参数,例如,当你改变主干大小时发生什么,或者top k或top end对于重新排序,玩一玩,看看结果是什么,杰里,真的很棒。
现在,你已经设置了自动合并检索器,让我们看看如何用拉格三角来评估它,并与基本拉格进行实验跟踪的比较,让我们设置这个自动合并的新索引,你会注意到它有两层,最底层的块,叶节点将具有512块的大小。
在层次结构中的上一层是2488块的大小,这意味着每个父节点将有四个512标记的叶节点,设置这个的其他部分与杰里 earlier 向你展示的完全相同,你可能想要尝试两层或新兴结构的一个原因,是它更简单。
创建索引所需的工作更少,以及在检索步骤中,工作量需要的更少,因为如果第三层检查性能相似,它就可以消失,然后理想情况下,我们希望与一个更简单的结构工作,现在,我们已经使用两层或合并结构创建了索引。
让我们为这个设置设置自动合并引擎,我保持顶部k的值与以前相同,这是十二,并且重新排序步骤也将有相同的,一个相等的六,这将让我们能够更直接地比较这个应用设置,并且杰瑞之前设置的三层合并层次应用。
现在让我们使用自动合并引擎设置真正的记录器,我们将给这个应用一个想法,即应用零。
现在让我们加载一些评估问题,我们从之前设置的生成问题点文本文件中加载,现在我们可以为每个问题定义这些评估问题的运行,在大约问题中,我们将设置一些事情,以便真正的记录器对象。
当使用rannie alls调用时,我们将记录提示,响应和评估结果,利用查询引擎。
现在,我们的评估已经完成,让我们看一下排行榜。
我们可以在这里看到应用零的指标,上下文相关性似乎较慢,其他两个指标更好,这是用我们的两级层次,以512作为叶节点块大小,并且父节点为2048个标记,所以对于叶节点无错误标记。
现在我们可以运行真正的仪表板,并查看,记录级别的评估结果在细节层次下一层。
让我们查看应用排行榜。
在这里,处理24个记录后,聚合级别的上下文相关性非常低,尽管应用在无关性和锚定性方面做得更好,我可以选择应用。
现在让我们看应用零的个别记录,并查看各种记录的评估得分,你可以在这里滚动到右侧并查看答案相关性、上下文相关性和锚定性的得分,让我们选择上下文相关性低的记录,所以这里有一个,如果你点击它。
你会看到更详细的视图,问题下方讨论的详细信息是。
预算对资源管理的重要性,在这里是成功执行ai项目的响应。
如果你往下滚动,你可以看到上下文相关性的更详细视图。
有六篇检索上下文。
每个都被评分为在评估得分中特别低,介于零和0。2之间,如果你选择任何一项并点击它,你会看到对提出的问题不特别相关的响应,你也可以向上滚动并探索一些其他记录,你可以选择,例如,得分好的分数。
你可以向上滚动并探索一些其他记录,你可以选择,例如,得分高的分数,像这样一个,探索一下'如何'这个应用。
在各个问题上的表现如何。
以及它的优势在哪里,它的失败模式在哪里,以便建立一些关于什么在起作用的直觉。
以及什么不在起作用,现在让我们比较之前的应用与杰里 earlier 引入的秋季合并设置。
我们现在将在层次结构中添有三层,从叶节点的级别开始,以一到八个标记符,所以,在每个层次中,每个父母有四个孩子,现在让我们为这个应用设置查询引擎,设置,真正的记录者,与前一个应用相同的所有步骤。
最后,我们处于运行评估的位置。
现在我们有一个设置好了。
我们可以在这里快速查看排行榜,你可以看到相对于f零,应用一在记录数相同的情况下处理的标记数大约是一半,而且总成本也大约是一半,这是因为记住这有三层在层次结构中。
而且块大小是一百二十八个标记而不是五百十二,这是ab零的最小叶节点标记大小,所以这导致了成本降低通知,而且上下文相关性增加了大约百分之二十,部分原因是这是因为,这个。
很可能在这个新的app设置中做得更好,我们还可以深入挖掘并详细查看app一。
像以前,我们可以查看单个记录,让我们选择之前看过的同一个,零号标签是关于预算重要性的问题。
现在,你可以看到上下文相关性做得更好,扎根性也显著提高,如果你在这里选择一个样本示例响应,你会发现实际上它正在非常具体地谈论为资源预算,所以,这种情况有所改善,而且在总体水平上也有改善,现在。
我将总结一些关键要点,来自第四课,我们带领你通过了一种评估和迭代与自动检索的方法,高级拉格技术,特别是我们展示了如何与不同层次的结构迭代,层次的数量,子节点的数量和块大小,对于这些不同版本,你可以。
你可以用拉格来评估它们,通过三角和跟踪实验来选择最适合您用例的结构,需要注意的是,你不仅会得到与三段式相关的指标作为评估的一部分,而且对记录级别的深入分析。
可以帮助你获得关于与某些文档类型最兼容的超参数有什么样的直觉,例如,根据文档的性质,如雇佣合同与发票,你可能发现不同的分块大小和层次结构,最适合,最后,还要注意的是自动合并与句子窗口检索是互补的。
一种思考方式是,假设你有一个具有自动合并的父节点的四个子节点,你可能发现,孩子编号一和孩子编号四对于查询非常相关,被问到的那个,然后这些就会被合并在自动合并范式下,相比之下。
句子窗口化可能不会导致这种合并,因为它们不在文本的连续部分中,这就结束了第四课,我们观察到,使用高级架子技术如句子窗口化和自动合并等,检索,增强评价和实验跟踪迭代的力量,你可以显著提高你的拉格应用。
此外。
尽管课程主要专注于这些两种技术和与之相关的拖拽三角进行评估,你还可以玩一些其他的评估,为了确保你的llm应用诚实,无害且健康,这一页列出了一些在真镜头中可用的一些,我们鼓励你去玩真镜头,探索笔记本。
LangChain_微调ChatGPT提示词_RAG模型应用_agent_生成式AI - P24:6. 终篇 - 结论(Conclusion) 中英文字幕 - 吴恩达大模型 - BV1gLeueWE5N
恭喜完成课程,希望学会如何构建,评估迭代Rag应用,使其更生产就绪,需学习这些核心开发原则,成为摇滚明星,AI工程师,构建强大LM软件系统,减少LLM幻觉将是每个开发者的首要任务,随领域发展。
我们很高兴看到贝叶斯模型越来越好,更大规模评估变得更便宜,更易获取,下一步,建议深入了解数据管道,检索策略和LLM提示以提高RAG性能,我们展示的两种技术只是冰山一角,应研究从块大小到检索技术的一切。
如混合搜索到基于行的,推理,如思维链,等,评估排名,从机架三元组开始,下一步是LLM应用,鼓励深入评估LLM,及其驱动的应用,包括评估模型置信度,校准,不确定性,可解释性,隐私,公平性和毒性。
在良性和对抗性环境中。
LangChain_微调ChatGPT提示词_RAG模型应用_agent_生成式AI - P25:《基于LangChain的大语言模型应用开发》1——介绍 - 吴恩达大模型 - BV1gLeueWE5N
欢迎参加这个关于大型语言模型语言链的短课程。
通过提示大型语言模型或大型语言模型来开发应用,现在比以往任何时候都更快地开发人工智能应用成为可能,但是,一个应用可能需要多次提示语言模型并解析输出,因此,需要编写大量的胶水代码。
哈里森·查塞创造的语言链极大地简化了这个开发过程,我很高兴有哈里森在这里,他是与深度学习一起合作创建了这个短课程的人,AI教我们如何使用这个惊人的工具,谢谢你们邀请我,我非常兴奋能来到这里。
长链最初是一个用于构建所有类型应用的开源框架,它起源于我与该领域的许多人的谈话,他们正在构建更复杂的应用,并看到了他们在开发过程中使用的一些共同抽象,我们对链链社区的采纳感到非常兴奋,因此。
期待在这里与大家分享它,并期待看到人们用它建造什么,是的,实际上,作为语言链动量的标志,它不仅有许多用户,而且还有数百的贡献者到开源中,这对其快速发展起到了关键作用,这个团队以惊人的速度发布代码和特性。
所以,希望短课程结束后,您将能够快速构建一些非常酷的应用程序使用链链,谁知道,也许您甚至决定贡献回开源的语言链努力,链链是一个用于构建LM应用的开源开发框架,我们有两个不同的包,一个Python的。
一个JavaScript的,它们专注于组合和模块化。
所以它有许多可以单独使用或与其他组件结合使用的个体组件,这就是一个关键价值主张。
然后,另一个关键价值主张是许多不同的使用案例,所以,将这些模块组件组合成更端到端的应用的各种方式,并在这个课程中使用它们非常容易。
我们将覆盖链链的常见组件。
所以我们会讨论模型,我们会讨论提示,这是您如何让模型做有用和有趣的事情的方式。
我们会讨论索引,这是数据摄入的方式。
以便您可以将其与模型结合,然后我们会讨论链,这是一种更端到端的使用案例,以及代理,这是一种非常令人兴奋的端到端使用案例,它使用模型作为推理引擎。
我们也感谢阿尼什·戈拉,他是与哈里森·查塞一起创立兰奇的联合创始人,也为这些材料投入了大量思考,帮助创建了这个短课程。
在深度学习和AI方面,杰夫,路德维希,埃德迪舒和迪亚拉作为院长,也对这些材料做出了贡献。
因此,让我们继续看下一个视频,在那里,我们将学习关于空白模型的内容。
LangChain_微调ChatGPT提示词_RAG模型应用_agent_生成式AI - P26:2——模型,提示和输出解析 - 吴恩达大模型 - BV1gLeueWE5N
在第一节课中。
我们将学习模型,提示和解析器,所以模型指的是语言模型,它支撑了其中的大部分,提示指的是创建输入的风格,这些输入将被传递给模型,然后解析器在相反的一端,它涉及到将这些模型的输出解析为更结构化的格式。
以便你可以在下游做 things,所以当你使用 lm 构建一个应用时,他们往往会使用可重用的模型,我们反复提示一个模型,解析输出,因此,启动提供了一种简单的抽象方式来执行这种操作,所以,让我们开始。
看一看模型的提示和暂停,所以,要开始。
这里有一些起始代码,我将导入os,import openai并加载我的openai秘密键,openai库已经安装在我的jupyter notebook环境中。
如果你在本地运行这个,并且还没有安装open ai。
你可能需要运行那个pip,安装open ai。
但我在这里不会去做那个,然后这里是一个助手函数,这实际上非常类似于你可能在聊天中看到的助手函数,Gpt prom工程为开发者,与我一起提供的课程是fulford。
因此,使用此助手函数,您可以说完成什么等于一加一。
这将调用try gpc,或技术上,模型gpt三点五涡轮以给您一个回答,现在像这样来激励线链。
模型提示和暂停的抽象。
假设你收到一封来自非英语客户的电子邮件。
嗯,为了确保这是可访问的,我将使用的其他语言是英语海盗语言。
当涉及到R时,我会大发脾气,那盖子飞开了,把我的厨房墙壁洒满了奶昔。
而且事情变得更糟,保修不覆盖清理厨房的成本。
我现在需要你的帮助,伙计,所以我们将让这個lm將文本翻译成美式英语。
以平静和尊重的语气,所以我将设置样式为美式英语,以常见和尊重的语气,因此,为了实际完成这个任务。
如果你以前见过一点提示,我将使用f字符串来指定提示,包含指示。
将三引号分隔的文本翻译成样式为style。
然后插入这两种风格,因此,这生成一个提示说。
翻译文本,等等。
我鼓励您暂停视频并运行代码,也尝试修改提示,看看是否能得到不同的结果。
你可以。
然后,嗯,提示大型语言模型获取响应。
让我们看看响应是什么,所以它将英语海盗的信息翻译成这种非常礼貌的。
我真的很沮丧,我的搅拌机盖子飞走了。
在厨房墙上造成了一团糟,所以,果汁,等等,我现在真的很需要你的帮助。
听起来非常友好的朋友,所以,如果你有不同的客户用不同的语言写评论。
不仅仅是英语海盗,但法语,德语。
日语等等,你可以想象需要生成一系列提示来生成这样的翻译。
让我们看看如何更方便地做到这一点,使用lang chain。
我将导入chat openai,这是lang cha对chat gpt api端点的抽象。
如果我然后说等于chat openai并看什么chat是。
它创建了这个对象如下,它使用chat gpt模型,也被称为gpt 3。5 turbo。
当我构建应用程序时,我会经常设置温度参数等于零。
所以默认温度是0。7,但我实际上重新做那个,温度,等于0。0,现在,温度被设置为0,以使其输出稍微不那么随机。
现在,让我定义模板字符串如下。
将文本翻译成风格,风格由三重动作定义,然后这里是文本。
为了重复使用此模板,我将导入lang chains,Chat prompt template。
然后,让我使用上面写的模板字符串创建提示模板。
从提示模板,实际上可以从中提取原始提示,它意识到这个提示有两个输入变量,风格和文本,在这里以括号显示。
并且这里是我们实际上指定的原始模板,也打印出来。
嗯,它意识到有两个输入变量。
风格和文本,现在,让我们指定风格,这是我想要客户消息翻译成的风格,所以我将称此为客户风格,这是我的先前客户电子邮件,现在这样。
如果我创建自定义消息,这将生成提示。
我们将将这个,在一分钟后传递给大型语言模型以获取响应,所以如果你想查看类型,自定义消息实际上是一个列表,嗯。
如果你看列表的第一个元素,这是大约您期望创建此消息时将生成的提示。
让我们将这个提示传递给lm。
所以我将调用聊天,我们之前说过,嗯,作为对openai gpt端点的参考。
如果我们打印出客户响应的内容,那么它将返回,嗯,这是从英语海盗翻译成礼貌的美国英语的文本,当然,你可以想象其他用例,其中客户电子邮件是其他语言。
这两个可以用于为英语翻译消息。
以理解和回复,我鼓励你暂停视频并运行代码,也尝试修改提示,看看能否得到不同的结果现在。
让我们希望我们的客户服务代表以原始语言回复了客户。
所以让我们说,英语说者,客户服务代表起身,说嗨那里,客户保修不涵盖您厨房清洁费用的费用,因为它是你滥用搅拌机的错误,通过叉子在盖子上,运气不好,再见,不是一个很礼貌的消息。
但让我们说这是客户服务代表想要的。
我们将指定,服务消息将被翻译成这个海盗风格,所以我们想要它以英语海盗的语气说,语气礼貌,因为我们之前创建了那个提示模板。
有趣的是,我们现在可以重用那个提示模板,并指定我们想要输出的是这个海盗服务风格,并且文本是这个服务回复,如果我们这样做。
这就是提示。
如果我们提示,嗯 chagpt t。
这就是它给我们返回的响应,我必须为你来,保修不覆盖费用或清洁你的厨房等。
运气不好,法老,热心肠,所以你可能会好奇。
我们为什么使用提示模板而不是,你知道,只是一个f字符串,答案是因为你在建立复杂的应用程序时,提示可以非常长且详细。
因此,提示模板是一种有用的抽象,可以帮助你重复使用好提示。
当你可以,嗯,这是一个相对较长的提示示例,为了评估在线学习应用程序中的学生提交。
像这样的问题可以非常长,在其中,你可以要求lm首先解决这个问题,然后,输出格式为某种格式,输出格式也为某种格式。
并将此包裹在lang chain中,提示使得重复使用这样的提示变得更加容易。
你也看到后来,语言链为某些常见操作提供了提示,例如,摘要或问题解答,或者连接到SQL数据库。
或者连接到不同的API,因此,通过使用一些内置在语言链中的提示,你可以快速得到一个应用程序工作,而不需要。
设计和构建自己的提示,语言链的提示库的另一个方面是它也支持输出解析,我们将在下一分钟讲到,但是,当你在使用llm构建复杂的应用时,你经常指示lm以特定的格式生成其输出,例如,使用特定的关键词。
左边的这个例子展示了如何使用llm执行被称为链式思考的事情,推理,使用被称为react框架的框架,但不用担心技术细节,但关键的是,想法是lm正在思考的,因为通过给lm留出思考的空间。
它往往可以得出更准确的结论,然后使用行动作为关键词来执行特定的行动,然后观察来显示从那个行动中学到的东西,就这样,如果你有一个提示,它指示lm使用这些特定的关键词,思考,行动和观察。
然后这个提示可以与一个解析器结合,来提取出被标记为这些特定关键词的文本,这样一起就给出了一个非常漂亮的抽象,来指定lm的输入,然后,也要有一个解析器正确地解释lm给出的输出,因此。
让我们回到看到使用lang chain的输出解析器的例子。
在这个例子中,让我们看看如何让您的lm输出为json,并使用line chain传递该输出。
为了运行我将使用的示例,将是从产品评论中提取信息并将该输出格式化为相邻格式。
所以,这里是您希望输出格式化的技术示例。
这是一个Python字典,其中表示产品是否为礼物,映射为false,它花费的天数,送货员是五,并且价格价值相当实惠,所以,这是一个想要的输出示例。
这里是一个客户评论。
以及一个尝试获取json输出的模板,所以,这是一个客户评论,它说睡眠模糊非常棒,它有四个设置,蜡烛吹风机,性别,微风,风城和龙卷风,两天后到达,正好赶上我妻子的生日礼物,我认为我的妻子非常喜欢。
到目前为止她都沉默了,我一直在使用它,等等,这里是根据以下文本的评论模板,从信息中提取,这是否是礼物,所以在这种情况下将是yes,因为这是礼物,嗯,而且也是送货天数,它花了多长时间送达,看起来。
在这种情况下它两天后到达,什么价格价值,你知道,在跳跃期间稍微贵一些,吹风机等。
所以,评论模板是lm要作为输入的,一个客户评论,并提取这三个字段,然后格式化输出为json,嗯,使用以下键。
好的,所以,这就是如何将此包装在lang chain中。
让我们导入聊天提示模板,我们实际上 earlier 就已经导入了这个,所以从技术上讲,这行代码是多余的,但我还是会再次导入它,然后从评论模板创建提示模板,放在顶部。
这就是提示模板。
现在,类似于我们 earlier 对提示模板的使用,让我们创建要传递给 open eye 的消息,嗯,终点,对待 open air 终点,调用那个端点,然后让我们打印出响应,我鼓励你暂停视频并运行代码。
这就是它,它说,如果为真,这是二,而且价格值看起来也很准确。
嗯,但请注意,如果我们检查类型。
响应中的这一部分,实际上这是一个字符串,所以它看起来像json,并且看起来像有键值对,但实际上它不是一个字典,这只是一个长长的字符串。
所以我真正想做的是去响应内容中获取键的值。
如果键,这应该是真的,但我运行这个,这应该生成一个错误,因为。
这实际上是一个字符串,这不是一个Python字典,所以让我们看看如何使用lang chains在解析器中。
为了做到这一点。
我将导入,响应schema和结构化输出解析器从lang chain,并且我将告诉它。
我想要暂停,通过指定这些响应schema。
所以礼物方案的名称是礼物,这里是描述:该物品购买用于为他人购买礼物。
回答真或是,假,如果不是如此未知。
等等,所以有一个好方案,配送一个方案价格值方案,然后让我们将这三个都放入一个列表如下。
现在我已经指定了这些启动的方案,实际上可以给您提示本身,通过拥有积极的输出,告诉你它想要你发送给lm的指令,所以如果我要打印格式指令,她对lm有非常精确的指令,这将导致它生成输出,输出解析器可以处理。
所以这里是一个新的评论模板。
并且评论模板包括lang chain生成的格式指令。
因此我们可以从评论模板中创建两个提示。
然后创建将传递到openai端点的消息。
如果你想,你可以查看实际的提示,这是给出提取保险丝的指令,如果交货日期,价格值,这里是文本,然后这里是格式化指令,最后,如果我们调用open ai端点,让我们看看我们得到的响应,现在是这个。
现在如果我们使用我们创建的输出解析器。
那么你可以 earlier 将此传递给一个输出字典。
按区域打印看起来像这样,请注意这是大写字母的字典。
不是字符串,这就是我为什么现在可以提取与键 gift 相关的值并得到 true,或与交付日期相关的值并得到 two。
或你也可以提取与价格值相关的值。
所以这是一种聪明的方法来处理你的 lm 输出。
并将其解析为 Python 字典。
以使输出在下游处理中更容易使用,我鼓励你暂停视频并运行代码,这就是关于模型的全部,使用这些工具进行提示和解析,希望你能够重用自己的自定义提示模板,很容易,与他人分享提示模板,与你合作的人。
甚至可以使用内置于提示模板的语言链,正如你刚刚看到的,这些通常可以与输出解析器结合使用,以便将输入提示以特定格式输出。
然后,解析器暂停该输出以将数据存储在Python字典中,或者一些其他数据结构,使它对下游处理更加方便。
我希望这在您许多应用中都有用处。
那么,让我们去看下一个视频,在那里,我们将看到如何利用lanking帮助您构建更好的聊天机器人,或者有一个lm,进行更有效的聊天。
LangChain_微调ChatGPT提示词_RAG模型应用_agent_生成式AI - P27:3——记忆 - 吴恩达大模型 - BV1gLeueWE5N
当你与这些模型交互,它们自然不会记得你之前说过什么或之前的对话,这是一个问题,当你构建像聊天机器人这样的应用程序时,你想与他们进行对话,因此,在这一节中我们将涵盖记忆。
基本上是如何记住对话的前一部分并将其输入语言模型,这样他们就可以在你与他们交互时有这种对话流程,是的,所以lang提供了多种复杂的选项来管理这些记忆,让我们深入了解一下,所以让我先导入我的API密钥。
然后让我导入一些我需要使用的工具。
让我们以管理聊天或聊天机器人的对话为例。
使用lag chain来管理。
所以要做这件事,我将将lm设置为openai的聊天接口。
温度等于0,并且我将使用记忆作为对话缓冲记忆。
稍后你会看到这是什么意思,嗯,然后我将再次构建对话链。
在这门短课程中,Harrison将更深入地探讨链和lag chain到底是什么,所以现在不要过于担心语法的细节,但这构建了一个llm,如果我开始对话,对话点预测,给定输入嗨。
我的名字是安德鲁,让我们看看它说什么 你好,很高兴见到你 是的 等等,然后假设我问它,1加1等于几,嗯 1加1等于2,然后再次问它,你知道我的名字吗,你的名字是安德鲁,正如你之前提到的。
有一点讽刺的味道,不确定,所以如果你想,你可以将verbals变量设置为真,看看当运行预测高时lang chain实际上在做什么。
我的名字是安德鲁,这是lang chain生成的提示,它说以下是人类和AI之间的对话。
作为健谈和等等。
所以这是lang chain生成的提示,让系统,有一个希望和友好的对话,并且它必须保存对话,保存对话,这里是回应,当你执行这个时。
嗯,因果的第二三部分,它保持提示如下,注意当我念出我的名字时,这是第三个术语。
这是我的第三个输入,它已将当前对话存储如下。
你好,我叫安德鲁,1加1等,因此,对话的历史越来越长。
实际上在顶部,我用内存变量存储了记忆。
所以如果我打印内存缓冲,它已存储到目前为止的对话。
你也可以打印这个。
内存加载内存变量,嗯,这里的花括号实际上是一个空字典。
有一些更高级的功能你可以使用。
但在这门短课程中我们不会讨论它们,所以不用担心。
为什么这里有一个空的花括号,但这是lang chain记住的。
到目前为止对话的记忆,它只是AI或人类所说的一切,我鼓励你暂停视频并运行代码。
lang chain存储对话的方式是使用这个对话缓冲内存。
如果我使用组合。
缓冲内存指定几个输入和输出,这就是你如何向记忆中添加新东西。
如果你想明确地这样做,记忆,保存上下文说你好。
怎么了,我知道这不是最令人兴奋的对话。
但我想让它有一个简短的例子,有了这个,这就是记忆的状态。
再次让我实际上显示,嗯,内存变量现在,如果你想添加额外的。
嗯数据到内存,你可以继续保存更多上下文,因果继续不多。
只是冷静地挂着,如果你打印出内存。
你知道现在有更多的内容,所以当你使用大型语言模型进行聊天对话时。
嗯大型语言模型本身实际上是无状态的。
语言模型本身不记对话,每笔交易,每次API调用独立。
聊天机器人,仅因为通常有代码提供,迄今为止的完整对话作为上下文。
因此内存可以明确存储。
嗨,我叫安德鲁,很高兴见到你等,这种内存存储用作输入或附加上下文。
以便它们可以生成输出,就像只有下一个对话回合。
知道之前说了什么。
随着对话变长,所需内存量变得非常长,发送大量令牌到LM的成本也会增加。
通常按需要处理的令牌数收费。
因此链提供了几种方便的内存类型。
以存储和累积对话。
我们一直在看对话缓冲内存,让我们看看另一种类型的内存。
我将导入对话缓冲窗口AR。
它只保留一段内存,我设置内存为缓冲窗口内存,k等于一。
变量k等于一,指定我只想记住一次对话交换。
即一次我的回合,和一次聊天机器人的发言。
所以现在如果我让它保存上下文嗨,怎么了,不只是挂着。
如果我查看内存加载变量。
它只记得最近的发言,注意'嗨'被丢弃。
怎么了,它只说人类说不多,只是挂着,AI说酷。
因为k等于一,这是一个很好的功能。
因为它让你跟踪最近的几次对话。
实践中你可能不会用k等于一,你会用k设置为较大的数字。
嗯,但这防止了内存无限制增长。
随着对话变长,如果我们重新运行刚才的对话,我们说嗨,我叫安德鲁。
1加1等于几,我叫什么名字。
因为k等于一,它只记得最后交流。
哪个是一加一,答案是1,加等于2,然后它忘记了,这个早期交流。
现在说抱歉,我没有访问这些信息。
我希望你会暂停视频,在左边的代码中改为true,并重新运行此对话,verbose等于true。
然后你会看到实际使用的提示。
当你调用lm时,希望你能看到记忆。
我叫什么名字,记忆已经丢失这个交流,我学到,我叫什么名字,这就是为什么现在说不知道,我叫什么名字。
使用对话令牌缓冲记忆,记忆将限制保存的令牌数。
因为许多lm定价基于令牌,这更直接地映射到lm调用的成本。
如果我设定最大令牌限制等于五十,实际上让我插入一些注释。
比如对话是人工智能是什么惊人的反向传播,美丽的教堂是什么迷人的,我用abc作为所有这些国家术语的第一个字母,我们可以跟踪何时说了什么。
如果我以高令牌限制运行,它几乎有整个对话,如果我增加令牌限制到一百,现在它有整个对话,人工智能的标志是什么,如果我减少它,那么你知道它切掉了对话的早期部分,以保留对应最近交流的令牌数。
但受限于不超过令牌限制,如果你想知道为什么我们需要指定,因为不同的lm使用不同的计数令牌方式,所以这告诉它使用聊天openai lm使用的计数令牌方式。
我鼓励你暂停视频并运行代码,并尝试修改提示以查看是否可以得到不同的输出,最后,这里有一种我想说明的最后一种记忆,即对话摘要缓冲记忆。
想法不是限制记忆到固定数量的令牌。
基于最近的陈述,而是基于最相关的陈述,或固定对话次数。
用语言模型写对话摘要。
让那成为记忆,示例如下。
我将创建某人日程的字符串,你知道与产品团队的会议,你需要PPT演示等,这是长字符串说。
你的日程是什么,你知道,中午在意大利餐厅结束,与客户,带上笔记本电脑,展示最新电影演示,因此让我使用对话摘要。
缓冲,内存,嗯,最大标记限制为400。
在这种情况下,很高的标记限制,我将要。
我们以'你好'开始的一些对话术语,怎么了,没,就挂着,嗯,酷。
今天日程上有什么,回答是。
你知道那长长的日程,现在这段记忆包含了很多文本。
实际上让我们看看记忆变量,包含全部文本,400个标记足够存储,但若减少最大标记数,比如100个标记,记住存储全部对话历史,若减少标记数至100,实际上使用了OpenAI的lm端点,因为我们说过。
让lm生成对话摘要,所以摘要是人类和AI闲聊,通知人类早会,blah blah blah,嗯,与对AI感兴趣的客户午餐会议,因此,如果我们进行对话,使用此LM,让我创建对话链,与之前相同,嗯。
假设我们要问。
你知道输入,展示什么好呢?我说详细为真,所以这是提示,Dlm认为对话已讨论这些,因为那是对话总结,仅一点注意,如果你熟悉openai聊天API端点,有一个特定系统消息,在这个例子中。
这不是使用官方OpenAI系统消息,只是将其作为提示的一部分,但它仍然工作得很好,考虑到这个提示,你知道,输出基本上很有趣,发展正在展示我们最新的NLP能力,好的,那很酷,好吧,你知道,给酷演示提建议。
让你思考,如果见客户,我会说,伙计,若开源框架可用,助我建酷NLP应用,好东西,比如,有趣的是,看内存发生了什么,注意,这里整合了最新AI系统输出,我询问的演示不会好,已集成到系统消息中,嗯。
你知道到目前为止的对话概要,缓冲内存,它试图做的是保持消息的显式存储,直到我们指定的标记数为止,所以你知道这部分显式存储,或尝试限制在一百个标记,因为这是我们要求的。
然后任何超出部分它将使用lm生成摘要,这就是上面所见的,尽管我已用聊天示例,说明了这些不同记忆,这些记忆对其他应用也有用,在那里你可能不断收到文本片段,或不断收到新信息,例如。
如果你的系统反复在线搜索事实,但你想保持总记忆量,不要让列表任意增长,我建议你暂停,视频并运行代码,你看到几种内存。
嗯,包括基于交换次数或标记数的缓冲内存,或可总结超过一定限制标记的内存。
实际上,该链还支持其他类型的内存,最强大的是向量数据内存。
如果你熟悉词嵌入和文本嵌入。
向量数据库实际上存储这样的嵌入(如不知道,别担心)。
别担心,哈里森稍后会解释,然后检索最相关文本块,使用这种向量数据库存储记忆。
Lankan也支持实体记忆,适用于你想记住特定人或特定实体的细节时。
比如谈论特定朋友,可以让Lang Chain记住关于那个朋友的事实,这应该以明确方式作为实体。
在使用Lang Chain实现应用时,也可以使用多种类型的记忆。
如使用视频中看到的对话记忆类型之一,另外,还有实体记忆以回忆个人。
这样你可以记住对话的概要,以及关于对话中重要人物的重要事实的明确存储方式。
当然,除了使用这些记忆类型,开发人员将整个对话存储在传统数据库中也不罕见,某种键值存储或SQL数据库。
因此可以回顾整个对话,用于审计或系统改进。
这就是内存类型,希望您觉得有用。
构建自己的应用,现在让我们继续下一视频,学习语言链的关键构建块。
LangChain_微调ChatGPT提示词_RAG模型应用_agent_生成式AI - P28:4——链 - 吴恩达大模型 - BV1gLeueWE5N
在这堂课中。
哈里森将教授土地链最重要的关键构建块,即链,链通常结合了一个lm大型语言模型和一个提示,以及这个构建块,你也可以将这些构建块放在一起,来完成对你文本或其他数据的一系列操作,我对此充满期待。
让我们立即开始吧。
我们将像以前那样加载环境变量,然后,我们还将加载我们将要使用的一些数据。
嗯,这些链条的一部分力量在于,你可以同时运行它们过许多输入。
在这里。
我们将加载一个pandas数据框,pandas数据框只是一个包含大量不同数据元素的数据结构。
如果你不熟悉pandas,不要害怕,主要的。
主要的观点在这里是我们正在加载一些我们可以后来使用的数据,因此,如果我们看进去这个pandas数据框。
我们可以看到有一个产品列,然后有一个评论列,而且这些行中的每一行都是一个我们可以开始通过链传递的不同数据点。
所以第一个我们要覆盖的链是lom链。
而且这是一个简单但真的很强大的链,它支撑了许多未来将要覆盖的链。
所以我们要导入三样不同的东西。
我们将导入openai模型,所以我们将导入聊天提示模板,所以这就是提示,然后我们将导入llm链,所以首先我们要做的第一件事是,我们将初始化我们要使用的语言模型。
所以我们将初始化chat open ai,使用高温度。
以便我们可以得到一些有趣的描述,现在我们将初始化一个提示。
这个提示将接受一个名为产品的变量,它将要求llm生成什么。
描述生产该产品的最佳名称是什么,最后,我们将将这些两件事结合起来形成一个链,因此,这就是我们所说的llm链,它相当简单,它就是llm和提示的组合。
但现在这条链将让我们能够通过提示进入llm。
以序列化的方式,因此,如果我们有一个产品叫做皇后尺寸床单套装。
我们可以通过使用chain run将这个通过链,而这将会做的就是它将提示在底层格式化。
然后它将整个提示传递给llm,因此,我们可以看到,我们得到了这个假设公司的名称。
称为皇家床品,所以这里是一个暂停的好时机,你可以输入你想要的任何产品描述,你可以看到链将输出什么结果。
所以LLM链是最基本的链类型。
而且这将在未来被广泛使用,所以我们可以看到这将如何在下一种类型的链中使用。
这将是序列链,所以序列链将运行一系列链一个接一个。
所以首先你将导入简单的序列链。
这工作得很好,当我们有只期望一个输入并返回一个输出的子链时。
所以这里我们将首先创建一个链。
该链使用LLM和一个提示,这个提示将接受产品。
并将返回描述该公司的最佳名称,这将是第一个链。
然后我们将在第二个链中创建第二个链,我们将输入公司名称,然后输出该公司的二十字描述。
所以你可以想象这些链如何想要一个接一个运行。
其中第一个链的输出,公司名称将被传递给第二个链。
我们可以很容易地这样做,通过创建一个简单的序列链。
其中我们有那里描述的两个链,我们将称这个整体为简单链,现在,你可以运行这个链过任何产品描述。
所以如果我们用它与上面的女王尺寸床套。
我们可以运行它,我们可以看到它首先输出皇家床品。
然后它将将其传递给第二个链,它产生了关于该公司可能关于的描述,简单序列链在只有一个输入和一个输出时工作得很好。
但是,当有多个输入或输出时怎么办,所以我们可以通过使用普通的序列链来做到这一点。
让我们导入它,然后你将创建一系列我们将使用的链。
一个接一个,我们将使用上面的数据,其中包含评论,我们首先将取第一个链。
嗯,评论并翻译成英语。
与第二个链,我们将创建该评论的总结为一句话。
这将使用之前生成的英语评论。
第三个链将检测评论最初使用的语言。
所以如果你注意到这在使用来自原始评论的review变量。
最后,第四个链将接受多个输入。
所以这将接受总结变量,我们在第二个链中计算的,和语言变量,我们在第三个链中计算的,它将要求对总结的回应以指定的语言。
请注意,所有这些子链都有一个重要的事情,即,那是否输入键和输出键需要精确到细节,所以这里我们在进行审查,这是一个将在开始时传递的变量。
我们可以看到,我们明确设置了输出键为英语评论。
然后,它在下面的提示中被使用,在那里,我们以相同的变量名称输入英语评论,并将该链的输出键设置为摘要。
我们可以看到,它在最终链中被使用,第三个提示输入原始变量和输出语言,再次在最终提示中被使用。
准确地对齐这些变量名称非常重要。
因为有许多不同输入和输出在进行,如果你有任何键错误,你应该肯定检查它们是否对齐。
所以,简单的序列链可以输入多个链。
其中每个链都有一个输入和一个输出,以看到这种表示的视觉化,我们可以看到这张幻灯片,其中一个链输入另一个链。
在这里,我们可以看到序列链的视觉描述。
与上述链相比,您会发现链中的每一步都可以输入多个输入变量。
这是有用的,当你有更复杂的下游链需要由多个先前的链组成时。
现在我们有了所有这些链,我们可以轻松地将它们组合在序列链中。
所以你会发现这里,我们将我们创建的四个链传递给链,变量将创建输入变量,其中包含一个人类输入。
这是评论,然后我们想要返回所有中间输出。
所以,英语评论,摘要,然后是后续消息,现在我们可以运行一些数据。
所以让我们选择一条评论并通过整体链传递它。
我们可以看到,原始评论看起来像是法语。
我们可以看到英语评论作为翻译,我们可以看到该评论的摘要,然后,我们可以看到后续消息在原始语言的法语中,您应该在这里暂停视频并尝试输入不同的结果,我们已经覆盖了llm链和序列链。
但如果你想要做更复杂的事情,一个常见的但基本的操作是将输入路由到一个链,取决于输入的确切类型,这是一个很好的想象方式。
这是你如果有多个子链的情况,每个子链都专门用于处理一种类型的输入,你可能有一个路由器链。
它首先决定将输入传递给哪个子链,然后,将输入传递给该链。
以具体例子来说,让我们看看我们是如何在不同类型的链之间路由的,取决于似乎到来的主题。
所以,我们有这里不同的提示,根据主题的类型,一个提示对于回答物理问题很有用,第二个提示对于回答数学问题很有用,第三个对于历史,然后第四个对于计算机科学,让我们定义所有这些提示模板。
当我们有了这些提示模板。
然后我们可以提供更多关于它们的信息,我们可以为每个一个命名。
然后描述,这是对物理的描述,一个是用于回答物理问题的。
这信息将被传递给路由器链。
所以路由器链可以决定何时使用此子链。
现在让我们导入这里需要的其他类型的链。
我们需要一个多提示链,这是一种特定类型的链,用于在多个不同提示模板之间路由。
正如你看到的所有选项都是提示模板本身。
但这只是您可以路由之间的一种东西,您可以路由任何类型的链。
我们在这里实现的其他类是llm路由器链,这使用语言模型本身在子链之间路由。
这是上面描述和名称将被使用的地方。
我们还导入了一个路由器输出解析器,这解析输出为可以下游游用于确定应使用哪个链的字典。
以及该链的输入应是什么,现在可以开始使用它了,让我们导入并定义我们将使用的语言模型。
我们现在创建目的地链,这些是路由器链将调用的链。
正如你看到的,每个目的地链本身都是一个语言模型链。
一个llm链,除了目的地链。
我们还需要一个默认训练,这是当路由器无法决定应使用哪个子链时将被调用的链,例如,上面的例子可能在输入问题与物理无关时被调用,如数学、历史或计算机科学。
现在,我们定义llm用于在不同链之间路由的模板,这包含要完成的任务的指示,以及输出应遵循的特定格式,让我们将这些部分放在一起来构建路由器链。
首先,我们创建完整的路由器模板,通过格式化它来使用我们上面定义的目的地,这个模板灵活于许多不同类型的目的地。
你可以在这里暂停并添加不同类型的目的地。
在这里,而不是只是物理。
数学、历史和计算机科学,你可以在这里暂停并添加不同类型的目的地。
所以,在这里,而不是只是物理,数学、历史和计算机科学,你可以添加一个不同的主题,如英语或拉丁语,接下来,我们从这个模板中创建提示模板,然后,我们通过传递llm创建路由链。
并总体路由提示说明,在这里我们有路由输出解析器,这很重要,因为它将帮助这条链决定将某些链路由到何处,最后,将所有部分放在一起,我们可以创建总体链,这有一个定义在这里的路由器链。
它包含我们要在这里传递的目的地链,我们还在这里传递默认链,我们现在可以使用这条链。
所以让我们问你一些问题,如果我们问它关于物理的问题。
我们应该希望看到它被路由到包含输入的物理链上。
什么是黑体辐射,然后,它将被传递到下面的链中。
我们可以看到响应非常详细,充满了许多物理细节,你应该在这里暂停视频并尝试输入不同的内容,你可以尝试使用我们上面定义的所有其他特殊链类型,例如,如果我们问它一个数学问题。
我们应该看到它被路由到数学链,然后传递到那里。
我们也可以看到当我们输入问题时会发生什么。
这与任何子链都不相关,在这里我们问它一个生物学问题。
我们可以看到它选择的链是None,这意味着它将被传递到默认链,默认链本身只是一个对语言模型的通用调用,幸运的是,语言模型对生物学知道很多,所以现在我们已经覆盖了这些基本的构建块,我们可以帮助它。
类型的链,我们可以开始将它们组合起来创建非常有趣的应用程序,例如,在下一节中。
标签:检索,吴恩达,教程,笔记,节点,相关性,上下文,我们,评估 From: https://www.cnblogs.com/apachecn/p/18443046