第3章:RestGPT智能體
歡迎回來🐻???
在第1章:配置與環境中,我們為RestGPT配備了必要的"鑰匙和密碼";在第2章:OpenAPI規范(OAS)中,我們為它提供了與在線服務對話的"使用說明書"。
現在,我們需要一個超級智能的角色來真正閱讀說明書、使用密鑰,并規劃如何實現我們的目標。
這就是RestGPT智能體的舞臺
核心理念
假設你有一個復雜任務:“找出克里斯托弗·諾蘭執導的所有電影,然后告訴我最受歡迎那部的上映日期”。這不是一步操作,而是需要多個步驟:
- 搜索克里斯托弗·諾蘭的電影
- 篩選出最受歡迎的一部
- 獲取其上映日期
- 告訴你最終答案
RestGPT智能體就是處理所有這些步驟的"超級智能助手"。它像是數字助理的項目經理——理解你的請求,將其分解,找到合適的在線"工具"(API),使用這些工具,并給出答案。它不只是執行單一操作,而是迭代式地(即逐步優化方法)朝著目標前進直至完成。
它是協調后續章節中所有小型"助手"的大腦:
- 規劃器(Planner):確定下一步邏輯步驟
- API選擇器(APISelector):為當前步驟選擇合適的在線工具(API操作)
- 調用器(Caller):實際使用在線工具
- 響應解析器(ResponseParser):理解工具返回的信息
如何使用RestGPT智能體
使用RestGPT
智能體非常簡單,因為它是實現功能的主要交互組件。如果你運行過第1章的run.py
或run_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()
解釋:
- 從
config.yaml
加載密鑰并進行設置 - 加載并簡化API說明書(
tmdb_oas.json
) - 創建
requests_wrapper
,這是一個知道如何安全向在線服務發送請求的助手,使用我們的access_token
- 設置
llm
,即作為語言理解和決策核心"大腦"的大語言模型(如OpenAI的GPT-3) - 最后創建
RestGPT
實例——我們的智能助手!我們向它傳遞語言模型(llm
)、簡化版API說明書(api_spec
)、場景(tmdb
或spotify
)以及requests_wrapper
以便發送API調用 - 只需用我們的請求調用
rest_gpt.run(query)
,RestGPT智能體就會接管后續工作!
當調用rest_gpt.run(query)
時,RestGPT智能體會:
- 分析查詢:“索菲亞·科波拉執導的電影數量”
- 將其分解:“找到索菲亞·科波拉的ID”、“通過該ID查找電影”、“統計數量”
- 逐步調用各種API(如
/search/person
和/discover/movie
) - 處理每次API調用的結果
- 整合信息提供最終答案
RestGPT智能體內部:協調者
RestGPT
智能體如何管理所有這些復雜步驟?它作為協調者,不斷決定下一步最佳行動,并將任務委派給專門的"助手"。
以下是其工作方式的高層概覽:
現在讓我們看看model/rest_gpt.py
中RestGPT
類實現這一協調的代碼。
RestGPT
類基于langchain
庫的Chain
概念構建,這是一種將不同步驟或"鏈"連接在一起的方式。
1. 初始化協調團隊(助手)
創建RestGPT
對象時,會立即初始化其關鍵助手:Planner
和APISelector
。Caller
(包含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__
方法如同組建團隊。它創建Planner
和APISelector
實例,為它們提供共享的語言模型(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返回結果
智能體采用迭代式工作流程:
- 接收用戶查詢
- 生成執行計劃
- 選擇并調用API
- 分析結果
- 根據結果調整計劃直至任務完成
使用示例:
rest_gpt = RestGPT(llm=OpenAI模型,api_spec=API規范,scenario='tmdb',requests_wrapper=請求處理器
)
rest_gpt.run("查詢諾蘭導演的最受歡迎電影上映日期")
智能體通過協調各模塊實現復雜任務自動化,大幅簡化了多API調用的流程。