第3章:RestGPT智能体

欢迎回来🐻‍❄️

在第1章:配置与环境中,我们为RestGPT配备了必要的"钥匙和密码";在第2章:OpenAPI规范(OAS)中,我们为它提供了与在线服务对话的"使用说明书"。

现在,我们需要一个超级智能的角色来真正阅读说明书、使用密钥,并规划如何实现我们的目标。

这就是RestGPT智能体的舞台

核心理念

假设你有一个复杂任务:“找出克里斯托弗·诺兰执导的所有电影,然后告诉我最受欢迎那部的上映日期”。这不是一步操作,而是需要多个步骤:

  1. 搜索克里斯托弗·诺兰的电影
  2. 筛选出最受欢迎的一部
  3. 获取其上映日期
  4. 告诉你最终答案

RestGPT智能体就是处理所有这些步骤的"超级智能助手"。它像是数字助理的项目经理——理解你的请求,将其分解,找到合适的在线"工具"(API),使用这些工具,并给出答案。它不只是执行单一操作,而是迭代式地(即逐步优化方法)朝着目标前进直至完成。

它是协调后续章节中所有小型"助手"的大脑:

  • 规划器(Planner):确定下一步逻辑步骤
  • API选择器(APISelector):为当前步骤选择合适的在线工具(API操作)
  • 调用器(Caller):实际使用在线工具
  • 响应解析器(ResponseParser):理解工具返回的信息

如何使用RestGPT智能体

使用RestGPT智能体非常简单,因为它是实现功能的主要交互组件。如果你运行过第1章的run.pyrun_tmdb.py脚本,就已经见过它的实际运作。

让我们回顾run.py脚本,看看RestGPT智能体是如何初始化和执行任务的:

# 来自run.py(简化版)
import os
import json
import yaml
from langchain import OpenAI
from langchain.requests import Requests
from model import RestGPT # 导入RestGPT智能体!
from utils import reduce_openapi_specdef main():# 1. 加载配置(来自第1章)config = yaml.load(open('config.yaml', 'r'), Loader=yaml.FullLoader)os.environ["OPENAI_API_KEY"] = config['openai_api_key']# ...其他配置设置# 2. 加载并简化OpenAPI规范(来自第2章)with open("specs/tmdb_oas.json") as f:raw_tmdb_api_spec = json.load(f)api_spec = reduce_openapi_spec(raw_tmdb_api_spec, only_required=False)# 3. 准备API请求发送器(对Caller很重要)access_token = os.environ["TMDB_ACCESS_TOKEN"]headers = {'Authorization': f'Bearer {access_token}'}requests_wrapper = Requests(headers=headers)# 4. 初始化"大脑"(大语言模型)llm = OpenAI(model_name="text-davinci-003", temperature=0.0, max_tokens=700)# 5. 初始化RestGPT智能体!rest_gpt = RestGPT(llm=llm,api_spec=api_spec,scenario='tmdb', # 或'spotify'requests_wrapper=requests_wrapper,simple_parser=False)# 6. 给RestGPT智能体下达指令!query = "告诉我索菲亚·科波拉执导的电影数量"print(f"查询: {query}")# 魔法在此发生!rest_gpt.run(query)if __name__ == '__main__':main()

解释:

  1. config.yaml加载密钥并进行设置
  2. 加载并简化API说明书(tmdb_oas.json)
  3. 创建requests_wrapper,这是一个知道如何安全向在线服务发送请求的助手,使用我们的access_token
  4. 设置llm,即作为语言理解和决策核心"大脑"的大语言模型(如OpenAI的GPT-3)
  5. 最后创建RestGPT实例——我们的智能助手!我们向它传递语言模型(llm)、简化版API说明书(api_spec)、场景(tmdbspotify)以及requests_wrapper以便发送API调用
  6. 只需用我们的请求调用rest_gpt.run(query),RestGPT智能体就会接管后续工作!

当调用rest_gpt.run(query)时,RestGPT智能体会:

  • 分析查询:“索菲亚·科波拉执导的电影数量”
  • 将其分解:“找到索菲亚·科波拉的ID”、“通过该ID查找电影”、“统计数量”
  • 逐步调用各种API(如/search/person/discover/movie)
  • 处理每次API调用的结果
  • 整合信息提供最终答案

RestGPT智能体内部:协调者

RestGPT智能体如何管理所有这些复杂步骤?它作为协调者,不断决定下一步最佳行动,并将任务委派给专门的"助手"。

