您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。[谷歌]:2025年Agents与基础应用白皮书 - 发现报告

2025年Agents与基础应用白皮书

信息技术2025-01-07-谷歌落***
AI智能总结
查看更多
2025年Agents与基础应用白皮书

作者:Julia Wiesinger, Patrick Marlow和Vladimir Vuskovic 致谢 审稿人和贡献者 Evan HuangEmily XueOlcan SercinogluSebastian RiedelSatinder BavejaAntonio GulliAnant Nawalgaria 策展人和编辑 安东尼奥·古利Anant Nawalgaria格雷斯·莫⾥森 技术作家乔伊·海梅克 设计师迈克尔·兰宁 目录 介绍4 认知架构:代理⼈如何运作8 ⼯具:我们与外界的钥匙 ⽰例扩展15 LangChain快速⼊⻔指南35 在Vertex AI代理程序中应⽤于⽣产环境38 总结40 尾注42 这种推理、逻辑和对外部信息的访问相结合,与⽣成式⼈⼯智能模型相关联,激发了代理概念。 介绍 ⼈类擅⻓于混乱的模式识别任务。然⽽,他们经常依赖⼯具 - 如书籍、⾕歌搜索或计算器 - 来补充他们的先前知识,然后得出结论。就像⼈类⼀样,⽣成式⼈⼯智能模型可以被训练使⽤⼯具来访问实时信息或建议现实世界中的⾏动。例如,⼀个模型可以利⽤数据库检索⼯具来访问特定信息,⽐如客⼾的购买历史,以便为其⽣成定制的购物建议。或者,基于⽤⼾的查询,模型可以发起各种API调⽤,以向同事发送电⼦邮件回复或代表您完成财务交易。为了做到这⼀点,模型不仅需要访问⼀套外部⼯具,还需要有计划地执⾏任何任务的能⼒, 这种推理、逻辑和对外部信息的访问相结合,与⽣成式⼈⼯智能模型相关联,激发了代理的概念,或者说⼀个超越⽣成式⼈⼯智能模型独⽴能⼒的程序。本⽩⽪书将更详细地探讨所有这些及其相关⽅⾯。 什么是代理? 以其最基本的形式⽽⾔,⽣成式⼈⼯智能代理可以被定义为⼀种应⽤,它通过观察世界并利⽤⼿头的⼯具采取⾏动来尝试实现⼀个⽬标。代理是⾃治的,可以独⽴于⼈类⼲预,尤其是在提供适当的⽬标或⽬标以供实现时。代理也可以积极主动地努⼒实现他们的⽬标。即使在没有来⾃⼈类的明确指令集的情况下,代理也可以推理出下⼀步该做什么来实现其最终⽬标。尽管⼈⼯智能中代理的概念⾮常普遍⽽强⼤,但本⽩⽪书着重于⽣成式⼈⼯智能模型在出版时能够构建的特定类型的代理。 为了理解代理的内部运作,让我们⾸先介绍驱动代理⾏为、动作和决策的基础组件。这些组件的组合可以被描述为⼀种认知架构,通过这些组件的混合和匹配可以实现许多这样的架构。 关注核⼼功能,⼀个代理的认知架构中有三个必要组件,如图1所⽰。 模型 在代理范围内,模型指的是将被⽤作代理过程中央决策者的语⾔模型(LM)。代理使⽤的模型可以是⼀个或多个规模任意⼤⼩(⼩型/⼤型)的LM,能够遵循基于指令的推理和逻辑框架,例如ReAct、Chain-of-Thought或Tree-of-Thoughts。模型可以是通⽤型、多模式的,或者根据特定代理架构的需求进⾏微调。为了获得最佳的⽣产结果,您应该利⽤最适合您期望的最终应⽤程序的模型,并且最好是已经训练过与您计划在认知架构中使⽤的⼯具相关的数据特征。值得注意的是,模型通常不会根据代理的特定配置设置(即⼯具选择、编排/推理设置)进⾏训练。然⽽,通过为模型提供展⽰代理能⼒的⽰例,包括代理在各种情境中使⽤特定⼯具或推理步骤的实例,可以进⼀步完善模型以适应代理的任务。 工具 尽管基础模型在⽣成⽂本和图像⽅⾯令⼈印象深刻,但由于⽆法与外部世界进⾏交互,因此受到限制。⼯具弥合了这⼀差距,赋予代理⼈与外部数据和服务交互的能⼒,同时解锁了除基础模型本⾝之外更⼴泛的⾏动范围。⼯具可以采取各种形式,具有不同的复杂度,但通常与常⻅的WebAPI⽅法(如GET,POST,PATCH和DELETE)相⼀致。例如,⼀个⼯具可以更新数据库中的客⼾信息或获取天⽓数据以影响代理向⽤⼾提供的旅⾏建议。有了⼯具,代理可以访问和处理现实世界的信息。这使它们能够⽀持更专业的系统,如检索增强⽣成(RAG),这显著扩展了代理的能⼒,超出了基础模型本⾝可以实现的范围。我们将在下⾯更详细地讨论⼯具,但最重要的是要了解⼯具弥合了代理的内部能⼒与外部世界之间的差距,从⽽打开了更⼴泛的可能性。 编排层 编排层描述了⼀个循环过程,规定了代理如何接收信息,进⾏⼀些内部推理,并利⽤该推理指导其下⼀步⾏动或决策。⼀般情况下,这个循环将继续,直到代理达到其⽬标或⼀个停⽌点。编排层的复杂性可以根据代理和任务的不同⽽⼤不相同。有些循环可能只是简单的计算和决策规则,⽽其他循环可能包含链接逻辑、涉及其他机器学习算法或实现其他概率推理技术。我们将在认知架构部分更详细地讨论代理编排层的详细实施。 代理 vs. 模型 为了更清晰地理解代理与模型之间的区别,请考虑以下图表: 认知架构:代理程序的运作方式 想象⼀个繁忙厨房⾥的厨师。他们的⽬标是为餐厅顾客制作美味佳肴,这涉及⼀定的计划、执⾏和调整循环。 Agents • 他们搜集信息,如顾客的订单以及⻝材存放在哪些位置,包括冰箱和厨房。 • 他们根据刚刚收集到的信息对可以创造的菜肴和⼝味进⾏⼀些内部推理。 • 他们开始采取⾏动制作菜肴:切菜、调配⾹料、煎炒⾁类。 在整个过程中,厨师根据需要进⾏调整,随着⻝材减少或接收到顾客反馈,完善他们的计划,并利⽤先前的结果来确定下⼀步的⾏动计划。这种信息获取、规划、执⾏和调整的循环描述了厨师采⽤的独特认知架构,帮助他们达到⽬标。 就像厨师⼀样,代理可以使⽤认知架构通过迭代处理信息、做出明智决策,根据先前输出完善下⼀步⾏动来实现⽬标。代理认知架构的核⼼在于编排层,负责维护记忆、状态、推理和规划。它使⽤不断发展的提⽰⼯程领域和相关框架来引导推理和规划,使代理能够更有效地与环境交互并完成任务。提⽰⼯程框架和语⾔模型的任务规划领域的研究正在快速发展,产⽣了各种有前景的⽅法。虽然不是穷尽列表,但以下是本出版物发表时最受欢迎的⼀些框架和推理技术: ReAct是⼀个提⽰⼯程框架,为语⾔模型提供思维过程策略,以便理解⽤⼾查询并作出反应,有时候会包括上下⽂⽰例。ReAct提⽰已被证明胜过多个最先进基准,并提⾼了LLMs的⼈类互操作性和可信度。• Chain-of-Thought (CoT) 是⼀种提⽰⼯程框架,通过中间步骤实现推理能⼒。CoT有各种⼦技术,包括⾃⼀致性、主动提⽰和多模态CoT,每种技术都有优势和劣势,取决于具体应⽤。• Tree-of-thoughts (ToT) 是⼀种提⽰⼯程框架,⾮常适合探索或战略前瞻任务。它概括了链式思维提⽰,并允许模型探索各种思维链,这些思维链可以作为语⾔模型解决⼀般问题的中间步骤。• 代理可以利⽤上述推理技术之⼀,或许多其他技术,为给定的⽤⼾请求选择下⼀个最佳操作。例如,让我们考虑⼀个代理,它被编程使⽤ReAct框架为⽤⼾查询选择正确的操作和⼯具。事件顺序可能是这样的: 1⽤⼾向代理发送查询 2代理开始ReAct序列 3代理向模型提供提⽰,询问其⽣成下⼀个 ReAct 步骤及相应输出: 问题:用户查询中的输入问题,提供提示a思考:模型对接下来该做什么的想法b动作:模型对下⼀步要采取的⾏动的决定 ic在这⾥可以进⾏⼯具选择ii. 例如,动作可以是 [航班、搜索、编码、⽆] 中的⼀个,其中前3个代表模型可以选择的已知⼯具,最后⼀个代表“不选择⼯具”3代表模型可以选择的已知⼯具,最后⼀个代表“不选择⼯具” 行动输入:模型决定向工具提供哪些输入(如果有的话)d 观察:⾏动/⾏动输⼊序列的结果 ie 这个思考/⾏动/⾏动输⼊/观察可能根据需要重复 N 次 最终答案:模型向原始用户查询提供的最终答案f 4ReAct 循环结束,并向⽤⼾提供最终答案 如图2所⽰,模型、⼯具和代理配置共同提供了⼀个扎实⽽简洁的答复,该答复基于⽤⼾最初的查询。虽然模型可以根据其先前的知识猜测答案(幻觉),但它选择使⽤⼀个⼯具(航班)来搜索实时外部信息。这些额外的信息被提供给模型,使其能够基于真实的事实数据做出更明智的决策,并将这些信息总结回⽤⼾。 总的来说,代理响应的质量可以直接与模型在理性和⾏动⽅⾯处理这些各种任务的能⼒相关联,包括选择正确⼯具的能⼒以及⼯具的定义程度。就像⼤厨⽤新鲜⻝材精⼼烹饪菜肴并关注顾客反馈⼀样,代理依靠合理推理和可靠信息提供最佳结果。在接下来的部分中,我们将深⼊探讨代理与新鲜数据连接的各种⽅式。 工具:连接外部世界的关键 虽然语⾔模型擅⻓处理信息,但缺乏直接感知和影响现实世界的能⼒。这限制了它们在需要与外部系统或数据进⾏交互的情况下的有⽤性。这意味着,在某种意义上,语⾔模型只是根据从训练数据中学到的知识⽽已。但⽆论我们向模型提供多少数据,它们仍然缺乏与外部世界交互的基本能⼒。那么我们如何赋予我们的模型与外部系统实时、上下⽂感知的交互能⼒呢?功能、扩展、数据存储和插件都是提供这⼀关键能⼒给模型的⽅式。 虽然它们有很多不同名称,但⼯具是连接我们基础模型和外部世界之间的纽带。这种与外部系统和数据的连接使得我们的代理能够执⾏更多种类的任务,并且更加准确可靠。例如,⼯具可以使代理调整智能家居设置,更新⽇历,从数据库中获取⽤⼾信息,或根据特定指令发送电⼦邮件。 截⽌本出版⽇期,Google 模型能够与三种主要⼯具类型进⾏交互:扩展、功能和数据存储。通过为代理配备⼯具,我们释放了它们理解世界并对其采取⾏动的巨⼤潜⼒,为许多新应⽤和可能性打开了⼤⻔。 扩展 理解扩展的最简单⽅式是将其视为以标准化⽅式桥接API和代理的⽅式,允许代理⽆缝执⾏API,⽽不考虑其基础实现。假设您构建了⼀个旨在帮助⽤⼾预订航班的代理。您知道您希望使⽤Google Flights API获取航班信息,但您不确定如何让您的代理调⽤此API端点。 ⼀种⽅法是实现⾃定义代码,该代码将接收的⽤⼾查询,解析查询以获取相关信息,然后进⾏API调⽤。例如,在航班预订⽤例中,⽤⼾可能会说“我想要从奥斯汀到苏黎世订⼀张⻜机票。”在这种情况下,我们的⾃定义代码解决⽅案需要从⽤⼾查询中提取“奥斯汀”和“苏黎世”作为相关实体,然后再尝试进⾏API调⽤。但是,如果⽤⼾说“我想要去苏黎世订⼀张⻜机票”⽽没有提供出发城市怎么办?缺少必要数据会导致API调⽤失败,需要实现更多代码来捕获这类边缘和特殊情况。这种⽅法不具备可扩展性,很容易在超出实现的⾃定义代码范围的任何情况下出现故障。 更具韧性的⽅法是使⽤扩展。扩展通过以下⽅式弥合了代理和API之间的差距: 1。通过⽰例教导代理如何使⽤API端点。 2。教导代理成功调⽤API端点所需的参数或参数是什么。 扩展可以独⽴制作,但应作为代理配置的⼀部分提供。代理在运⾏时使⽤模型和⽰例来决定哪个扩展,如果有合适于解决⽤⼾查询的,这凸显了扩展的⼀个关键优势,即内置⽰例类型,允许代理动态选择最适合任务的扩展。 就像软件开发⼈员在解决⽤⼾问题时决定使⽤哪些 API 端点⼀样。如果⽤⼾想要订机票,开发⼈员可能会使⽤ Google Flights API。如果⽤⼾想知道最近的咖啡店距离他们的位置有多远,开发⼈员可能会使⽤ Google Maps API。Agent / model stack 也是这样使⽤⼀组已知扩展来决定哪个最适合⽤⼾的查询。如果想看到扩展的操作,可以尝试在 Gemini 应⽤程序上测试它们,⽅法是转到设置 > 扩展,然后启⽤您想测试的任何扩展。例如,您可以启⽤ Google Flights 扩展,然后问 Gemini “显⽰下周五从奥斯汀到苏黎世的航班。” 示例扩展 为了简化扩展的使⽤,Google 提供了⼀些开箱即⽤的扩展,可以快速导⼊到您的项⽬中,并以最少的配置使⽤。例如,在代码⽚段 1 中的 Code Interpreter 扩展允许您从⾃然语⾔描述中⽣成和运⾏ Python 代码。 Python import vertexai import pprint PROJECT_ID = "YOUR_PROJECT_ID"REGION = "us-cen