智能體經驗分享:基于大模型(LLM) 的自主智能體
以大模型(LLM) 作為核心控制器的智能體 (Agent) 概念非常引人注目。目前已有一些概念驗證演示,如 AutoGPT、GPT-Engineer 和 BabyAGI,它們都是鼓舞人心的范例。LLM 的潛力遠不止于生成高質量的文案、故事、文章和程序,它還可以被視為一個強大的解決通用問題手段。
智能體系統概覽
在一個由 LLM驅動的自主智能體系統中,LLM 充當智能體的大腦,并輔以幾個關鍵組件:
- 規劃 (Planning)
子目標與分解:智能體將大型任務分解為更小、更易于管理的子目標,從而有效地處理復雜任務。
反思與完善:智能體能夠對過去的行為進行自我批評和反思,從錯誤中學習并為未來的步驟進行改進,從而提高最終結果的質量。- 記憶 (Memory)
短期記憶:將所有上下文學習(參見 Prompt Engineering)視為模型利用短期記憶進行學習。
長期記憶:這賦予智能體在較長時間內保留和回憶(無限)信息的能力,通常通過利用外部向量存儲 (Vector Store) 和快速檢索來實現。
- 工具使用 (Tool use)
智能體學習調用外部應用程序接口 (API),以獲取模型權重中缺失的額外信息(這部分信息在預訓練后通常難以改變),包括當前信息、代碼執行能力、訪問專有信息源等。
圖片
LLM 驅動的自主智能體系統概覽。
組件一:規劃
一項復雜的任務通常涉及許多步驟。智能體需要了解這些步驟并提前做好規劃。
任務分解
[思維鏈 (Chain of Thought,CoT; Wei 等,2022)] 已成為提升模型處理復雜任務性能的標準提示工程技術。通過指示模型“逐步思考”,使其利用更多的測試時計算來將復雜任務分解為更小、更簡單的步驟。CoT 將大型任務轉化為多個可管理的任務,并為解釋模型的思維過程提供了線索。
思維樹 (Treeof Thoughts; Yao 等,2023) 擴展了 CoT,它在每個步驟探索多種推理可能性。首先將問題分解為多個思維步驟,并在每個步驟生成多個想法,從而創建一個樹狀結構。搜索過程可以是廣度優先搜索 (BFS) 或深度優先搜索 (DFS),每個狀態通過分類器(通過提示)或多數投票進行評估。
任務分解可以通過以下方式完成:(1) LLM 通過簡單的提示,如 "XYZ 的步驟。\n1."、"實現 XYZ 的子目標是什么?";(2) 使用特定任務的指令,例如為撰寫小說提供"撰寫故事大綱。";(3) 人工輸入。
另一種截然不同的方法是 LLM + P (Liu 等,2023),它依賴外部經典規劃器進行長期規劃。該方法利用規劃領域定義語言 (PDDL) 作為中間接口來描述規劃問題。在此過程中,LLM(1) 將問題翻譯為“問題 PDDL”,然后 (2) 請求經典規劃器基于現有“領域 PDDL”生成 PDDL 規劃,最后 (3) 將 PDDL 規劃翻譯回自然語言。本質上,規劃步驟外包給了一個外部工具,這假設領域特定的 PDDL 和合適的規劃器是可用的,這在某些機器人設置中很常見,但在許多其他領域則不然。
自我反思
自我反思是自主智能體通過完善過去的行動決策和糾正之前的錯誤來迭代改進的關鍵環節。它在需要不斷試錯的實際任務中發揮著至關重要的作用。
ReAct (Yao 等,2023) 通過將行動空間擴展為任務特定的離散行動和語言空間的組合,實現了 LLM 內部的推理和行動整合。前者使 LLM 能夠與環境交互(例如,使用維基百科搜索 API),而后者則提示 LLM 生成自然語言的推理軌跡。
ReAct 的提示模板整合了 LLM 思考的明確步驟,大致格式如下:
Thought: ...(思考)
Action: ...(行動)
Observation: ...(觀察)
...(重復多次)
圖片
知識密集型任務(例如 HotpotQA、FEVER)和決策任務(例如 AlfWorld 環境、WebShop)的推理軌跡示例。(圖片來源:Yao 等,2023)
在知識密集型任務和決策任務的實驗中,ReAct 的表現均優于移除了Thought: ...步驟的純 Act 基線。