以下是其工作方式的高层概览:

在这里插入图片描述

现在让我们看看model/rest_gpt.pyRestGPT类实现这一协调的代码。

RestGPT类基于langchain库的Chain概念构建,这是一种将不同步骤或"链"连接在一起的方式。

1. 初始化协调团队(助手)

创建RestGPT对象时,会立即初始化其关键助手:PlannerAPISelectorCaller(包含ResponseParser)在需要时动态创建。

# 来自model/rest_gpt.py(简化的__init__方法)
from .planner import Planner
from .api_selector import APISelector
# ...其他导入class RestGPT(Chain):# ...(如llm、api_spec、scenario等属性)def __init__(self,llm: BaseLLM,api_spec: ReducedOpenAPISpec,scenario: str,requests_wrapper: RequestsWrapper,simple_parser: bool = False,# ...其他参数) -> None:# 创建规划器助手planner = Planner(llm=llm, scenario=scenario)# 创建API选择器助手api_selector = APISelector(llm=llm, scenario=scenario, api_spec=api_spec)# 将这些助手传递给父类Chain的构造函数super().__init__(llm=llm, api_spec=api_spec, planner=planner, api_selector=api_selector, scenario=scenario, requests_wrapper=requests_wrapper, simple_parser=simple_parser, # ...其他参数)

解释RestGPT__init__方法如同组建团队。它创建PlannerAPISelector实例,为它们提供共享的语言模型(llm)和API说明书(api_spec)。这为智能体开始规划和选择工具做好准备。

2. 迭代循环(_call方法)

RestGPT智能体的核心逻辑位于其_call方法内(由rest_gpt.run()调用)。该方法实现了"规划、执行、观察、重新规划"的迭代循环。

# 来自model/rest_gpt.py(简化的_call方法)
import time
import logging
# ...其他导入
from .caller import Caller # 调用器在循环内部创建logger = logging.getLogger(__name__)class RestGPT(Chain):# ...(前面的代码)...def _call(self,inputs: Dict[str, Any],# ...其他参数) -> Dict[str, Any]:query = inputs['query'] # 用户的指令planner_history: List[Tuple[str, str]] = [] # 存储过去的计划和结果iterations = 0start_time = time.time()# 步骤1:初始规划plan = self.planner.run(input=query, history=planner_history)logger.info(f"规划器: {plan}")# 循环:持续规划和执行直至任务完成或达到限制while self._should_continue(iterations, time.time() - start_time):# 步骤2:基于当前计划选择APIapi_selector_background = self._get_api_selector_background(planner_history)api_plan = self.api_selector.run(plan=plan, background=api_selector_background)# 步骤3:执行API调用(或记录无需API调用的情况)finished = re.match(r"No API call needed.(.*)", api_plan)if not finished:executor = Caller( # 在此创建调用器!llm=self.llm, api_spec=self.api_spec, scenario=self.scenario,simple_parser=self.simple_parser, requests_wrapper=self.requests_wrapper)execution_res = executor.run(api_plan=api_plan, background=api_selector_background)else:execution_res = finished.group(1) # 如无需API,这就是最终答案# 步骤4:记录发生的情况并更新历史planner_history.append((plan, execution_res))# 步骤5:从规划器获取下一步计划,使用所有过去历史plan = self.planner.run(input=query, history=planner_history)logger.info(f"规划器: {plan}")# 检查规划器是否指示任务完成if self._should_end(plan):breakiterations += 1return {"result": plan} # 来自规划器的最终答案

解释:这个_call方法是RestGPT智能体的核心。

  • 它首先要求Planner基于你的query提供初始plan
  • 然后进入while循环,持续至任务完成或达到最大步骤数/时间
  • 在循环内部:
    • 要求API Selector为当前plan找到正确的API操作
    • 然后创建Caller(内部包含Response Parser)执行该API调用
    • API调用的结果(execution_res)被记录到planner_history中。这个planner_history至关重要,因为它让RestGPT智能体"记住"之前的步骤及其结果
    • 最后要求Planner基于更新的planner_history提供下一步plan,使Planner能智能地根据已发生情况优化方法
  • 循环持续直至Planner指示"最终答案"已准备就绪

这种"规划、选择、调用、学习、重新规划"的持续循环,使得RestGPT智能体能够处理复杂的多步骤任务。

结论

现在你已经认识了RestGPT背后的主脑:RestGPT智能体

