📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Guardrails with LangChain: A Complete Crash Course for Building Safe AI Agents

Krish Naik38:15

Transcription

大家好。在本系列视频中,我们将了解一个非常重要的主题,它被称为护栏。现在,当我们继续前进时,我们将首先了解护栏到底是什么。你知道为什么它很重要,尤其是在我们构建人工智能代理时,然后我们还将尝试了解实际的实现。在人工智能代理工作流程中实现护栏的方法有哪些,以及我们为什么特别使用护栏本身?对吧?所以,嗯,首先,我们将从一个定义开始,一个基本定义。这里我刚刚复制并粘贴了定义本身。护栏是控制进入和离开人工智能代理内容的机制。它们位于您的代理管道周围,并确保代理仅处理安全、适当的输入,仅执行已批准的操作,仅返回经过验证的合规输出。好的,所以这些真的很重要。好的,再说一遍,让我重复一下。它们确保它们位于您的代理管道周围,并确保代理仅处理安全、适当的输入,仅执行已批准的操作,仅返回经过验证的合规输出。现在您可以看到我设计了我,我刚刚创建了这个简单的人工智能代理。好的,这是一个基本的人工智能代理,这个人工智能代理实际上在做什么?它正在接收一个输入。输入进入 LLM。然后 LLM 调用工具,或者它也可以直接提供输出。现在,每当我谈论这些工具时,这些工具可以是 rag 应用程序、rag 数据库、向量数据库,可以是 API,可以是不同类型的包,可以是 MCP 服务器,任何这样的东西。但是,如果它调用工具,我们就会得到一个特定的上下文,然后 LLM 将此上下文与提示结合起来,然后生成输出。现在在这种情况下,无论您向 LLM 提出什么问题,对吧?LLM 将根据请求生成输出,要么从工具中获取上下文,要么生成自己的输出。所以这里,在生成输出之后,您会得到整个输出本身。好的。但是,当我们谈论护栏时,您不认为,好吧,假设如果输入中,我继续问,嘿,如何破解服务器?好的。如何破解服务器?如何破解服务器?您认为这个问题合适吗?如何破解服务器?对吧?所以在这里,显然当我们说,好吧,当我们提出这类消息时,它是一条不安全的消息。对吧?因为你为什么要破解服务器,有些人显然是为了做一些坏事,对吧?所以我的 LLM 应该做什么?要么它应该标记此内容说,嘿,这不好,所以我们不会给你输出,对吧?或者在输入进入 LLM 之前,这里应该只发生一些检查,说,嘿,此输入已被标记,这不是一个适当的输入,我们将确保我们不给你输出,对吧?通过这种方式,从这个应用程序或这个人工智能代理生成的输出始终是经过验证的、合规的、合规的,你知道,基于我们定义的规则和法规,对吧?这真的很重要,否则无论你具体问 LLM 什么问题,它都可能给你你真正想要的东西,比如说,嘿,如果我提供一张图片,我会说,嘿,请生成一张图片,并做所有这些事情,或者从某个人的脸上交换脸,对吧?那看起来不好,对吧?所以这就是为什么,你知道,我们实施护栏。现在我只是给你一个基本例子,但仅凭定义,你就可以看到它只不过是,你知道,一个安全机制,它控制着进入和离开人工智能代理的内容,而这些特定的事情我们做,它只处理安全、适当的输入,只执行已批准的操作,只返回经过验证的合规输出。所以,在每个阶段,你知道,在这个整个工作流程中,我们可以实现不同类型的护栏。好的。现在,进入下一步,我们如何实现护栏?对吧?所以,在人工智能代理中,当我们谈论护栏时,有两种明确的方法。好的。一种方法称为确定性方法。确定性方法确定性方法,第二种方法基本上称为基于模型的方法,好的,仅从确定性和基于模型这个词来看,如果我可能谈论基于模型,显然你知道,在这里我们将使用 LLM,对吧?所以我们会将输入提供给 LLM,然后我们决定此消息是否安全,然后可能继续。好的。现在这里的主要优点是,因为我们将其提供给 LLM,所以 LLM 当然会清楚地理解语义,对吧?所以这很容易,如果我说,嘿,如果我提供这个输入,我告诉你要我告诉 LLM 标记或不标记,对吧?基于特定的提示,对吧?所以 LLM 一定能够理解,他们将能够理解语义,对吧?然后在这里,您将能够看到,任何类型的违规都可以很容易地告知 LLM,对吧?这样它就能捕捉到那种违规行为,并立即停止请求,对吧?如果我谈论这里的主要优点,也有一些缺点。缺点是,因为我们在这里使用 LLM,对吧?LLM 的成本,LLM 的调用是昂贵的,对吧?对于每个输入,如果我们将其提供给 LLM,并基于成本,对吧?每次调用都会产生费用,对吧?所以因为这个,成本肯定会更高,对吧?所以这是缺点之一。如果我谈论确定性方法,在确定性方法中,它非常简单,我们在这里做的是我们定义一些基于规则的算法,对吧?基于规则的算法,它可以是 reax,对吧?它可以是关键字匹配,它可以是不同类型的东西,对吧?所以做所有这些事情,显然主要优点是它是零 LLM 成本,对吧?这里你没有使用任何 LLM,但同样,在确定性方法中,主要缺点将是,显然通过这种方法,它将无法理解语义,对吧?所以通常,当我们根据问题陈述实现护栏时,我们通常使用这两种方法,一种是确定性的,一种是基于模型的。现在,在本系列视频中,我将使用 Langchain 作为我的开源框架,并借助它,我们将实现护栏,对吧?现在。为什么是 Lang?因为你看 Lang 在处理这个问题方面有一些非常重要的方式,你知道,以中间件的形式。以中间件的形式中间件现在中间件到底是什么?现在,在代理工作流程中,对吧?我们可以在工作流程中添加不同类型的钩子,在代理之前,在代理之后,等等。所以考虑到这个中间件,有六个重要的步骤我们将要讨论,一个是 PII 中间件。现在这个 PII 中间件是什么?好的,在这个 PII 中间件中,我们将能够检测。它们有一些 Langen 中可用的内置技术,能够检测电子邮件 ID、信用卡、对吧?信用卡号,对吧?除此之外,您还将能够检测 IP、URL,对吧?所以所有这些,它是一种内置中间件,可用于 Langchain,它将能够检测所有这些,并且您可以在代理中集成这种类型的属性,以便它确保它告诉代理可能限制输出或尝试应用其他类型的验证。好的。现在在这个中,当我们在使用 PII 中间件时,会发生什么?比如说,如果它看到电子邮件 ID、信用卡、IP,它会应用某种类型的技术,比如屏蔽,对吧?它提供一个哈希,哈希是一种算法,你知道,它会改变给定的数字或电子邮件 ID 的整个内容。好的。然后,最好的部分是它适用于输入,它适用于输出,它也适用于工具调用。对吧?工具调用。所以这就是 PIM 中间件的全部内容,你知道,这是我们可以应用的一种重要的中间件技术,以便实现护栏,对吧?第二种重要技术是某种称为“人工干预”的东西,即“人工干预”中间件,对吧?现在,如果您正在实现此中间件,您将能够看到它会暂停,它会在敏感工具之前暂停代理,对吧?在任何敏感工具之前,它会暂停在那里,并等待人类批准或拒绝,对吧?所以,我将通过实际实现和示例向您展示一切。不用担心。好的?嗯,我将教你所有关于这个的知识。好的?而且这里显然你必须使用线程和检查点来实现,这样它才能理解我们正在与哪个用户交谈。好的?所以这里,如果你了解内存管理,这里线程和检查点肯定会被使用。好的。现在这是另一种方法,我们可以特别使用护栏。我们将一个接一个地实现。好的。但首先,让我们了解一下我们可以应用的所有不同类型的护栏。现在,在代理之前,代理钩子。现在,在我的代理被调用之前,你知道,我也可以继续应用这个特定的护栏。现在,这个代理前的钩子什么时候运行?它在任何 LLM 调用之前运行。好的,它在 LLM 调用之前运行。嗯,在这里,您将能够看到,在进行 LLM 调用之前,并且假设这个护栏已经验证了,对吧?这里将有零成本,零成本用于被阻止的请求,因为显然我们没有去命中 LLM。所以我们所做的是我们在那里阻止它们,并且基本上没有涉及 LLM 的成本。然后,如果它被阻止,我们可以直接将其移至最终状态。好的,这真是太棒了,对吧?它可能去查看 LLM 调用之前的机制,并看到,好吧,如果它被标记,它将直接发送到工作流程的末尾或人工智能代理的末尾。好的,现在来到第四个。我们可以特别应用护栏的第四个地方是代理后的钩子。假设代理已执行,已生成输出,之后您也可以进行验证。好的。所以在这里,您将能够看到我们特别验证最终响应。好的。最终响应在用户看到它之前。所以,比如说,在用户看到它之前,如果有什么被标记,它会去做,它会去做,对吧?而且最好的部分是它做什么,你知道,它还可以替换或修改不安全的内容,这是最令人惊奇的事情,对吧?而且在这里,你知道,你也可以使用一个便宜的模型或一个小语言模型来实施它,好的?同样,嗯,还有一些叫做分层护栏的东西。现在,在分层护栏中,您可以组合所有内容,对吧?我在这里提到的所有内容,您可以组合,您可以以堆栈的形式组合它,然后继续实现它。好的,这关于护栏。我希望你对此有了非常清晰的认识。嗯,我们如何特别使用护栏以及为什么使用它。但现在是时候让我们继续看一些代码了。我们在这里创建了一个非常好的文档。好的?我们将一步一步地尝试查看它。嗯,先决条件是,你需要了解这个,你知道,Langchain,我们之前讨论过的,对吧?关于 Langchain,比如中间件、内存、结构化。如果你看过我以前的模块,对吧?我已经上传了它,而且,你知道,我们会确保随着我们前进的每件事都得到更新。好的?所以在这里,你将能够看到,在这个笔记本中,我们将讨论护栏是什么,为什么它们很重要,两种方法,内置 PI 检测中间件,内置人工干预,自定义代理前钩子。所以这就像一个自定义的护栏技术,然后我们还将看到一些聊天机器人。好的?所以首先,我们继续初始化它。我们加载我们的环境变量,这很简单,从 env 导入 load_env。我将使用我的 OpenAI API 密钥。好的,OpenAI API 密钥很好,以便实现护栏本身。对吧?而且在这里,你可以看到护栏是什么。它们构建,护栏通过验证、过滤内容和代理执行中的关键点来帮助你构建安全合规的人工智能应用程序。它们作为中间件实现,在代理开始输入护栏之前拦截执行,在代理完成输出护栏之后,围绕模型和工具调用,你也可以实现它。好的。常见用例,你可以在这里看到 PII 泄露预防。它在记录之前会删除电子邮件、信用卡。提示注入阻止。看,在执行过程中,你甚至不能注入新的提示。它会检测对抗性输入。阻止危险请求。要求批准财务操作。确保每个响应都符合安全标准。而且这在当今非常重要。如果你看到设计中的 LLM 类型,你知道,对于每个应用程序来说,都必须在上面实现护栏。第二部分,护栏的两种方法,我们已经讨论过了。现在,让我们看一个例子。好的?所以在这里,你将能够看到我们创建了一个函数。让我稍微放大一点,这样你就能清楚地看到它。好的?是的。所以在这里,你将能够看到我们创建了一个函数,它被称为确定性护栏。在这里,我们输入文本,这个函数的输出是布尔值。对吧?它将是 true 或 false。如果内容被阻止,它将返回 true。比如说,在任何输入中,对吧?我为我的应用程序创建了一些被禁止的消息,比如 hack、exploit、malware、bomb,对吧?所有这些都是被禁止的关键字。而且我在这里基本上说,我们可以,这个函数,当我们调用它时,我们给任何文本,它会去匹配所有这些文本。而且如果与该特定文本匹配,我们会得到一个布尔值,说明它是 true 还是 false。如果是 true,如果它提交为 true,那就意味着它匹配了这些被禁止的关键字。所以正如我在确定性方法中所说的,我们不会使用 LLM。在这里,我们将有一些 reax 操作。我们可以有一些固定的关键字集,固定的被禁止的关键字集,我们可以实际使用它们。然后我有一些测试输入。这里有一些问题,比如我如何入侵数据库?法国的首都是什么?解释恶意软件是如何传播的。现在,从这些问题中,你知道这是一个危险的消息。对吧?而且因为这个确定性护栏,我需要在我去人工智能代理之前,在所有这些测试输入之前应用所有这些测试输入。我需要在这里应用它。对吧?所以在这里,你将能够看到我正在使用一个,嗯,嗯,输入在测试输入中。我正在说我正在调用这个函数,我正在说状态被阻止,如果被阻止则允许。对吧?然后你将能够看到我将继续执行它。这里它说被阻止。我如何入侵数据库?允许。法国的首都是什么?被阻止。解释恶意软件是如何传播的。对吧?所以通过这种方式,你将能够看到它基本上被阻止了,仅仅是使用一些基于规则的方法。而且,我们可以将其应用于我们的人工智能代理之前。好的?现在,同样,关于基于模型的方法。好的?在基于模型的方法中,你知道,我们将使用任何特定的模型。所以从 langchain.openai 我导入了 chat.openai。这里我们定义了一个函数。它接受一个字符串并返回一个字符串。我放了一些文档字符串。使用 lm 来评估内容安全性。返回安全或不安全。所以这是我的模型,chat gp 40 mini,温度为零。我给了一个提示。以下用户输入是否安全可处理?仅回复安全或不安全。这是我的输入文本。然后我提供我的结果。我通过 model.invoke 获取我的结果,我将我的提示放在里面。最后,我只是写 result.content.st strip。好的?现在我们将为每个输入进行测试,我将应用这个函数。而且在这里,你将能够看到我写不安全,如果不在 vertx 中则为 self。好的?所以在这里,你将能够看到基于模型的。我如何入侵数据库?这是不安全的。法国的首都是什么?这里你可以看到解释恶意软件是如何传播的。现在,你可以在这里看到,对吧?基于上下文,它正在理解。这是一个通用信息,解释恶意软件是如何传播的,对吧?这是一个通用信息,基于此,你知道,LLM 能够理解语义,然后它能够给你输出,但在这种特定情况下,你将能够看到它显示为被阻止,因为显然上下文没有被理解,并且基于关键字匹配,我们正在实现它。好的?所以这是两种方法,但再次,在 Langchain 中,你有很多内置的护栏技术,我们将要看到。好的?现在,如果你还记得,伙计们,在 Langchain 中,我们使用 create_agent 来创建一个基本的人工智能代理。我们还可以集成不同类型的人工智能工具,不同类型的人工智能工具,可以用来执行工作流程。现在,让我们继续讨论内置护栏。好的?而且在这个内置护栏中,我们将要看到关于 PII 检测中间件。现在,Langchain 提供了内置的 PII 中间件来检测和处理个人身份信息。对吧?当我谈论 PII 时,全称是个人身份信息。好的?所以在这里,你可以看到支持的 PII 类型是,比如说,电子邮件、信用卡、IP、MAC 地址和 URL。所以这些是一些固定的类型,已被个人身份信息支持。它被视为这样。好的?你有电子邮件、信用卡、IP 和 MAC 地址。策略,它做什么?它会删除。删除基本上意味着删除电子邮件,对吧?它会尝试展开它并将其保留在此格式中。屏蔽基本上意味着它只是会放星号。哈希它将应用哈希算法并进行更改。还有一些叫做阻止的东西。它会引发一个异常。如果你使用这个阻止策略,它会引发一个异常。所以,让我们一步一步地看看如何做到。现在,首先,为了理解我们如何创建一个代理,对吧?所以从 langin.tag agents,我们导入 create_agent 方法。而且因为我们需要应用中间件,对吧?我们继续写 from lang.agents.m middleware import middleware pi middleware。然后从 langchen openai 导入 chat openai,从 langchen core tools 导入 tools,然后在这里,你将能够看到定义一个简单的虚拟工具,这是我的工具,我创建了一个工具,对吧?这个 pi 中间件我需要集成到我的 create_agent 中,这基本上是在这里集成的,它将在人工智能代理被调用之前应用,对吧?这就是 PII 中间件所在的位置。所以如果我继续给你看,比如说,如果这是我的人工智能代理,如果这是我的人工智能代理,那么在输入进入这里之前,在输入进入这里之前,我的 PII 中间件就被应用在这里,对吧?所以这里我的 PI 中间件将被应用,并且基于这个输入,它基本上会检查个人信息,对吧?它是否是电子邮件 ID,而这基本上是 Langchain 内置的。好的?所以它基本上将在人工智能代理被调用之前在这里应用。好的?所以,让我们继续,在这里,你将能够看到我定义了一个工具。这是一个虚拟工具,它说客户查找,无论我们给出什么查询,我们只是说找到了与此特定查询相关的客户记录。现在,我将在人工智能代理中向你展示如何集成这个工具,以及如何添加这个 PII 中间件。所以首先,我们继续创建一个带有 PII 中间件的代理。所以我们使用 create_agent。我们使用模型,我们使用工具,然后在这里我们使用中间件。在中间件中,我们给出一个中间件列表,对吧?就像我们想要多少种中间件?所以一个是 PII 中间件。这里策略是删除。好的,我们正在使用关键字电子邮件。这意味着对于电子邮件,我将应用这个策略,因为这是一个内置关键字,并且应用于输入 true,对吧?所以我们将基本上应用到我们输入的任何内容。对吧?所以这三个是这里应用的已定义关键字。下一个中间件是应用于用户输入中的信用卡。这是用于电子邮件,这是用于信用卡。所以这里我们将应用 PII 中间件,信用卡策略等于屏蔽,应用于输入等于 true,对吧?所以对于信用卡,我们将进行屏蔽,然后对于 API 密钥,我们将引发一个错误。所以 PII 中间件,我们使用内置关键字 API 密钥。有一个叫做 detector 的参数,我们可以应用正则表达式。所以在这里,你可以看到 32 个字符的正则表达式基本上被应用了,我们使用的策略是阻止。如果你知道阻止是做什么用的,它会引发一个异常,对吧?然后你将它应用于输入等于 true。现在,有了所有这些中间件,我们正在创建,我们将它们附加到人工智能代理。这个人工智能代理有一个工具,所以你可以看到这个人工智能代理有一个工具,比如说这个人工智能代理有一个工具,这个工具基本上是在搜索用户并提供上下文,对吧?用户是否被找到,或者没有,而且在此之前,我们正在应用这个 PI 中间件,并且我们已经为信用卡应用了它,我们已经为电子邮件应用了它,我们已经为 API 密钥应用了它。对吧?我们都应用了它,并且在进入人工智能代理之前,我们将做这个。对吧?所以在这里,你将能够看到我们已经创建了这个。对吧?现在我将继续执行它。现在,让我们看看我使用了这个 agent.invoke。我使用了 messages ro 等于 user。我的内容是我的电子邮件是 john.d do @ example.com,我的卡号是你能帮忙吗?对吧?所以这是我们给出的问题。对吧?现在代理肯定应该阻止它们。它应该在这里做些什么,对吧?所以现在你应该能看到响应。我找到了与卡号以 5100 结尾的客户记录。看,它甚至没有给出完整的答案。我今天还能怎么帮你?对吧?现在,如果我继续查看整个结果。看发生了什么。我的电子邮件被删除的电子邮件。对吧?这封电子邮件已更改为已删除的电子邮件,我的卡是这个。看,星号星号星号基本上出现了。所以这里发生了什么?我们应用了,我们应用了这个屏蔽,这个中间件应用了屏蔽,对吧?中间件应用了屏蔽,对吧?你能帮我吗?而且在这里,你将能够看到客户记录已找到,查询是这个,这个,这个,我找到了与卡号以 5100 结尾的客户。我还能怎么帮你?所以在这里,你可以看到基于输入,中间件 PII 中间件已经执行了一些重要的事情,基于我们为电子邮件、信用卡和 API 密钥应用的策略。所以,伙计们,现在让我们继续测试 API。对吧?所以这里我写了 agent.invoke messages ro 等于这个。这是我的密钥,我给了一个看起来像 open API 密钥的随机密钥。而且在这里,你可以看到我使用了 exception as e。如果你还记得这里,当我们有这个阻止策略时,它会引发一个异常,对吧?所以这就是为什么我们将整个代码写在 try 块中。所以 try 等于 agent.invoke messages role 等于 user content,这是我的密钥,exception as this。所以让我继续执行它。而且在这里,你可以看到被阻止的作为接受的检测到文本文档中的一个 API 密钥实例。所以基于 PII 中间件中的特定关键字,我们已经应用到我们的代理中,并且基于此,引发了特定的异常。好的?所以这是关于 PII 中间件。现在,让我们继续看看下一个内置护栏,它被称为人工干预。好的?现在,人工干预是真正重要的事情。它会在敏感操作之前暂停代理执行,并等待人类批准。归根结底,你开发的任何人工智能代理,都有必要有一些人工干预中间件。那基本上意味着它会等待人类反馈。而且这种中间件最适合财务交易、向外部方发送电子邮件、删除生产数据、任何具有重大业务影响的操作。好的?要求是需要一个检查点,以便我们了解这个特定的工作流程是为哪个用户运行的。所以,同样,我们继续导入 create_agent 从 lang.tagent。然后我们导入称为人工干预的中间件。然后我们有内存保存器。然后我们还使用这个命令。这个命令基本上是为了批准人类类型的,比如人工干预,人类反馈。然后我们还定义了工具。所以首先,我们定义了一个称为搜索网络的工具。这里它正在搜索特定查询的结果。然后我们有发送电子邮件。所有这些都是虚拟工具。好的?这里我们硬编码了输出。它返回此特定查询的结果。电子邮件已发送到此,主题是这个。然后你还有删除记录,你知道,从表中删除记录,条件是这三个工具。比如说,我想将它集成到我的代理中。所以这里我创建了一个 hit agent,它基本上意味着人工干预代理。我们使用 create_agent。我们使用了模型 GPT40。我们使用了工具搜索网络、发送电子邮件和删除记录。而且在中间件中,我们使用了人工干预,并且我们在某些特定工具上中断,对吧?当我们中断发送电子邮件时等于 true。那基本上意味着我们在发送电子邮件之前需要批准。在删除记录之前,我们需要批准。在搜索网络之前,我们不需要批准,对吧?所以这是自动批准的。所以我们将其设置为 false,因为搜索网络是一项正常工作。它就像一个 get 请求,试图在这里出现。但在这里,发送电子邮件和删除记录在内存保存器中,最后我们打印出创建的人工干预代理,并且基于此,你将能够看到这个。好的,非常简单,对吧?这里人工干预中间件基本上被应用了。所以,我将继续执行它。现在,让我们创建我的配置,其中 thread 等于,带有 session ID。所有这些东西都已经在 Langchain 中教授过了,伙计们。所以这就是为什么我试图以这种方式向你们展示。好的?再次,写所有这些代码会花费不必要的时间。我想让视频尽可能短。好的?然后,result 等于 hitl agent.invoke。而且在这里,你将能够看到 role 等于 user content,发送电子邮件给 company team 关于第四季度业绩。好的?所以这是一封电子邮件。我们需要可能将其作为电子邮件发送。而且在此之前,我们想暂停,对吧?所以一旦我们执行了这一点,你将能够看到,因为我们已经在 hit agent 中应用了人工干预中间件,所以代理肯定会暂停。对吧?所以你可以看到这是消息。现在,为了批准它,我们将做什么?我们将说 command resume decision 等于 type 等于 approve。一旦我们这样做了,使用相同的配置,它将继续,并且在这里,你将能够看到我已将电子邮件发送给 company 关于第四季度业绩。对吧?所以我知道这是一个硬编码的消息。我们没有发送任何电子邮件,但我希望你明白,通过人工批准,我们实际上已经转发了工作流程。对吧?同样,如果人类拒绝它,也有拒绝的方法。比如说,在调用删除用户表中的所有记录之后,我在这里说,好吧,decision type 等于 reject,decision 太冒险了,需要 dba 审查,而且一旦我们执行了它,它就不会直接,你知道,直接,你知道,成功通过这个特定的结果,而是会说,嘿,我们不会继续进行,因为我们需要进一步的问题,进一步的,你知道,dba 审查,我们真的需要做。看起来你已经决定不继续删除。对吧?所以这是关于人工干预。现在你可以根据你的需求创建,无论你想要在哪里。好的?然后,来到最重要的事情,它被称为自定义护栏,代理前钩子。好的?所以如果我回到这里,你将能够看到,在我们调用工具之前,对吧?在某些工具中,我们使用人工干预。对吧?人工干预中间件,并且我们在这里应用了它,对吧?人工干预中间件。完美。好的?现在,让我们继续展示如何可能创建自定义护栏,而且你也可以在代理前和代理后这样做。每当我们说到代理前钩子,它就像一个输入过滤器,对吧?一旦你收到输入,你就可以应用自定义护栏。当它用于关键字或内容过滤、身份验证检查、速率限制、阻止、阻止特定类别的请求时。好的?所以在这里,为了创建一个自定义护栏,我们首先,比如说,导入一些叫做 agent middleware、agent tech、state 和 hook config 的东西。所以这三者将被特别使用,我们还将使用 runtime。我们将使用 create_agent 和 tool。对吧?现在,无论我们做什么,我们首先创建一个类。如果你想创建一个自定义中间件,比如说,我在这里写了 content middle filter filter middleware。它需要继承 agent middleware。好的,它将继承 agent middleware。而且这里是我的文档字符串。我正在说它是一个确定性护栏,阻止包含被禁止关键字的请求。好的?如果我真的想定义我自己的自定义护栏本身,那么我们定义一个 init 方法。这里我们引入了一个新关键字,叫做被禁止的关键字。当我们说 super.init 时,它基本上继承了 agent middleware 的所有特性。然后我们根据我们在顶部定义的被禁止的关键字来初始化被禁止的关键字。对吧?然后我们将继续并将这个 hook hook_config 添加到代理之前。对吧?如果你真的想添加这个整个内容过滤器元数据,我们基本上要做的是,我们将定义这个 before_agent,这是一个内置方法。好的?这里我们将使用 agent_state。这个 agent_state 将拥有整个代理以及运行时的引用。好的?我说如果 state of message 不存在,则返回 none,否则只取第一个消息并显示它。如果第一个消息不等于 human,那么它就是 none。好的?然后,比如说,如果是 human,我们将把消息变成小写,然后检查它是否与被禁止的关键字匹配。好的?对于关键字,在 self.band_keywords 中,如果关键字在 content 中,这里我们将能够看到我无法处理包含不当内容的请求,然后我们最终跳转到末尾。当存在被禁止的关键字时,我们只是返回整个消息。好的?同样,我们可以继续创建工具。现在我们继续创建一个代理。我们写 GPT4 模型。我们集成了工具。现在你可以看到在中间件中,我们正在使用这个 content filter metadata。抱歉,content filter u middleware,并且我们已经传递了被禁止的关键字。对吧?然后这个整个代理将被创建。这很简单。你继续在这里创建你的中间件,你定义它真正需要做什么,通过使用这个 hook_config,并且在这里我们说,当这个被触发时,你只需要跳转到末尾,并且在这里你将能够看到 content filter agent 已创建。现在让我们试试。好的?这里我说机器学习是什么?那么这是否需要被阻止,还是这是一个安全请求?对吧?嗯,这是一个安全请求,因为它没有匹配任何这些关键字,然后你就能得到整个信息。比如说,对于一个不安全的请求,我们应该如何做?对吧?我如何入侵服务器?对吧?这是一个不安全的请求响应。看,被阻止的关键字检测到 hack,不安全的请求响应,我无法处理包含此内容的请求。请重新措辞你的请求。对吧?所以,我希望你已经有了想法,对吧?如何通过使用这个 hook_config 在代理之前应用,并且在这里我们定义了代理前。同样,你也可以对 after_agent 代理后钩子做同样的事情。嗯,这基本上用于基于模型的安全评估合规性扫描,比如法律、医疗、财务免责声明、质量验证、删除已泄露的敏感信息。所以这基本上可以在你的 AI 代理生成输出之后应用,然后继续查看。我们创建了安全护栏,再次,我们继承了 agent middleware。这里我们继承了它,对吧?我们使用了一个叫做 chat open AI hook config 的安全模型,再次,我们使用了,这里我们说,好吧,我们只是用提示来评估,评估这个 AI 响应是否对用户安全和适当,然后最后我们得到它,如果不安全,我们就得到 none,对吧?否则它会标记它。再次,你可以继续检查它,伙计们,它几乎是相似的。我将把它留给你。所以代理后安全可以代理已创建。现在,如果我继续查看今天的天气怎么样?好的?然后它将直接给你输出。好的?请告诉我是否有任何你想知道的特定信息。这里什么都没发生。但是,如果我继续检查输出安全性,今天天气怎么样?或者你尝试输入其他消息,那么你也应该能够检查输出安全性。好的?我将删除这个。这是重复的。所以,我希望你已经理解了。嗯,如果我谈论这个,自定义护栏,自定义护栏可以在人工智能代理执行之前在这里或在这里之后应用,对吧?代理前,代理后,对吧?而且我们使用了一个叫做 hook 的东西,对吧?所以关于它,我们将能够看到它。现在,最后,伙计们,我们将进入第七部分,分层或组合护栏。好的?在这里,你可以堆叠所有中间件,一个接一个。比如说,对于第一层,我使用内容过滤器中间件,然后是 PIM 中间件,对于第二层,是人工干预中间件,第三层,第四层。所以在这里,你可以看到,对吧?我有三个工具,搜索工具,发送电子邮件,然后一个接一个地添加它们。内容过滤器元数据中间件,然后是 PII 中间件二,然后是人工干预中间件。你可以去查看一下。最后,对于基于模型的输出安全性,你可以使用安全护栏中间件。最后,我还有一个额外的奖励,它在第八部分,真实世界用例,医疗保健聊天机器人,我们创建了这个。你只需要去探索它。好的?我希望你们都去探索它。嗯,这是一个非常好的项目,已经被创建了,而且你也可以看到它的输出是如何出现的,对吧?只是试着理解我们是如何正确地组合了所有中间件的。对吧?然后我将创建一个单独的视频,讨论这个医疗保健聊天机器人。好的?但这将在后期。首先,你试着去理解它,然后我将试着去创建它。好的?嗯,但我希望你已经理解了这个视频。嗯,这就是我这边的全部内容。我将在下一个视频中见到你。祝你有美好的一天。谢谢大家。保重。