圖片
Reflexion 框架示意圖。(圖片來源:Shinn & Labash, 2023)
啟發式函數決定何時軌跡效率低下或包含幻覺,并應停止。效率低下的規劃指的是耗時過長但未成功的軌跡。幻覺被定義為遇到一系列連續相同的行動,這些行動在環境中導致相同的觀察。
通過向 LLM 展示兩樣本示例來創建自我反思,每個示例都是一個(失敗軌跡,用于指導未來計劃更改的理想反思)對。然后,反思會添加到智能體的工作記憶中,最多三個,作為查詢 LLM 的上下文。
圖片
在 AlfWorld 環境和 HotpotQA 上的實驗。在 AlfWorld 中,幻覺比效率低下的規劃更常見的失敗。(圖片來源:Shinn & Labash, 2023)

為了避免過擬合,CoH 添加了一個正則化項,以最大化預訓練數據集的對數似然。為了避免取巧和復制(因為反饋序列中有很多常見詞),他們在訓練期間隨機遮蔽 0% 到 5% 的過去標記。
他們實驗中的訓練數據集是 WebGPT comparisons、summarization from human feedback 和 human preference dataset 的組合。
圖片
經過 CoH 微調后,模型可以按照指令生成一系列逐步改進的輸出。(圖片來源:Liu 等,2023)
CoH 的思想是提供一個逐步改進輸出的歷史序列作為上下文,并訓練模型遵循這種趨勢以生成更好的輸出。算法蒸餾 (Algorithm Distillation, AD; Laskin 等,2023) 將相同的思想應用于強化學習任務中的跨回合軌跡,其中“算法”被封裝在一個長的歷史條件策略中。考慮到智能體多次與環境交互,并且在每個回合中智能體會稍有進步,AD 將這種學習歷史串聯起來并將其輸入模型。因此,我們應該期望下一個預測的行動比之前的嘗試帶來更好的性能。目標是學習強化學習 (RL) 的過程,而不是訓練一個特定任務的策略本身。
圖片
算法蒸餾 (AD) 工作原理示意圖。
(圖片來源:Laskin 等,2023)。
論文假設,任何生成一組學習歷史的算法都可以通過對行動執行行為克隆,將其提煉到神經網絡中。歷史數據由一組源策略生成,每個策略都針對特定任務進行訓練。在訓練階段,在每次 RL 運行期間,都會采樣一個隨機任務,并使用多回合歷史子序列進行訓練,從而使學習到的策略與任務無關。
實際上,模型的上下文窗口長度有限,因此回合應該足夠短以構建多回合歷史。2-4 個回合的多回合上下文對于學習近似最優的上下文強化學習算法是必要的。上下文強化學習的出現需要足夠長的上下文。
與三個基線進行比較,包括 ED(專家蒸餾,使用專家軌跡而非學習歷史進行行為克隆)、源策略(用于通過 UCB 生成蒸餾軌跡)、RL^2 (Duan 等,2017;由于需要在線 RL 而用作上限),AD 展示了上下文強化學習,其性能接近 RL^2,盡管只使用離線強化學習,并且比其他基線學習速度快得多。當以源策略的部分訓練歷史為條件時,AD 的改進速度也比 ED 基線快得多。
AD、ED、源策略和 RL^2 在需要記憶和探索的環境中的比較。只分配二元獎勵。源策略使用 A3C 針對“黑暗”環境進行訓練,使用 DQN 針對水迷宮進行訓練。
(圖片來源:Laskin 等,2023)
組件二:記憶
(非常感謝 ChatGPT 幫助我起草本節。我在與 ChatGPT 的對話中學到了很多關于人腦和快速最大內積搜索 (MIPS) 數據結構的知識。)
記憶類型
記憶可以定義為獲取、存儲、保留和隨后檢索信息的過程。人腦中有多種類型的記憶。
- 感覺記憶:這是記憶的最早期階段,能夠保留原始刺激結束后感官信息(視覺、聽覺等)的印象。感覺記憶通常只能持續幾秒鐘。其子類別包括圖像記憶(視覺)、回聲記憶(聽覺)和觸覺記憶(觸覺)。
- 短期記憶 (Short-Term Memory, STM) 或工作記憶 (Working Memory):它存儲我們當前意識到的信息,并用于執行復雜的認知任務,如學習和推理。短期記憶被認為能夠存儲大約 7 個項目(Miller,1956),并持續 20-30 秒。
- 長期記憶 (Long-Term Memory, LTM):長期記憶可以存儲信息極長的時間,從幾天到幾十年,其存儲容量基本上是無限的。長期記憶有兩種子類型:
- 外顯 / 陳述性記憶:這是關于事實和事件的記憶,指那些可以有意識回憶的記憶,包括情景記憶(事件和經驗)和語義記憶(事實和概念)。
- 內隱 / 程序性記憶:這種記憶是無意識的,涉及自動執行的技能和例程,例如騎自行車或在鍵盤上打字。
人類記憶的分類。
我們可以大致考慮以下映射關系:
- 感覺記憶:學習原始輸入(包括文本、圖像或其他模態)的嵌入表示。
- 短期記憶:相當于上下文學習 (in-context learning)。它短暫且有限,受限于 Transformer 有限的上下文窗口長度。
- 長期記憶:作為外部向量存儲,智能體可以在查詢時訪問,通過快速檢索實現。
最大內積搜索 (MIPS)
外部記憶可以緩解有限注意力跨度的限制。一種常見做法是將信息的嵌入表示保存到向量存儲數據庫中,該數據庫支持快速最大內積搜索 (MIPS)。為了優化檢索速度,通常選擇_近似最近鄰 (ANN)_ 算法來返回大約前 k 個最近鄰,以犧牲少量準確性來換取巨大的速度提升。
以下是一些用于快速 MIPS 的常見 ANN 算法選擇:
-LSH (Locality-Sensitive Hashing,局部敏感哈希):它引入了一個_哈希_函數,使相似的輸入項以高概率映射到同一個桶中,其中桶的數量遠小于輸入數量。
- ANNOY (Approximate Nearest Neighbors Oh Yeah,近似最近鄰哦耶):核心數據結構是_隨機投影樹_,一組二叉樹,其中每個非葉節點表示一個將輸入空間一分為二的超平面,每個葉節點存儲一個數據點。樹是獨立隨機構建的,因此在某種程度上模擬了哈希函數。ANNOY 搜索發生在所有樹中,以迭代搜索最接近查詢的半空間,然后聚合結果。這個思想與 KD 樹非常相關,但可擴展性更強。 -HNSW (Hierarchical Navigable Small World,分層可導航小世界):它受到小世界網絡思想的啟發,即大多數節點可以通過少數步驟到達任何其他節點;例如社交網絡的“六度分隔”特性。HNSW 構建了這些小世界圖的分層結構,其中底層包含實際數據點。中間層創建快捷方式以加快搜索速度。執行搜索時,HNSW 從頂層的一個隨機節點開始,并向目標導航。當無法再靠近時,它會向下移動到下一層,直到到達底層。上層中的每次移動都可能在數據空間中覆蓋很遠的距離,而下層中的每次移動都可細化搜索質量。
- FAISS (Facebook AI Similarity Search):它基于高維空間中節點之間的距離遵循高斯分布的假設,因此應該存在數據點的_聚類_。FAISS 通過將向量空間劃分為簇,然后在簇內細化量化來應用向量量化。搜索首先通過粗略量化查找簇候選,然后通過更精細的量化進一步查找每個簇。

