[RestGPT] RestGPT智能體

第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、…