Transcription
您是否正在寻找构建人工智能代理并对如何设计人工智能代理有疑问?开发人工智能代理需要什么?我们何时以及如何准备好将我们的人工智能代理投入生产?或者,也许您只是想知道人工智能代理是什么。那么,这门课程就是为您准备的。我们将通过四个重要部分,探讨概念以及通过代码示例为生产准备代理应用程序。您可以在此处的链接中找到这些示例和一些文本说明。别担心,我会在整个课程中提醒您在哪里可以找到这些材料。万一您遇到任何困难,我们已在此处设置了一个专门的 Discord 频道。那么,让我们开始吧。好的,欢迎来到第一部分,即代理设计。因此,在本课中,我认为我们将在这里稍微概念化一些,因为所有好的代理都始于好的设计。所以,我们不会为这一部分进行任何实际编码,但在下一部分代理开发之前。我们在这里想做几件事。首先,我们要定义我们的用例。本课程的描述是从零到生产,我们希望这个代理准备好投入生产。所以,我们想确保它确实是人们会使用的东西。因此,我们希望为此有一个好的用例。我们还将看看人工智能代理可以在哪些方面帮助我们的用户及其问题。最后,我们将构建代理工作流。所以,我们实际上将在这里构建一个多代理解决方案。那么,每个代理如何交互,它们如何独立工作?所以,让我们先来了解一下人工智能代理到底是什么。如果您是完全的新手,没关系。如果您以前听过这个定义,您可能可以跳过这一部分。但本质上,人工智能代理是能够访问两样东西的大型语言模型。主要是通过函数、API、数据库等工具,这些工具已经是程序或应用程序的一部分,大型语言模型可以计划并决定使用这些元素。显然,这使它能够访问这些工具中的信息,以及像 MCP 服务器这样的 LLM 特定工具(我们稍后会讨论)和内存。内存非常重要,有两个不同的因素:一是显然要保持上下文,用户实际上在要求代理做什么,在这种情况下,或者以我们实际操作的这种方式,以及长期来看,代理对用户了解什么,这可能有助于做出决定或选择不同的工具。我将举一个例子。您知道旅行是一个很多人都在谈论的重大用例,您去不同的酒店,也许您对酒店有偏好。与其让人工智能代理从零开始,使用工具和可能的 API 请求来建议酒店,不如让它已经知道您喜欢的东西,您的偏好,并首先从内存中提取这些偏好,也许是不同的服务,然后调用工具来检索它。这就是人工智能代理的魔力,也是这些人工智能代理能够改进的能力。所以,您可能会遇到人工智能代理表现不如预期的情况,您会向代理或应用程序提供反馈,这些反馈也可以存储在内存中,这样代理就不会再犯同样的错误。再次,这是我们想要使用人工智能代理的非常有力的原因,即自我改进机制,但这仍然是一个非常基本的人工智能代理概念定义。但是,随着我们在这门课程中继续前进,我们将实际构建人工智能代理,您将实际看到所有这些元素如何结合起来,成为一个非常强大的解决方案,以应对我们现在将要讨论的用例,因为我们有一个用例,而且我认为,如果您曾经在某个地方工作过,您在新工作中,并且现在您将在这份工作中,那就是加入 Zava AI 工程团队。欢迎加入。就像任何新人一样,您可能会有一些不同的问题。虽然我们可能有非常静态的培训,以及提供信息的方式,但如何使用一个人工智能代理来协助您,并提供更动态的、实时的、最新的数据,并且在您寻找的信息类型方面具有灵活性呢?所以我认为我们将为这种用例涵盖三个要素,那就是您刚开始时,也许您想了解您的团队,也许想了解其他团队,对吧?这也是您开始新工作时会考虑的事情,我到底在和谁一起工作?所以,我们希望用户能够提出关于组织内员工的问题并获得信息。我们将稍微详细地讨论我们期望的这类问题,或者我们将为此设计的,但这第一个用例。第二个是关于培训。您可能想快速了解 Zava AI 工程的最佳实践以及我们使用的技术。也许我们雇佣了您,因为我们认为您有很大的潜力,但您并不了解一切,对吧?所以,您需要有良好的培训路径。而且,传统上,这些培训路径是静态的,是我们一直以来根据我们认为人们想要的东西提供的。但让我们做一些对您来说更个性化的东西。也许您可以确切地指导您想学什么,我们可以提取相关和最新的细节来做到这一点。而且,既然您将成为我们 AI 工程团队的一员,让我们也设一个代理来协助您进行编码。也许只是提供一些代码片段或生成与我们特定代码库相关的代码。所以,这将是我们的用例,通过构建一个人工智能代理来提供开发者入职解决方案。我们将如何做到这一点,以及我们将如何设计代理来实现这一点?这就是接下来的事情,我想提出这个框架,我称之为任务、工具和结果。基本上,您知道代理有任务,再次,这就是我们设计这些代理的方式以及它们拥有的职责,然后我们想设计我们认为它们需要完成这些任务的工具,最终结果是什么?再次,这些代理将为用户实现的成就是什么?所以我设计了三种不同的代理来决定这种类型。第一个是员工搜索代理,对吧?它的任务是回答任何与组织相关的问题。再次,假设我们想问谁在我的团队,他们在这里工作了多久。这类问题将是用户可能用来更好地了解他们的组织的问题。谁向谁汇报?这是一个经典的问题。那么,它实际上需要什么工具才能做到这一点?当然,这需要员工数据存储。所以,也许您拥有这个组织数据,也许这是一个 API,无论什么,但我们需要代理能够访问它来回答问题。这就是我们想要的主要结果。我们希望代理能够调用这个数据存储,查询这个数据存储,并检索这些问题的答案,然后以自然语言的方式呈现出来,而不是像 SQL 查询或一些 JSON 返回给您,而是以一种灵活的方式,并且能够引导用户提出更多类型的问题。这可能看起来很明显,但映射出来是很好的,因为当您映射出这个结果时,它使得向后工作工具更容易,因为现在我们有一个单一的工具,但我们可能需要多个工具。也许有不同位置的不同数据存储。所以,我们需要确保代理能够访问它,并且有权这样做。而且,回答与组织相关的问题非常重要。我们期望什么类型的问题,我们需要以一种方式映射它们,我们知道答案将在数据存储中,并且代理有能力做到这一点。所以,这是一个关于设计良好代理的通用框架,而且,为了继续讨论其他代理。我们还将拥有这个开发者培训代理。所以,这个开发者培训代理将能够根据用户的经验或他们想先学习的内容,为用户提供不同的培训路线图,我们认为他们需要学习什么。所以,我们将如何做到这一点?再次,因为这是其中一个主要的好处,我们将拥有最新的信息,我们将实际使用这个 Microsoft Learn MS um MCP 服务器。这个 MCP 服务器实际上能够直接从 Microsoft Learn 中提取文档,希望这些信息是最新的。所以,而不是从大型语言模型的训练数据中回答问题,您可能会意识到,人工智能的世界正在变化。我们有新的名称,新的技术,这些技术并不总是在大型语言模型的训练数据中。所以,拉取这个 MCP 服务器可以增强它,并为我们提供相关信息,这正是我们想要的,作为结果。我们想确保,如果需要,我们也可以测试和评估这些信息是否正确且准确,符合当前使用这些技术的方式。最后是这个编码代理。所以,您是 Zava AI 工程团队的一员,对吧?所以,您知道我们可能需要一些代码片段或入门的东西。然后,我们想要一个专门的模型,它可能在这方面表现得非常好。所以,这里的任务是提供自定义代码片段。不仅仅是获取文档或提供一些东西,而是我们可能想看看这项技术如何与其他技术集成,而编码代理应该能够为我们提供这些信息。然后,再次,我们将拥有一个工具,如果需要的话,那就是 MTP Learn 服务器或上下文,它基于任何被引入的内容,而且,我们也有一个工具,本质上是一个专业模型,但也有我们可以使用的工具,比如代码解释器,它允许代理自己运行代码,而我们想要的结果是提供相关的代码示例。所以,我们希望编码代理能够更加灵活,而不仅仅是拉取文档和现有的代码示例,而是根据用户的任何用例和任何需求来重新组合它们。所以,最后我们要做的就是实际构建它,看看它会是什么样子。我们在这里想要的就是一个图表,以便了解哪个代理将负责另一个代理,某个任务,这在谈论构建多代理解决方案时非常重要。所以,在这种情况下,我们有您,再次,我们可爱的 Zava AI 工程团队的新员工。我们实际上将在这门课程中与 Microsoft Agent Framework 合作,它已经内置了这个称为工作流的概念,而且,在下一课中,我们将深入研究代码本身,展示它是如何设置的,但为了给您一个概述,我们有一个分类或分类代理,它能够接收请求并根据该查询或问题将其交给相关的或正确的代理。在这种情况下,假设我们有一个说,“这里有人在 LinkedIn 工作过吗?”所以,用户在问,有人以前在 LinkedIn 工作过吗?也许他们来自 LinkedIn 本身。当然,这将被分类并由员工搜索代理处理,或者应该如此,因为这正是它所拥有的数据,因为它可能在数据存储中,我们拥有他们最后一份工作的角色。另一个可能的问题是,也许创建一些关于 Microsoft Agent Framework 的培训。正如我所说,此时 Microsoft Agent Framework 仍然相对较新。而且,我们想确保我们提取最新的信息,而不是一些听起来像 Agent Framework 的东西,或者一些嵌入在大型语言模型训练中的东西。所以,再次,这将是开发者培训代理,而且,我们可能需要某种路线图或某种理解,我们应该采取哪些步骤来学习这个框架。然后最后一个是我们想说,我们想创建一个使用 Microsoft Agent Framework 和 Foundry Agent Service 的代码片段。所以,也许文档或 GitHub 上已经有示例,或者类似的东西,但我们希望编码代理能够生成这些代码片段,因为我们想要一些比仅仅从文档中拉取确切示例更适合我们用例的东西。这就是代码示例所在。但是,我们可能会遇到这种情况,有人在询问培训,从开发者培训代理那里获得培训,然后还询问,好吧,让我们获取一些 Python 代码示例,或者更好地解释一下。这就是使用 Microsoft Agent Framework 的东西的魅力所在,我们允许这些代理在不一定返回分类代理的情况下相互交接,以传递上下文,然后将其交给编码代理。所以,我们将能够设计和开发一个场景,让这些代理相互交接。这使得它更加流畅,并使我们的用户在架构方面更加满意。但关于这些概念和形状的谈论已经够多了。现在让我们进入这门课程的下一部分,即代理开发。[清嗓子]好的。现在我们将更实际一些,开始构建我们刚才谈到的那些代理。首先我们需要做的是确定我们将使用的工具。所以,目前我们将使用 Python、Microsoft Foundry、Azure OpenAI 服务器作为 LLM,以及 Microsoft Agent Framework 进行编排。随着本课程的扩展,我们可能会提供其他选项和其他编程语言,但对于您将在这里看到的示例,这就是所使用的技术。而且,正如前面提到的,如果您想实际运行这些代码以及设置说明,您可以在那里的链接中找到,所以那是所有代码所在的代码库。而且,我再次鼓励您运行代码,玩弄它,弄坏它,这是学习的最佳方式,不仅仅是观看视频,当然也很受欢迎。但真正动手实践这项技术是入门的最佳方式。但一些技巧,只是从我们将在本课程中应用的内容,以及一般来说,当您刚开始时,基本上是首先开始,我们提出了这个多代理应用程序,但实际上我想提出的是,最好一次只关注一个代理,理解它是如何工作的,它为什么不起作用(不幸的是,有时),然后,我们可以继续,我们知道我们有这些代理独立工作,它们如何协同工作来完成特定的任务。另一个是关于创建专家。所以,很多时候当我们谈论多代理时,问题是,是的,但需要多少代理或什么类型的代理?您需要创建多少代理?而您真正想做的就是创建专家。我的意思是,如果您是一名开发者,您可能非常擅长编码工程,构建应用程序。您可能不擅长从事法律工作。我的意思是,也许您兼职做,但您不是这方面的专家。在许多不同领域都成为专家是很困难的。所以,当我们开始规划我们的多代理应用程序时,我们要做的第一件事就是创建这些专家,它们拥有非常关键的关注领域或任务领域,并且非常擅长完成这些任务,并具有非常具体的说明。稍后,也许您觉得不一定需要这种划分,您可以组合代理或组合任务,以适合您的应用程序。但一开始,这就是设计多代理应用程序的最佳方式。最后一个是尝试不同的模式。您知道,最后一个部分我刚刚涵盖了,我们稍微谈到了这个交接模式,这基本上是对我们用例的普遍理解。但有不同的模式,比如与代理并发工作,或者它们之间并行工作,您想探索,也许您最初认为您的用例需要一种模式,但一旦您真正进入开发过程,您就会发现其他模式可能对您实际为用户所做的事情更有效。所以,我一定会说,一定要探索,不要局限于一种模式。这些是一些技巧。让我们开始看代码,看看这些代理是如何运行的。好的。现在我们将看看第一个代理,即学习代理。基本上,我们将再次,所有这些代码都可以在代码库中找到。您可以看到如何设置以及如何运行代码。但有几件事。所以,我们将导入一些东西,即代理框架。所以,那是 Microsoft Agent Framework。以及这个托管的 MCP 工具。所以,再次,这个代理的作用是能够使用 Microsoft Learn MCP 服务器来获取有关 Microsoft 技术的最相关信息和文档。而我们想做的,当然是第一步,就是给代理这些指令。所以,基本上,您知道,说它们想使用 Microsoft Learn 文档来制定个性化的学习计划,但也要向代理明确,它们唯一要做的事情就是为此拉取这个 MCP 工具。特别是当用户要求学习某样东西时,我们希望能够提供这些学习计划。在给代理指令时,提供示例总是很有帮助的。所以,首先我们也想确保代理基本上提供个性化的学习路径。所以,我们也给代理一些关于一些问题的鼓励,无论是它们想学习的主题和技术,您现在的学习经验如何,您有多少时间投入,所有这些事情在我们起草培训路径时都很重要。然后,我们将让它研究这些内容,然后给出一些关于路径本身的指导,也许是向高级主题的进展,这个工具估计需要多长时间,然后通常是一些关于它的适用性的指导。最后也是最重要的,我们将呈现该计划以及任何先决条件和您将要学习的关键概念。这样用户就能完全理解所建议的材料。所以,它正在拉取我们的凭据,这将在代码库的设置部分进行介绍。基本上,然后我们将创建这个代理。所以,我们将给它一个名字。我给了它学习路径代理。指令,工具,基本上是学习 MCP 服务器,以及它的 URL,然后我们还将拥有这个审批模式,从不要求,因为在这种情况下,基本上代理只是调用 MCP 服务器来接收东西。但在您可能有的其他用例中,您可能希望用户批准,比如说,写一封电子邮件之类的。所以,在这种情况下,我们可以将此审批模式更改为始终要求或无(如果我们不发送任何内容),基本上它允许用户在它呈现该操作之前需要批准 MCP 服务器。我们还将做的另一件好事是使用这个 dev UI 服务器。所以,基本上,这允许我们以实际的聊天方式进行测试。所以,而不是仅仅运行这个文件并希望它起作用,我们实际上可以进入并玩弄它,在一个浏览器和聊天功能中,就像用户将拥有的那样。所以,我们稍后将查看所有这些代理,但我将继续查看我们拥有的其他代理。下一个是这个编码代理。所以,基本上,从指令的角度来看,这个代理将做什么,我们将给它编码专家编码助手。它们还将使用 GPT5 codec。这是一个非常专业的编码模型。再次,回到我之前说的,我们将首先创建这个专家,它将能够更好地执行这些编码任务,而不是通用模型。我们将给它一些基本的示例,例如步骤。首先理解请求,生成代码。解释您的代码,因为我们将在一个学习的环境中工作,这应该是为了帮助您或新员工入职。所以,我们想确保它能够做到这一点。然后,我们也确保代码质量,再次,我们不希望您在这里开始工作却不生成高质量的代码。所以,我们想确保他们使用变量名,以及在开发方面的最佳实践。然后,非常相似,我们将创建这个代理,指令在那里,但现在我们也可以指定模型,所以实际上在某些情况下,您想要专业模型,在这种情况下,我们将使用 GPG5 codecs。然后,再次,我们将使用这个 dev UI 服务器,所以那是编码代理,最后是员工搜索代理。在这种方式下,我们将基本上拥有,我们再次导入所有这些,但现在我们也有这个托管的文件搜索工具。而这允许我们指向任何类型的向量存储。在这种情况下,我们有一个脚本,我们将再次运行它,它将在设置中创建一个 Microsoft Foundry 上的向量存储,并基本上用一个 markdown 文件填充它,其中包含不同的员工详细信息等,以便我们以后能够回答这些问题。而且,这又将是一个更简单的指令,但是,您知道,说它们是 Zava 的员工搜索代理。它们有这些问题,这些示例问题,它们应该能够回答。然后,再次,我们将提供这个工具,您知道,再次,我们可以直接在这里将指令作为变量。然后,我们将提供这个工具,这个文件搜索工具。所以,现在我们有了三个代理。让我们看看它们是如何工作的。所以,现在您可以看到 dev UI,这是一个很好的工具,用于开发,能够交互、测试并查看您的代理是如何工作的。所以,我们将从员工搜索开始。假设我想问一个问题,这里有人在 LinkedIn 工作过吗?好的。所以,我们将看到第一个响应正在进行中,我们应该得到一些理解,实际的代理是什么,以及一些跟踪。所以,您看到是的,Zava 有员工在 LinkedIn 工作过,这很好。David Kim,他目前的职位是工程经理。以前的职位是高级机器学习经理。所以,我们可以看到它已经拉取了这些信息。我们可以看到它也从输出文本中提取了我们数据库中的实际信息。而且,如果您查看 GitHub 仓库中的 markdown 文件,这实际上是事实信息,而不是大型语言模型的训练数据中的信息。好的。最后但并非最不重要的,是编码代理。再次,编码代理使用特殊的编码模型 GP5 codeex 来生成代码并提供解释。所以,让我们在这里说,给我一些关于 Microsoft Agent Framework 的代码示例,对吧?所以,它应该生成一些漂亮的示例代码,以及 Python 中的代码,或者我在这里没有指定 int net,但如果您现在正在看这个,您可能会注意到一些事情,因为这只是开箱即用的 GP5 codeex 模型,没有增强,没有 MCP 服务器,没有其他代理,所以它只会生成它所知道的代码。而您将看到的是,您知道,Microsoft Agent,您可能会将其与 Microsoft Bot Framework 混淆,而我不是这个意思,我们在这门课程中不构建 Microsoft Bot Framework,但请继续,假设您做到了,是的,这里有所有东西,这就是为什么我们将构建这个编排。所以,我们可以让 Microsoft 学习路径代理专门负责开发学习路径,而当我们只需要编码代理时,除了其他事情之外,当编码代理需要学习路径代理来提供相关信息时,它会这样做。所以,这就是进行一些编排的价值所在。而这正是我们现在将在代码中以及示例中看到的。好的。所以,现在我们在这里进行编排示例。所以,您注意到与之前的示例有几处不同。我们现在还导入了 handoff builder。再次,这是 Microsoft Agent Framework 中的一个功能,允许我们构建这些交接工作流。然后,我们还将指定不同的代理,然后现在我们有了这个分类代理。所以,这是真正专注于协调的代理。所以,现在它主要是处理开发者的需求,理解开发者的需求,并将其路由到正确的专家。而且,这再次是交接模式所特有的。其他模式不一定需要协调器来做这件事,但它是一种好的方式,在指定和确保我们获得正确的责任,正确的任务给正确的代理方面。它还提供了一些关于如何做的描述,以及哪个代理是合适的。然后,我们也在这里展示,我们从后面复制粘贴了员工的文件搜索,用于学习的 MCP 工具,以及使用 codeex 代理进行编码。所以,这里真正大的区别是这个工作流,我们构建了它。让我们分解一下。再次,我们正在调用 handoff builder。我们将为此工作流命名。所以,这很重要。然后,我们还将定义参与者。这包括首先是分类代理,员工搜索代理,学习代理和编码代理。所以,这些只是参与此次交接的代理列表。但我们需要定义它们各自的角色以及谁能做什么。所以,首先是协调员。再次,这将是分类代理。它将为我们处理所有协调。然后,我们可以进行添加交接。这基本上是在代理之间建立关系。在这种情况下,我们有分类代理,它位于这个之外,因为它将负责交接和协调。然后,我们在这里的每个代理。这将是其中的一部分。但交接的独特之处在于,我们还可以让不同的代理相互交接,而无需通过分类代理建立连接。在这种情况下,我们正在这样做。我们允许学习代理在需要生成代码时调用编码代理或交接给编码代理。然后,我们有这个终止。所以,这只是一个额外的步骤,但它基本上允许我们说,在用户进行 20 次交互后,我们将终止这次交接或这次工作流。再次,这取决于您,取决于您的用例,您想做什么。尤其是在谈论生产应用程序时,您可能希望限制这些类型的事情,特别是从成本角度、安全角度来看,所以这是需要考虑的,而且您有能力这样做。然后,我们将构建这个工作流,再次,我们将要做的是,为了使其美观且可视化,我们将使用这个 dev UI,我们将传入这些实体,即实际的工作流,它将为我们提供一个很好的 UI 来实际查看工作流是如何进行的。所以,让我们把它拿出来。所以,现在我们在这里的 dev UI 中,因为我们将工作流作为实体传入,它为我们提供了一个很好的界面,我们可以看到代理将如何与我们的任务交互。所以,我们看到每个代理的名称,并且随着事情的进展,我们应该看到一些很好的跟踪。所以,我们将如何运行它,我们将点击右上角的配置和运行按钮。然后,我们将继续说,我想了解 Microsoft Agent Framework,对吧?而我们应该开始看到的是,首先,正如预期的那样,它将进入这个分类代理。而且,正如我们所设计的,分类代理应该能够解释这一点,然后理解手头的任务,那就是将其传递给学习代理。所以,您现在可以看到这一点,在右侧,我们还将看到一些输出文本,确切地说,它在说什么,以及用户,以及每个代理正在传递什么。在此之后,我们可以看到这个信息,现在我们看到对话是什么,然后我们也可以在这里看到文本,它正在传递所有信息,关于链接到 Microsoft Learn 和我们设计的学习路径。但我们也想说,让我们用 Python 和 ReactJS 创建一个代码示例。所以,[清嗓子]希望我们现在将看到的是,首先,它将进入分类代理。所以,在底部,但我们应该看到学习代理会尝试一下,或者在提供上下文方面。但正如在这个工作流中设计的,这将现在被交接给编码代理。而且,您可能还记得上次我们展示的是,编码代理对 Microsoft Agent Framework 一无所知,因为它不是您最初训练的一部分。而我们现在将看到的是编码代理的响应。所以,我们看到这里的路径,我们也看到一个很好的响应,让我们先深入研究,我们看到一些代码示例,这很好,正如计划的那样,实际上是 ReactJS 前端。所以,这里真正好的是展示工作流的力量,因为首先,那个任务从学习代理那里传来,学习代理没有返回分类代理,而是直接将其传递给编码代理来生成这个代码示例,使用 Microsoft Agent Framework,并为代理提供了上下文,所以它也提供了这些信息。所以,现在它是一个相关的代码示例,而且,根据我们的用例,现在这个新员工有一些很好的代码可以开始。所以,那就是,现在我们已经有了编排工作。让我们进行一些评估,并了解它是什么样的。所以,现在我们来到了本课程的代理评估部分。也许这是我们在实际构建人们会使用的人工智能代理时最重要的课程,因为我们想确保它们是优秀的人工智能代理,并且它们正在做我们设计它们要做的事情。所以,代理评估,我们将回答三个问题。为什么我们首先要进行评估。我希望你们大多数人已经看到了评估的价值。但以防万一,我们将稍微谈谈。我们实际上在评估什么?什么是指标?以及,我们如何确定它?而且,我们还将看看我们是如何评估的。所以,让我改变一下。我们是如何评估的。我们将通过代码来确切地看看我们是如何评估的。完美的。所以,让我们看看我们为什么首先要进行评估。我们早就谈过代理设计,并且我们已经清楚了我们期望代理拥有的任务、工具和结果。但您需要知道,我们的想法一旦我们将任何代理投入生产,就不总是现实的。这主要有两个原因。首先,我们正在使用大型语言模型。这些是确定性模型,有时我们想确保并为它们提供正确的上下文、基础和指令,但您输入一个输入,相同的输入和输出,您并不总是会得到相同的结果。所以,我们想确保我们正在评估并适应这一点,并且在结果不符合我们设计时具有可见性。我们也在与用户合作。再次,我们将输入我们期望的内容到这个聊天窗口。我们有期望的输入和场景,但用户不一定会以相同的方式工作。所以,我们想确保我们的系统,我们的代理系统能够适应这一点,无论是构建护栏,还是代理指令等等。所以,再次,我们确保我们匹配预期的结果。再次,这不像传统软件开发中的测试,它不是通过或失败。它更像是一个灰色区域。它是在理解代理的机会以及它们可能存在的风险方面的梯度。而这正是我们现在要看的。而这正是我们实际评估的内容。而这是几件事。所以,第一个是这些我们可以放入代码并运行测试或运行评估的指标。第一个是相关性。所以,这实际上是响应有多相关,或者代理生成的响应是否与任务相关,因为有时代理可能会以不同的方式解释任务或请求,并走上一条与任务无关的道路。也许这取决于输入,用户正在写什么,或者也许取决于代理的指令。所以,我们想确保我们能够评估这一点并获得一些可见性。下一个是基础性。这在处理从任何数据存储中提取数据的代理时确实非常相关。在这种情况下,我们有这个员工搜索代理。所以,我们想确保它实际上是从 markdown 文件或我们创建的向量存储中提取的,并且使这些答案正确,而不是仅仅提供一些可能在大语言模型训练数据中的东西。下一个是工具准确性。所以,就像我在前面一章中说的,我们谈论的是人工智能代理是什么,显然,人工智能代理最大的事情之一就是调用工具的能力,但在此之上是 LLM 的决策能力,基本上是选择与任务相关的正确工具。所以,我们也想看看,代理是否实际上正在做出并选择正确的工具来完成这个任务。再次,当您设计人工智能代理时,这也可以提供很好的见解,也许有类似的工具或工具的功能,我们发现工具的准确性很低,可能是因为我们有太多的相似工具,或者工具太多,我们无法分散 LLM 的注意力。最后一个是工具输出利用率。所以,是的,您可以调用工具。它会给您一些输出,一些响应,但人工智能代理是否会实际使用它来完成任务并实现我们设计的预期结果?所以,这四个指标是您可以设置的,而我们将如何做到这一点并进行设置,实际上是使用 Azure AI Evaluators。所以,让我们先看看代码,然后再进入终端查看评估。好的,我将直接进入我们这里的实际评估函数。其他大部分代码都非常相似。再次,您可以查看我们链接的 GitHub 仓库,以查找所有其他代码元素,但我想专注于评估方面。而这实际上是我们创建的 create evaluation 函数。而这里真正好的是,我们可以实际设置我们想要的不同的标准,或者我们拥有的不同的指标或评估。所以,这里我开发了这个相关性,基础性,工具准确性,然后是工具输出利用率。所以,基本上,我们可以根据需要命名它们。所以,您不必全部做。如果您想给它们起不同的名字,也可以。再次,这只会为您提供一些自定义,根据您的工作流或代理,然后我们有这个 eval 对象。所以,这实际上将创建评估。所以,它将首先采用我们评估的名称,数据源,这将是配置,然后是测试标准。所以,这实际上是我们在这里传递的,也就是所有这些评估。然后,我们将采用评估者姓名。我们将在终端中打印它们。我也会向您展示如何在 Microsoft Foundry 中查看它。然后,我们还需要定义并运行该评估。所以,我们将创建另一个名为 run evaluation 的函数。它将选择响应 ID。所以,它实际上是基于代理的响应。然后,我们将运行该评估。所以,我们有这个 eval create,它将接收这些响应和数据源并运行评估。然后,我们还将进行一些监控,以查看评估是否正在进行中,即使其中一个失败,我们也可以获得可见性。所以,这是一个很好的步骤,因为当您运行这些评估和大量数据时,您也想看到事情的完成情况,事情的失败情况,这可能是一个更长的过程,当您构建人工智能代理时,所以,拥有这个可见性集也很好。然后,最后是实际运行,您想运行什么样的查询。所以,我们这里有几个,我将只展示一个,关于“我是新人”,有人在微软工作过吗?但是,您可以看到,您可以将其制作成一个可以检索的文件,或者只是通过代码来完成。这将提取所有内容,关于您的查询,并运行每个评估,让每个评估运行一次。然后,这有点基础,但这实际上也带来了,我们想评估哪些代理,在这种情况下,就是所有代理。我们想确保,如果我们有一个场景,每个代理,比如一个代理需要进行交接,我们也可以做到。然后,我们正在设置模型等等。所以,首先我将向您展示它在终端中的样子,因为我们
这里有一些打印语句,只是为了让它看起来像这样,然后我将向您展示它在 Microsoft Foundry 中的样子,它也能为您提供更好的 UI 体验。所以现在我们在这里的终端,我将向您展示它看起来是什么样的。嗯,再说一遍,这基本上只是运行我们的 u 评估 uh agent eval python 文件,您应该会得到 uh 类似的输出。再说一遍,如果您更改了查询,它显然看起来会有点不同,但我们可以看到这里的响应是 cere uh summary。所以我们有两个代理,一个是分类代理,一个是员工搜索代理,因为查询是关于“我刚来这里。这里有人在微软工作过吗?”。您会看到,首先是分类代理的响应。他们有两个响应,然后是员工搜索代理有一个。我们可以看看这些响应是什么样的。所以,嗯,首先分类代理说,我已连接到正确的代理以了解此信息。员工搜索代理进来了。嗯,这里有几个人,他们是谁,然后我们可以看到他们响应的预览。我们至少有一位首席技术官,以前在微软工作过。这里真正重要的是,我们想展示的是,我们已经引入了评估者,又是四个,我们已经在代码中定义了,它将基于这两个响应运行,然后再次是监控部分,这在运行更大规模的评估方面非常棒。然后,我们可以看到至少有一个失败,一个通过了评估,总共有两个。所以很好的是,然后我们可以前往 Microsoft Foundry。它为我们提供了一个漂亮的 URL,我们可以直接在 UI 中看到它实际的样子。所以我们现在就去那里。好的。所以现在我们在 Microsoft Foundry 中,这是终端中提供的链接。所以我可以看到我的评估运行在这里。也很好。我可以看到一些关于我们在这里包含的完成令牌和提示令牌的数量,然后作为监督。所以我可以看到我们在相关性方面通过了两个中的两个,接地性,嗯,50%。所以一个,嗯,我们只做了两次调用。所以其中一个,嗯,失败了,然后是工具准确性 100%,以及工具输出利用率 50%。再次取决于您的用例。也许您看到这个并说,“好的,这足够了。我对这个视图很满意。”但真正好的是,我可以进去,实际上看到更多关于这些指标和结果是什么。我可以看到,嗯,也只是 JSON 格式的输入,然后也是为什么这个分数会发生的原因的输出。所以在这个例子中,我们有这个想法,嗯,员工搜索代理进去了,并且实际上打算提取关于员工的信息,而我们可以看到这里的响应,有几个人,嗯,一些 zava 电子邮件,所以看起来不错,但我们看到接地性失败了,如果我们看看它为什么在这里的错误细节,那就是主张可能是捏造的,基本上是微软内部的无响应员工,但没有提供工具输出或验证这些主张。所以也许我们需要看看这个代理,看看它是否真的从我们的员工搜索中提取信息,或者它是否没有,它只是在捏造这些员工,我们可以通过几种方式做到这一点。我们也可以进入数据库本身或数据存储,并验证这些确实是 Java 员工。并且还要确保在我们的代码中,实际的代理是从那里提取的,甚至可能看看我们想要输入指令的不同方式。这完全取决于我们。这再次是构建 AI 代理的科学或艺术。所以您想确保这是在案例中,嗯,首先是实际的,但这是一个很好的迹象,表明我们需要查看一些东西来调查一些东西,然后继续进行。所以完美。现在我们已经设计、编排、开发了代理,并且进行了一些评估,现在是时候看看我们想要做的一些元素,以便真正将其投入生产。好的,这是最后一部分。再说一遍,我最后一次这么说,但您可以在 GitHub 仓库中找到这段代码,您可以自己运行它,测试它,并且实际上会有更多关于如何在您那里运行托管代理的说明。但我只是想向您展示一些亮点。第一个是这个 YAML 文件。所以这基本上将帮助我们部署我们的 Azure 资源。所以我们有这个代理,基本上还有一些我们需要的容器本身,然后是我们需要的模型的部署。所以这可能会随着时间的推移而改变。所以我只是想简要地向您展示一下它的样子,并再次鼓励您查看仓库以确保您获得最新的代码。另一件事是这个代理 YAML。所以再说一遍,这是我们定义代理本身的方式。所以,嗯,我们有一个描述,这很好。作者是谁做得很好。我们将零到生产 AI 代理标签放在一起,因为您有其他 Azure 服务。然后这里重要的是,代理本身很可能会从环境变量中提取一些东西。所以我们想定义它是什么,它带来了什么,以及在哪里可以找到这些信息,以及它将要使用的所有资源。在这种情况下,它是 GPT40 模型,这取决于您。再说一遍,如果您查看 GitHub 仓库,也许这一行会改变,但再说一遍,这基本上是这个想法,我们有这些 YAML 文件来生成我们需要的资源,以及这个 main.py 文件,实际上是我们的托管代码或托管代理。在这种情况下,我们有这个学习代理,以及我们在这门课程中一直涵盖的代码,关于工具调用,提取这些东西。所以基本上我们正在将所有这些代码打包到一个开发容器中,抱歉,一个 Docker 容器中,并允许这些资源被部署。所以现在我们有了它,而不是将它托管在服务器本身上,我们可以使用这个 chatkit 服务器指向我们的托管代理,再次在容器本身中,然后我们可以实际调用它。所以现在我只是跳到后端代码,您将在仓库中再次看到它。但您会看到,嗯,我们提取了很多,嗯,checkit 服务器,我们正在使用这个 checkit 包,但不是把我们所有的托管代理代码都放在这里,我们只需要端点,这是我目前正在使用的端点,代理名称,再说一遍,这是我们在托管代理中部署的代理,再说一遍,这个托管版本真的很好。所以我们可以有不同的版本。我们可以替换它。想要,它使它真正从部署和立场来说,嗯,说我们处于生产环境中。看到代理不一定表现良好,因为它是一个新代理。我们可以,嗯,快速,嗯,将其更改为版本一,回到我们以前做过的东西。然后我们在这里提取了一些 check it 代码。再说一遍,这都是全新的。所以再说一遍,不要太关注确切的行,因为其中一些可能会随着时间的推移而改变。但再说一遍,这是采取的步骤,我们想运行它,然后,嗯,我们将引入这个代理,这是我们拥有的代理名称。它实际上是如何连接的?嗯,在前端代码中,您会看到我们有这个 URL,它是我们的 chatkit 服务器,它将位于 slash chatkit 下,然后,嗯,我们有一个小密钥来建立连接。但 chatkit 的好处在于,嗯,我们有我们想要的 API URL 等等,但我们也可以添加不同的前端元素。所以我们有一个很好的问候语和开始屏幕,并且,嗯,我们也将展示这一点,嘿用户,代理可以做什么。然后一般来说,我们可以有一些其他的东西,比如侧边栏内容处理这些东西,并且真的很简单,当我们想要引入聊天时,我们可以只使用这个 chat kit 组件,我们想要它有多大,并生成控件。所以它确实很容易构建前端。再说一遍,我们正在使用 Chadkit 和托管代理来部署这个,现在只需要将 chat it 服务器部署到您想要的地方,任何云提供商,也许是 Azure,希望是 Azure,以便使用这个服务器并将其投入生产,并且您拥有所有东西,包括部署它、监控它、更换版本,这正是我们想在这门课程中涵盖的内容。所以希望我们做得很好,涵盖了所有步骤,即首先是代理设计,其次是代理开发,第三是评估代理,然后第四是部署它。显然,我们没有涵盖代理世界的全部内容。但请在仓库上告诉我们任何问题,任何您想了解更多的问题,因为我们将继续开发这些内容。但感谢您的聆听,感谢您花时间与我一起学习如何构建 AI 代理,祝您旅途顺利。