圖片
MIPS 算法比較,以 recall@10 衡量。(圖片來源:Google Blog,2020)
更多 MIPS 算法和性能比較請查看 ann-benchmarks.com。
組件三:工具使用
工具的使用是人類的一項顯著特征。我們創造、修改和利用外部物體,以超越我們的身體和認知極限。為大模型(LLM) 配備外部工具可以顯著擴展模型的能力。
一張海獺在水中漂浮時,用石頭敲開海貝的照片。雖然其他一些動物也會使用工具,但其復雜程度無法與人類相比。(圖片來源:使用工具的動物)
MRKL (Karpas 等,2022),是“Modular Reasoning, Knowledge and Language”(模塊化推理、知識和語言)的縮寫,是一種用于自主智能體的神經符號架構。MRKL 系統被提議包含一組“專家”模塊,通用 LLM 充當路由器,將查詢路由到最合適的專家模塊。這些模塊可以是神經模塊(例如深度學習模型)或符號模塊(例如數學計算器、貨幣轉換器、天氣 API)。
他們進行了一項實驗,通過算術作為測試案例,對 LLM 進行微調以調用計算器。實驗表明,解決口頭數學問題比解決明確陳述的數學問題更困難,因為 LLM(7B Jurassic1-large 模型)未能可靠地提取基本算術的正確參數。結果強調,當外部符號工具能夠可靠工作時,_知道何時以及如何使用工具至關重要_,這取決于 LLM 的能力。
TALM (Tool Augmented Language Models; Parisi 等,2022) 和 Toolformer (Schick 等,2023) 都微調語言模型 (LM) 以學習使用外部工具 API。數據集的擴展基于新添加的 API 調用注釋是否能提高模型輸出的質量。更多詳情請參閱提示工程的“外部 API”部分。
ChatGPT 插件 (Plugins) 和 OpenAI API 函數調用 (function calling) 是 LLM 增強工具使用能力并在實踐中發揮作用的良好示例。工具 API 的集合可以由其他開發者提供(如插件中所示)或自行定義(如函數調用中所示)。
HuggingGPT (Shen 等,2023) 是一個框架,它利用 ChatGPT 作為任務規劃器,根據模型描述選擇 HuggingFace 平臺上可用的模型,并根據執行結果總結響應。
圖片
HuggingGPT 工作原理示意圖。(圖片來源:Shen 等,2023)
該系統包含四個階段:
(1) 任務規劃:LLM 作為大腦,將用戶請求解析成多個任務。每個任務都包含四個屬性:任務類型、ID、依賴關系和參數。他們使用少樣本示例來指導 LLM 進行任務解析和規劃。
指令:
AI 助手可以將用戶輸入解析為以下任務:[{"task": task, "id": task_id, "dep": dependency_task_ids, "args": {"text": text, "image": URL, "audio": URL, "video": URL}}]。"dep" 字段表示生成當前任務所依賴新資源的先前任務的 ID。特殊標簽 "-task_id" 指的是依賴任務(ID 為 task_id)中生成的文本、圖像、音頻和視頻。任務必須從以下選項中選擇:{{ 可用任務列表 }}。任務之間存在邏輯關系,請注意它們的順序。如果用戶輸入無法解析,您需要回復一個空的 JSON。這里有幾個供您參考的案例:{{ 演示 }}。聊天歷史記錄為 {{ 聊天歷史 }}。從聊天歷史中,您可以找到用戶提及的資源路徑,用于您的任務規劃。
(2) 模型選擇:LLM 將任務分配給專家模型,請求被構架為多項選擇題。LLM 會看到一個模型列表供選擇。由于上下文長度有限,需要基于任務類型進行過濾。
指令:
根據用戶請求和調用命令,AI 助手幫助用戶從模型列表中選擇合適的模型來處理用戶請求。AI 助手只輸出最合適模型的模型 ID。輸出必須是嚴格的 JSON 格式:"id": "id", "reason": "您選擇的詳細原因"。我們有一個模型列表供您選擇 {{ 候選模型 }}。請從列表中選擇一個模型。
(3) 任務執行:專家模型執行特定任務并記錄結果。
指令:
根據輸入和推理結果,AI 助手需要描述過程和結果。前面的階段可以表示為:用戶輸入:{{ 用戶輸入 }},任務規劃:{{ 任務 }},模型選擇:{{ 模型分配 }},任務執行:{{ 預測 }}。您必須首先直接回答用戶的請求。然后用第一人稱向用戶描述任務過程,并展示您的分析和模型推理結果。如果推理結果包含文件路徑,則必須告知用戶完整的文件路徑。
(4) 響應生成:LLM 接收執行結果并向用戶提供匯總結果。
要將 HuggingGPT 投入實際使用,需要解決幾個挑戰:(1) 需要提高效率,因為 LLM 推理輪次和與其他模型的交互都會減慢過程;(2) 它依賴于長上下文窗口來處理復雜的任務內容;(3) LLM 輸出和外部模型服務的穩定性需要提高。
API-Bank (Li 等,2023) 是一個用于評估工具增強型 LLM 性能的基準。它包含 53 個常用的 API 工具、一個完整的工具增強型 LLM 工作流程,以及 264 個涉及568 次 API 調用的帶注釋對話。API 的選擇非常多樣化,包括搜索引擎、計算器、日歷查詢、智能家居控制、日程管理、健康數據管理、賬戶認證流程等。由于 API數量眾多,LLM 首先通過 API 搜索引擎查找正確的 API,然后使用相應的文檔進行調用。
API-Bank 中 LLM 進行 API 調用的偽代碼。(圖片來源:Li 等,2023)
在 API-Bank 工作流程中,LLM 需要做出一些決策,并且在每個步驟中我們都可以評估該決策的準確性。決策包括:
- 是否需要進行 API 調用。
- 識別要調用的正確 API:如果不夠好,LLM 需要迭代修改 API 輸入(例如,決定搜索引擎 API 的搜索關鍵詞)。
- 根據 API 結果做出響應:如果結果不滿意,模型可以選擇改進并再次調用。
該基準從三個層面評估智能體的工具使用能力:
- 一級評估:評估_調用 API_ 的能力。給定 API 的描述,模型需要確定是否調用給定的 API,正確調用它,并對 API 返回做出適當的響應。
- 二級評估:考查_檢索 API_ 的能力。模型需要搜索可能解決用戶需求的 API,并通過閱讀文檔學習如何使用它們。- 三級評估:評估_超越檢索和調用來規劃 API_ 的能力。面對不明確的用戶請求(例如,安排小組會議,預訂旅行的航班/酒店/餐廳),模型可能需要進行多次API 調用來解決。
案例研究
科學發現智能體
ChemCrow (Bran 等,2023) 是一個特定領域示例,其中 LLM 增強了 13 種專家設計的工具,以完成有機合成、藥物發現和材料設計等任務。該工作流程使用 LangChain 實現,反映了之前在 ReAct 和 MRKLs 中描述的內容,并將 CoT 推理與與任務相關的工具相結合:- LLM 獲得了一系列工具名稱、其效用描述以及預期輸入/輸出的詳細信息。
- 然后,它被指示在必要時使用所提供的工具回答用戶給定的提示。該指令建議模型遵循ReAct 格式:
Thought(思考), Action(行動), Action Input(行動輸入), Observation(觀察)。
一個有趣的觀察是,盡管基于 LLM 的評估得出結論,GPT-4 和 ChemCrow 的表現幾乎相同,但專家對解決方案的完成度和化學正確性進行的人工評估表明,ChemCrow 在很大程度上優于 GPT-4。這表明,在需要深厚專業知識的領域,使用 LLM 評估自身性能可能存在問題。缺乏專業知識可能導致 LLM 不了解其缺陷,從而無法很好地判斷任務結果的正確性。
Boiko 等人 (2023) 也研究了由 LLM 驅動的科學發現智能體,以處理復雜科學實驗的自主設計、規劃和執行。該智能體可以使用工具瀏覽互聯網、閱讀文檔、執行代碼、調用機器人實驗 API,并利用其他 LLM。
例如,當被要求“開發一種新型抗癌藥物”時,模型提出了以下推理步驟:
- 查詢當前抗癌藥物發現的趨勢;
- 選擇一個靶點;
- 請求一個針對這些化合物的支架;
- 一旦化合物被識別,模型嘗試合成它。
他們還討論了風險,特別是涉及非法藥物和生物武器的風險。他們開發了一個包含已知化學武器制劑列表的測試集,并要求智能體合成它們。11 個請求中有 4 個 (36%) 被接受,以獲得合成解決方案,并且智能體嘗試查閱文檔以執行該程序。11 個請求中有 7 個被拒絕,在這 7 個拒絕案例中,5 個發生在網絡搜索之后,2 個僅根據提示被拒絕。
生成式智能體模擬
生成式智能體(Park 等,2023) 是一個非常有趣的實驗。在這個實驗中,25 個虛擬角色(每個都由一個LLM 驅動的智能體控制)在一個受《模擬人生》啟發的沙盒環境中生活和互動。生成式智能體為交互式應用創建了可信的人類行為模擬。
生成式智能體的設計結合了 LLM與記憶、規劃和反思機制,使智能體能夠根據過去的經驗行事,并與其他智能體互動。
- 記憶流:是一個長期記憶模塊(外部數據庫),以自然語言記錄智能體的全面經驗列表。
每個元素都是一個_觀察_,一個由智能體直接提供的事件。
智能體間的通信可以觸發新的自然語言語句。
- 檢索模型:根據相關性、新近度和重要性,提供上下文以指導智能體的行為。
新近度:近期事件得分較高。
重要性:區分平凡記憶與核心記憶。直接詢問語言模型。
相關性:基于與當前情境/查詢的關聯程度。
- 反思機制:隨著時間的推移將記憶綜合為更高層次的推論,并指導智能體未來的行為。它們是_過去事件的高層次總結_(<- 請注意這與上面自我反思略有不同)。
用最近的 100 個觀察結果提示 LLM,并根據一組觀察/陳述生成 3 個最突出的高層次問題。然后要求 LLM 回答這些問題。
- 規劃與反應:將反思和環境信息轉化為行動。
規劃本質上是為了在當下和未來之間優化可信度。
提示模板:{智能體 X 的介紹}。這是 X 今天的大致計劃:1)
智能體之間的關系以及一個智能體對另一個智能體的觀察都被納入規劃和反應的考慮。
環境信息以樹狀結構呈現。
圖片
生成式智能體架構。(圖片來源:Park 等,2023)
這個有趣的模擬產生了涌現的社會行為,例如信息傳播、關系記憶(例如兩個智能體繼續討論相同話題)和社會事件的協調(例如舉辦派對并邀請許多其他人)。
概念驗證示例
AutoGPT 吸引了大量關注,因為它展示了利用大模型(LLM) 作為主要控制器來設置自主智能體的可能性。盡管由于自然語言接口,它存在許多可靠性問題,但這仍然是一個很酷的概念驗證演示。AutoGPT 中的許多代碼都專注于格式解析。
以下是 AutoGPT 使用的系統消息,其中 {{...}} 是用戶輸入:
你是 {{ai-name}},{{用戶提供的 AI 機器人描述}}。
你的決策必須始終獨立做出,不尋求用戶幫助。發揮你作為 LLM 的優勢,采取簡單的策略,避免法律糾紛。
目標:
1. {{用戶提供的目標 1}}
2. {{用戶提供的目標 2}}
3. ...
4. ...5. ...
限制:
1. 短期記憶約 4000 字限制。你的短期記憶很短,所以請立即將重要信息保存到文件中。
2. 如果你不確定以前是如何完成某件事,或者想回憶過去事件,思考類似事件會幫助你記憶。
3. 沒有用戶幫助
4. 只能使用雙引號中列出的命令,例如 "command name"
5. 對于幾分鐘內無法終止的命令,請使用子進程
命令:
1. 谷歌搜索:"google",參數:"input": "<搜索內容>"
2. 瀏覽網站:"browse_website",參數:"url": "<網址>","question":"<你在網站上想找什么>"
3. 啟動 GPT 智能體:"start_agent",參數:"name": "<名稱>","task": "<簡短任務描述>","prompt": "<提示>"
4. 向 GPT智能體發送消息:"message_agent",參數:"key": "<密鑰>","message": "<消息>"
5. 列出 GPT 智能體:"list_agents",參數:
6. 刪除 GPT 智能體:"delete_agent",參數:"key": "<密鑰>"
7. 克隆倉庫:"clone_repository",參數:"repository_url": "<網址>","clone_path": "<目錄>"
8. 寫入文件:"write_to_file",參數:"file": "<文件>","text": "<文本>"
9. 讀取文件:"read_file",參數:"file": "<文件>"
10. 追加到文件:"append_to_file",參數:"file": "<文件>","text": "<文本>"
11. 刪除文件:"delete_file",參數:"file": "<文件>"
12. 搜索文件:"search_files",參數:"directory": "<目錄>"
13. 分析代碼:"analyze_code",參數:"code": "<完整代碼字符串>"
14. 獲取改進代碼:"improve_code",參數:"suggestions": "<建議列表>","code": "<完整代碼字符串>"
15. 編寫測試:"write_tests",參數:"code": "<完整代碼字符串>","focus": "<關注領域列表>"
16. 執行 Python 文件:"execute_python_file",參數:"file": "<文件>"
17. 生成圖像:"generate_image",參數:"prompt": "<提示>"
18. 發送推文:"send_tweet",參數:"text": "<文本>"
19.不做任何事:"do_nothing",參數:
20. 任務完成(關機):"task_complete",參數:"reason": "<原因>"
資源:
1. 用于搜索和信息收集的互聯網訪問。2. 長期記憶管理。
3. 用于委托簡單任務的 GPT-3.5 驅動的智能體。
4. 文件輸出。
績效評估:
1. 持續審查和分析你的行動,確保你盡力而為。
2. 不斷建設性地自我批評你宏觀的行為。
3. 反思過去的決策和策略,以完善你的方法。
4. 每個命令都有成本,所以要聰明高效。力求以最少的步驟完成任務。
你只能以以下所述的 JSON 格式回復
回復格式:
{
"thoughts": {
"text": "思考",
"reasoning": "推理","plan": "- 短要點\n- 列表傳達\n- 長期計劃",
"criticism": "建設性自我批評",
"speak": "對用戶說的思考總結"
},"command": {
"name": "命令名稱",
"args": {
"參數名稱": "值"
}
}
}
確保回復可以被 Python 的 json.loads 解析。GPT-Engineer 是另一個項目,它根據自然語言指定的任務創建完整的代碼倉庫。GPT-Engineer 被指示思考要構建的較小組件列表,并根據需要請求用戶輸入以澄清問題。
以下是發送到 GPT-Engineer 使用的 OpenAI ChatCompletion 端點以進行任務澄清的對話示例。用戶輸入以 {{用戶輸入文本}} 包裹。
[
{
"role": "system",
"content": "你將閱讀指令,而不是執行它們,只尋求澄清。
具體來說,你首先會用超短的要點總結需要澄清的領域。
然后,你將選擇一個澄清問題,并等待用戶的回答。"
},
{
"role": "user",
"content": "我們正在用 {{Python 編寫一個超級馬里奧游戲。MVC 組件分別存放在不同的文件中。鍵盤控制。}}"
},
{
"role": "assistant",
"content": "需要澄清的領域總結:
1.超級馬里奧游戲的具體細節(例如,關卡設計、角色、游戲機制)
2. MVC 組件的細節(例如,每個文件中包含哪些組件)
3. 鍵盤控制的實現(例如,使用哪些鍵,如何處理輸入)
澄清問題:
你能否提供更多關于超級馬里奧游戲的細節,例如關卡設計、角色和游戲機制?"
},
{
"role": "user","content": "{{總共有 10 個關卡。主角是一個名叫馬里奧的水管工,他可以走路和跳躍。它是一個經典的平臺游戲,就像超級馬里奧一樣。主角從左向右移動,試圖到達目的地,過程中有許多障礙和敵人的攻擊。}}
還有什么不清楚的嗎?如果還有,請僅以以下形式回答:
{剩余不清楚的領域} 剩余問題。
{下一個問題}如果一切都足夠清楚,請僅回答“無可再澄清之處。”。"
},
{
"role": "assistant",
"content": "剩余不清楚的領域:2 個剩余問題。你能提供更多關于 MVC 組件如何拆分到不同文件的信息嗎?"
},
{
"role": "user",
"content": "{{請自行做出假設,并在開始前明確說明。}}"}
]
然后,在這些澄清之后,智能體進入代碼編寫模式,并帶有不同的系統消息。
系統消息:
你將收到編寫代碼的指令。
你將寫一個非常長的答案。確保架構的每個細節最終都實現為代碼。
確保架構的每個細節最終都實現為代碼。
一步一步地思考,并自己推理出正確的決策,以確保我們做對了。
你將首先列出必要的(核心)類、函數、方法的名稱,并附上對其用途的簡要說明。
然后,你將輸出每個文件的內容,包括所有代碼。
每個文件必須嚴格遵循 Markdown 代碼塊格式,其中以下標記必須替換:FILENAME 是小寫文件名,包括文件擴展名,
LANG 是代碼語言的標記代碼塊語言,CODE 是代碼:
你將從“入口點”文件開始,然后轉到該文件導入的文件,依此類推。
請注意,代碼應完全功能化。沒有占位符。
遵循語言和框架適當的最佳實踐文件命名約定。
確保文件包含所有導入、類型等。確保不同文件中的代碼相互兼容。
確保實現所有代碼,如果不確定,請編寫一個合理的實現。
包含模塊依賴或包管理器依賴定義文件。
在完成之前,請仔細檢查架構的所有部分是否都存在于文件中。
有用的知識:
你幾乎總是將不同的類放在不同的文件中。
對于 Python,你總是創建適當的 `requirements.txt` 文件。
對于 NodeJS,你總是創建適當的 `package.json` 文件。你總是添加一個簡要描述函數定義的用途的注釋。
你嘗試添加注釋來解釋非常復雜的邏輯片段。
你總是遵循所請求語言的最佳實踐,以定義的包/項目形式描述所編寫的代碼。
Python工具偏好:
- pytest
- dataclasses對話示例:
[
{
"role": "system",
"content": "你將收到編寫代碼的指令。
你將寫一個非常長的答案。確保架構的每個細節最終都實現為代碼。
確保架構的每個細節最終都實現為代碼。
一步一步地思考,并自己推理出正確的決策,以確保我們做對了。你將首先列出必要的(核心)類、函數、方法的名稱,并附上對其用途的簡要說明。
然后,你將輸出每個文件的內容,包括所有代碼。
每個文件必須嚴格遵循 Markdown 代碼塊格式,其中以下標記必須替換:
FILENAME 是小寫文件名,包括文件擴展名,
LANG 是代碼語言的標記代碼塊語言,CODE 是代碼:
FILENAME
```LANG
CODE
```
你將從“入口點”文件開始,然后轉到該文件導入的文件,依此類推。
請注意,代碼應完全功能化。沒有占位符。
遵循語言和框架適當的最佳實踐文件命名約定。
確保文件包含所有導入、類型等。確保不同文件中的代碼相互兼容。
確保實現所有代碼,如果不確定,請編寫一個合理的實現。
包含模塊依賴或包管理器依賴定義文件。
在完成之前,請仔細檢查架構的所有部分是否都存在于文件中。
有用的知識:
你幾乎總是將不同的類放在不同的文件中。
對于 Python,你總是創建適當的 requirements.txt 文件。
對于 NodeJS,你總是創建適當的 package.json 文件。
你總是添加一個簡要描述函數定義的用途的注釋。
你嘗試添加注釋來解釋非常復雜的邏輯片段。
你總是遵循所請求語言的最佳實踐,以定義的包/項目形式描述所編寫的代碼。
Python 工具偏好:
- pytest
- dataclasses
"
},
# … 同之前的對話,以“請自行做出假設,并在開始前明確說明。”結束。{
"role": "assistant",
"content": "假設:
1. 模型:模型將包含游戲數據,例如關卡信息、角色狀態和敵人位置。
2. 視圖:視圖將處理游戲的視覺效果,包括渲染游戲對象、背景和更新顯示。
3. 控制器:控制器將管理用戶輸入,例如鍵盤控制,并相應地更新模型。
基于這些假設,您希望我澄清鍵盤控制實現的哪個具體方面?"
},
{
"role": "user",
"content": "現在請記住以下步驟:
一步一步地思考,并自己推理出正確的決策,以確保我們做對了。
首先列出必要的(核心)類、函數、方法的名稱,并附上對其用途的簡要說明。
然后,你將輸出每個文件的內容,包括所有代碼。
每個文件必須嚴格遵循 Markdown 代碼塊格式,其中以下標記必須替換:
FILENAME 是小寫文件名,包括文件擴展名,
LANG 是代碼語言的標記代碼塊語言,CODE 是代碼:
FILENAME
```LANG
CODE
```
請注意,代碼應完全功能化。沒有占位符。
你將從“入口點”文件開始,然后轉到該文件導入的文件,依此類推。
遵循語言和框架適當的最佳實踐文件命名約定。
確保文件包含所有導入、類型等。代碼應完全功能化。確保不同文件中的代碼相互兼容。
在完成之前,請仔細檢查架構的所有部分是否都存在于文件中。
"
}
]挑戰
在了解了構建以 LLM 為中心的智能體的關鍵思想和演示之后,我開始看到一些常見的局限性:
- 有限的上下文長度:受限的上下文容量限制了歷史信息、詳細指令、API 調用上下文和響應的包含。系統設計必須在有限的通信帶寬下工作,而像自我反思這樣從過去的錯誤中學習的機制將極大地受益于長或無限的上下文窗口。盡管向量存儲和檢索可以提供對更大知識庫的訪問,但它們的表示能力不如完全注意力強大。
- 長期規劃和任務分解中的挑戰:對漫長歷史進行規劃和有效探索解決方案空間仍然具有挑戰性。LLM 在面對意外錯誤時難以調整計劃,使其不如通過試錯學習的人類那樣健壯。
- 自然語言接口的可靠性:當前的智能體系統依賴自然語言作為 LLM 與外部組件(如記憶和工具)之間的接口。然而,模型輸出的可靠性值得懷疑,因為 LLM 可能存在格式錯誤,偶爾還會表現出“叛逆”行為(例如,拒絕遵循指令)。因此,許多智能體演示代碼都側重于解析模型輸出。
參考文獻
[1] Wei 等人. “思維鏈提示引發大型語言模型的推理能力。” NeurIPS 2022.
[2] Yao 等人. “思維樹:利用大型語言模型深思熟慮地解決問題。” arXiv 預印本 arXiv:2305.10601 (2023).
[3] Liu 等人. “事后反思鏈使語言模型與反饋對齊。” arXiv預印本 arXiv:2302.02676 (2023).
[4] Liu 等人. “LLM+P: 賦予大型語言模型最優規劃能力。” arXiv 預印本 arXiv:2304.11477 (2023).
[5] Yao 等人. “ReAct: 協同語言模型中的推理與行動。” ICLR 2023.
[6] Google 博客. “宣布 ScaNN:高效向量相似度搜索。” 2020 年 7月 28 日.
[7] https://chat.openai.com/share/46ff149e-a4c7-4dd7-a800-fc4a642ea389
[8] Shinn & Labash. “Reflexion: 具有動態記憶和自我反思的自主智能體。”arXiv 預印本 arXiv:2303.11366 (2023).
[9] Laskin 等人. “利用算法蒸餾進行上下文強化學習。” ICLR 2023.
[10] Karpas 等人. “MRKL 系統:一種模塊化、神經符號架構,結合了大型語言模型、外部知識源和離散推理。” arXiv 預印本 arXiv:2205.00445 (2022).
[11] Nakano 等人. “Webgpt: 瀏覽器輔助問答與人類反饋。” arXiv預印本 arXiv:2112.09332 (2021).
[12] Parisi 等人. “TALM: 工具增強型語言模型。”
[13] Schick 等人. “Toolformer: 語言模型可以自學使用工具。” arXiv 預印本 arXiv:2302.04761 (2023).
[14] Weaviate 博客. 為什么向量搜索如此之快? 2022 年 9 月 13 日.
[15] Li 等人. “API-Bank: 一個用于工具增強型 LLMs 的基準。” arXiv 預印本 arXiv:2304.08244 (2023).
[16] Shen 等人. “HuggingGPT: 使用 ChatGPT 及其在 HuggingFace 的伙伴解決 AI 任務。” arXiv 預印本 arXiv:2303.17580 (2023).
[17] Bran 等人. “ChemCrow: 用化學工具增強大型語言模型。” arXiv 預印本 arXiv:2304.05376 (2023).
[18] Boiko 等人. “大型語言模型涌現的自主科學研究能力。” arXiv 預印本 arXiv:2304.05332 (2023).
[19] Joon Sung Park 等人. “生成式智能體:人類行為的交互式模擬。” arXiv 預印本 arXiv:2304.03442 (2023).
[20] AutoGPT. https://github.com/Significant-Gravitas/Auto-GPT
[21] GPT-Engineer. https://github.com/AntonOsika/gpt-engineer





