这个协调者接收你的高层指令,将其分解为可管理的步骤,并协调专门的助手们(规划器、API选择器、调用器和响应解析器)来实现目标。

通过理解其迭代本质,你掌握了RestGPT如何智能地导航和交互多样化在线服务的核心机制。

接下来,我们将深入探索这些专门助手中的第一个:规划器,它负责为RestGPT智能体绘制行动路线图

下一章:规划器


概述

RestGPT智能体是一个协调复杂任务执行的AI系统,能够分解多步操作并动态调用API实现目标。它由以下核心组件构成:

  • 规划器(Planner):将用户查询分解为逻辑步骤
  • API选择器(APISelector):为每个步骤匹配合适API工具
  • 调用器(Caller):执行API请求
  • 响应解析器(ResponseParser):处理API返回结果

智能体采用迭代式工作流程:

  1. 接收用户查询
  2. 生成执行计划
  3. 选择并调用API
  4. 分析结果
  5. 根据结果调整计划直至任务完成

使用示例:

rest_gpt = RestGPT(llm=OpenAI模型,api_spec=API规范,scenario='tmdb',requests_wrapper=请求处理器
)
rest_gpt.run("查询诺兰导演的最受欢迎电影上映日期")

智能体通过协调各模块实现复杂任务自动化,大幅简化了多API调用的流程。

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

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

相关文章

笔记本电脑Windows+Ubuntu 双系统,Ubuntu无法挂载Windows的硬盘 报错问题解决

目录 一、前情提要 二、解决方案步骤 第一步:进入Windows进行修复和检查。这是最关键的一步,目的是让Windows来检查和修复它自己的文件系统。 第二步:回到Ubuntu验证挂载 三、总结与预防 一、前情提要 网上找到许多解决方案&#xff0c…

加密货币与区块链:六大刑事重灾区

高鹏律师(首席数据官)数字经济团队创作,AI辅助在数字货币的世界里,一夜暴富的传说屡见不鲜,但顷刻间失去所有的悲剧也时有发生,现在,我将为您剖析加密货币与区块链领域的六大刑事风险重灾区&…

Spring Ai 1.0.1中存在的问题:使用MessageChatMemoryAdvisor导致System未被正确的放在首位

使用MessageChatMemoryAdvisor导致System未被正确的放在首位 如下是使用Spring Ai实现多轮对话的官方例子(文档地址:https://docs.spring.io/spring-ai/reference/api/chat-memory.html):AutowiredChatMemoryRepository chatMemor…

全景式综述|多模态目标跟踪全面解析:方法、数据、挑战与未来

【导读】 目标跟踪(Visual Object Tracking, VOT)一直是计算机视觉领域的核心问题之一,广泛应用于自动驾驶、无人机监控、人机交互等场景。随着单模态方法在复杂环境下逐渐遇到瓶颈,多模态视觉目标跟踪(Multi-Modal V…

怎么用pytorch训练一个模型,并跑起来

MNIST 手写数字识别 任务描述 MNIST 手写数字识别是机器学习和计算机视觉领域的经典任务,其本质是解决 “从手写数字图像中自动识别出对应的数字(0-9)” 的问题,属于单标签图像分类任务(每张图像仅对应一个类别&#x…

Qt应用程序发布方式

解决的问题:在自己电脑上用QT Creator编译的exe文件放到其他电脑上不能正常打开的问题。1、拷贝已经编译好的exe应用程序到桌面文件夹。桌面新建文件夹WindowsTest,并且将编译好的软件WindowTest.exe放入此文件夹中。2、在此文件夹空白处按住Shift再点击…

Linux 软件编程(九)网络编程:IP、端口与 UDP 套接字

1. 学习目的实现 不同主机之间的进程间通信。在 Linux 下,进程间通信(IPC)不仅可以发生在同一台主机上,也可以通过网络实现不同主机之间的通信。要做到这一点,必须同时满足以下两个条件:物理层面&#xff1…

5.Kotlin作用于函数let、run、with、apply、also

选择建议 需要返回值:使用 let、run 或 with配置对象:使用 apply附加操作:使用 also非空检查:使用 let链式调用:使用 let 或 run Kotlin作用域函数详解 概述 Kotlin提供了5个作用域函数:let、run、with、ap…

嵌入式学习日记(32)Linux下的网络编程

1. 目的不同主机,进程间通信。2. 解决的问题1). 主机与主机之间物理层面必须互联互通。2.) 进程与进程在软件层面必须互联互通。IP地址:计算机的软件地址,用来标识计算机设备 MAC地址:计算机的硬件地址&…

C#_接口设计:角色与契约的分离

2.3 接口设计:角色与契约的分离 在软件架构中,接口(Interface)远不止是一种语言结构。它是一份契约(Contract),明确规定了实现者必须提供的能力,以及使用者可以依赖的服务。优秀的接…

vsCode或Cursor 使用remote-ssh插件链接远程终端

一、Remote-SSH介绍Remote-SSH 是 VS Code 官方提供的一个扩展插件,允许开发者通过 SSH 协议连接到远程服务器,并在本地编辑器中直接操作远程文件,实现远程开发。它将本地编辑器的功能(如语法高亮、智能提示、调试等)与…

C语言实战:从零开始编写一个通用配置文件解析器

资料合集下载链接: ​https://pan.quark.cn/s/472bbdfcd014​ 在软件开发中,我们经常需要将一些可变的参数(如数据库地址、端口号、游戏角色属性等)与代码本身分离,方便日后修改而无需重新编译整个程序。这种存储配置信息的文件,我们称之为配置文件。 一、 什么是配置…

车机两分屏运行Unity制作的效果

目录 效果概述 实现原理 完整实现代码 实际车机集成注意事项 1. 显示系统集成 多屏显示API调用 代码示例(AAOS副驾屏显示) 2. 性能优化 GPU Instancing 其他优化技术 3. 输入处理 触控处理 物理按键处理 4. 安全规范 驾驶员侧限制 乘客侧…

vivo“空间计算-机器人”生态落下关键一子

出品 | 何玺排版 | 叶媛不出所料,vivo Vision热度很高。从21号下午发布到今天(22号),大众围绕vivo Vision探索版展开了多方面的讨论,十分热烈。从讨论来看,大家现在的共识是,MR行业目前还处于起…

Azure TTS Importer:一键导入,将微软TTS语音接入你的阅读软件!

Azure TTS Importer:一键导入,将微软TTS语音接入你的阅读软件! 文章来源:Poixe AI 厌倦了机械、生硬的文本朗读?想让你的阅读软件拥有自然流畅的AI语音?今天,我们将为您介绍一款强大且安全的开…

用过redis哪些数据类型?Redis String 类型的底层实现是什么?

Redis 数据类型有哪些? 详细可以查看:数据类型及其应用场景 基本数据类型: String:最常用的一种数据类型,String类型的值可以是字符串、数字或者二进制,但值最大不能超过512MB。一般用于 缓存和计数器 Ha…

大视协作码垛机:颠覆传统制造,开启智能工厂新纪元

在东三省某食品厂的深夜生产线上,码垛作业正有序进行,却不见人影——这不是魔法,而是大视协作码垛机器人带来的现实变革。在工业4.0浪潮席卷全球的今天,智能制造已成为企业生存与发展的必由之路。智能码垛环节作为产线的关键步骤&…

c# 保姆级分析继承详见问题 父类有一个列表对象,子类继承这个列表对象并对其进行修改后,将子类对象赋值给父类对象,父类对象是否能包含子类新增的内容?

文章目录 深入解析:父类与子类列表继承关系的终极指南 一、问题背景:从实际开发困惑说起 二、基础知识回顾:必备概念理解 2.1 继承的本质 2.2 引用类型 vs 值类型 2.3 多态的实现方式 三、核心问题分析:列表继承场景 3.1 基础代码示例 3.2 关键问题分解 3.3 结论验证 四、深…

tensorflow-gpu 2.7下的tensorboard与profiler插件版本问题

可行版本: python3.9.23cuda12.0tensorflow-gpu2.7.0tensorboard2.20.0 tensorboard-plugin-profile 2.4.0 问题描述: 1. 安装tensorboard后运行tensorboard --logdirlogs在网页中打开,发现profile模块无法显示,报错如下&#x…

数据结构青铜到王者第一话---数据结构基本常识(1)

目录 一、集合框架 1、什么是集合框架 2、集合框架的重要性 2.1开发中的使用 2.2笔试及面试题 3、背后涉及的数据结构以及算法 3.1什么是数据结构 3.2容器背后对应的数据结构 3.3相关java知识 3.4什么是算法 3.5如何学好数据结构以及算法 二、时间和空间复杂度 1、…