【ZiDongHua 之技術(shù)文章區(qū)收錄關(guān)鍵詞:自動(dòng)化引擎
機(jī)器人 自然語(yǔ)言 語(yǔ)言模型】
大語(yǔ)言模型加持下的自動(dòng)化引擎
文章翻譯自Blog:https://lilianweng.github.io/posts/2023-06-23-agent/
文章目錄
智能體(Agent)系統(tǒng)概覽
部件一:規(guī)劃
任務(wù)分解
自我反思
部件二:記憶
記憶類型
最大內(nèi)積搜索(Maximum Inner Product Search, MIPS)
部件三:工具使用
案例研究
科學(xué)發(fā)現(xiàn)智能體
生成式智能體仿真
概念驗(yàn)證舉例
挑戰(zhàn)
引用
參考文獻(xiàn)
使用LLM(large language model, 大語(yǔ)言模型)來(lái)構(gòu)建智能體的核心部件是一個(gè)非??岬母拍睢r?yàn)證此概念的一些應(yīng)用,比如:AutoGPT、GPT-Engineer以及BabyAGI等,都給出了令人鼓舞的結(jié)果。LLM的潛力不會(huì)局限于文本重寫優(yōu)化或者寫小說(shuō)、發(fā)言稿和程序,它也可以用于構(gòu)建一個(gè)強(qiáng)大的、解決一般問(wèn)題的框架。
智能體(Agent)系統(tǒng)概覽
在LLM加持下的自動(dòng)化智能體系統(tǒng)中,LLM作為智能體的大腦,它由幾個(gè)關(guān)鍵部件組成:
規(guī)劃
子目標(biāo)分解:智能體將大的任務(wù)拆分為許多小的、可管理的小目標(biāo),以便于復(fù)雜任務(wù)的高效處理
反思與改進(jìn):智能體可以基于過(guò)去的動(dòng)作進(jìn)行自我批評(píng)與自我反思,即從過(guò)去的錯(cuò)誤中學(xué)習(xí)以來(lái)優(yōu)化未來(lái)的行為,進(jìn)而最終的結(jié)果得以改善
記憶
短期記憶:這里我將所有情景學(xué)習(xí)(in-context learning, 參考Prompt Engineering)看作是模型學(xué)習(xí)短期記憶的過(guò)程
長(zhǎng)期記憶:這為智能體提供了保留與回憶信息的能力,這一般會(huì)通過(guò)外部向量的快速存取來(lái)實(shí)現(xiàn)
工具使用
智能體學(xué)會(huì)通過(guò)調(diào)用外部APIs來(lái)獲取額外的信息來(lái)彌補(bǔ)模型權(quán)重(通常預(yù)訓(xùn)練之后很難被改變)中不會(huì)留存的信息,包括當(dāng)前的上下文信息、代碼執(zhí)行能力、從一些專用的信息源獲取的信息等等
LLM加持下的智能系統(tǒng)概覽
部件一:規(guī)劃
復(fù)雜任務(wù)通常會(huì)包含很多步驟。智能體需要知道這些步驟是什么,并提前規(guī)劃。
任務(wù)分解
思維鏈(Chain of thought, CoT; Wei等, 2022)已經(jīng)成為模型在復(fù)雜任務(wù)上性能加強(qiáng)的標(biāo)準(zhǔn)提示(prompting)技術(shù)。基于此,模型被要求“一步一步思考”,以更多的計(jì)算時(shí)間為代價(jià),將復(fù)雜的任務(wù)分解為較小的、更簡(jiǎn)單的子任務(wù)。CoT將大的任務(wù)轉(zhuǎn)化為多個(gè)可管理的小任務(wù),可以讓模型的“思考”過(guò)程更具解釋性。
思維樹(Yao 等, 2023)對(duì)思維鏈進(jìn)行了擴(kuò)展。它在每一小步(子任務(wù))的處理過(guò)車個(gè)鬧鐘功能,都會(huì)去探索很多合理的可能性。首先,它將問(wèn)題分解為多步,而后它又為每一步生成多個(gè)子步驟,這樣就生成了一個(gè)樹形結(jié)構(gòu)的任務(wù)完成流程??梢岳梅诸惼骰蛘叨鄶?shù)投票的方式來(lái)對(duì)思維樹的每個(gè)狀態(tài)進(jìn)行評(píng)估,以完成對(duì)樹的深度/廣度優(yōu)先搜索。
任務(wù)分解可以通過(guò)如下一些方式完成:
通過(guò)對(duì)LLM輸入簡(jiǎn)單的提示來(lái)完成,比如:XYZ的步驟\n1.或達(dá)成ZYZ的子目標(biāo)是什么?
通過(guò)使用特定任務(wù)相關(guān)的指令,舉例來(lái)說(shuō):如果希望寫一篇小說(shuō)可以輸入提示寫一個(gè)故事的大綱。
人工生成
有另一個(gè)差異較大的方法叫LLM+P(Liu 等, 2023),它依賴一個(gè)傳統(tǒng)的外部規(guī)劃器來(lái)進(jìn)行長(zhǎng)期規(guī)劃。此方法使用規(guī)劃領(lǐng)域定義語(yǔ)言(Planning Domain Definition Language, PDDL)作為中間接口對(duì)問(wèn)題進(jìn)行描述。具體操作步驟為:
LLM將問(wèn)題翻譯為滿足PDDL的格式
向某個(gè)經(jīng)典規(guī)劃器發(fā)起請(qǐng)求,生成一個(gè)基于現(xiàn)有“領(lǐng)域PDDL”的PDDL規(guī)劃
將PDDL規(guī)劃翻譯為自然語(yǔ)言
本質(zhì)上,此方案的規(guī)劃這一步是外包給外部工具來(lái)完成的。它假設(shè)存在一個(gè)特定領(lǐng)域的PDDL與一個(gè)合適的規(guī)劃器。這種設(shè)定在一些特定機(jī)器人領(lǐng)域是很常見的,但是在很多其它領(lǐng)域,這種假設(shè)很難被滿足。
自我反思
自我反思是一個(gè)重要的過(guò)程,它讓自動(dòng)化引擎可以對(duì)過(guò)去的動(dòng)作決策進(jìn)行迭代改進(jìn),以修正之前的錯(cuò)誤。它在現(xiàn)實(shí)任務(wù)中扮演了一個(gè)極其關(guān)鍵的角色,因?yàn)樵诂F(xiàn)實(shí)任務(wù)中試驗(yàn)與錯(cuò)誤是不可避免的。
ReAct(Yao 等, 2023)將因果推斷與動(dòng)作空間集成到LLM中去。它將動(dòng)作空間擴(kuò)展為兩部分的組合:一、任務(wù)相關(guān)的離散動(dòng)作空間;二、語(yǔ)言空間。前者讓LLM可以與環(huán)境(如:使用維基搜索的API)進(jìn)行交互。而后者可以用于提示LLM以自然語(yǔ)言的方式生成推理軌跡。
ReAct為L(zhǎng)LM提供了顯式的提示模版,格式大致如下:
想法:...
動(dòng)作:...
觀察:...
... (重復(fù)多次)
知識(shí)密集型任務(wù)的推理軌跡舉例(如HotpotQA, FEVER)以及決策任務(wù)舉例(如:AlfWorld Env, WebShop)
在知識(shí)密集型任務(wù)與決策任務(wù)這兩個(gè)實(shí)驗(yàn)中,ReAct的表現(xiàn)都比單獨(dú)使用Act這一基準(zhǔn)(想法:...這一步被)表現(xiàn)要好。
Reflexion(Shinn & Labash, 2023)框架使用動(dòng)態(tài)記憶與自我反思能力來(lái)武裝智能體,以改進(jìn)智能引擎的推理技術(shù)。Reflexion是一個(gè)標(biāo)準(zhǔn)的強(qiáng)化學(xué)習(xí)(Reinforcement Learning, RL)設(shè)置。它的獎(jiǎng)勵(lì)模型是一個(gè)簡(jiǎn)單的二值獎(jiǎng)勵(lì),而動(dòng)作空間遵循ReAct的設(shè)置,也就是使用任務(wù)相關(guān)的動(dòng)作空間與語(yǔ)言空間相結(jié)合的方式。這樣可以完成復(fù)雜的推理任務(wù)。在每一個(gè)動(dòng)作后,智能體會(huì)計(jì)算出一個(gè)猜想,并且可以根據(jù)自我反思的結(jié)果選擇是否重置整個(gè)環(huán)境來(lái)開始新一輪的嘗試。
Reflexion框架示意圖
猜想函數(shù)決定了執(zhí)行路徑是否是無(wú)效的或者包含了錯(cuò)覺(jué),以決定是否需要終止。無(wú)效規(guī)劃指的是那些耗費(fèi)太長(zhǎng)時(shí)間還沒(méi)有執(zhí)行成功的路徑。錯(cuò)覺(jué)定義為遇到了連續(xù)的相同動(dòng)作的序列而會(huì)導(dǎo)致同樣環(huán)境狀態(tài)的情況。
自我反思通過(guò)如下方式創(chuàng)建:給LLM喂兩個(gè)樣本,每個(gè)樣本包含一對(duì)數(shù)據(jù)(失敗的執(zhí)行路徑,用于規(guī)劃未來(lái)改變的理想想法)。而后,這些想法被添加到智能體的工作記憶中(最多可有三個(gè)),用作LLM查詢的上下文。
AlfWorld Env與HotpotQA上的實(shí)驗(yàn)結(jié)果。在AlfWorld的實(shí)驗(yàn)中,錯(cuò)覺(jué)失敗出現(xiàn)的比無(wú)效規(guī)劃要多
事后反饋鏈(Chain of Hindsight, CoH; Liu 等, 2023)鼓勵(lì)模型在其自身的輸出上進(jìn)行改進(jìn)。它顯式地將其自身輸出與對(duì)應(yīng)的反饋放到它過(guò)去的輸出序列中去。人工反饋數(shù)據(jù)是一個(gè)集合,其中是提示,是模型的填充,是對(duì)的人工評(píng)分,是事后人工反饋。假設(shè)反饋元組根據(jù)獎(jiǎng)勵(lì)大小來(lái)排序,,那么這個(gè)真?zhèn)€過(guò)程就是監(jiān)督式微調(diào)的一個(gè)過(guò)程。使用 此作為輸入,模型可以通過(guò)使用序列前綴來(lái)預(yù)測(cè)的方式進(jìn)行微調(diào),以此完成基于反饋序列來(lái)自我反思,以生成更好的輸出。在測(cè)試階段,模型可以選擇是否進(jìn)行多輪的人類反饋過(guò)程。
為了避免過(guò)擬合,CoH 在預(yù)測(cè)訓(xùn)練數(shù)據(jù)最大似然估計(jì)之上添加了正則化項(xiàng)。為了防止模型耍小聰明或簡(jiǎn)單復(fù)制(因?yàn)榉答佇蛄兄杏性S多常用單詞),在訓(xùn)練階段,大概0% - 5%的詞(tokens)會(huì)被隨機(jī)掩蓋。
實(shí)驗(yàn)中,訓(xùn)練所用數(shù)據(jù)集為WebGPT comparisons、人類反饋概要和人類偏好數(shù)據(jù)集的組合。
使用CoH微調(diào)之后,模型可以遵循指令生成逐漸改善的輸出
CoH的思想是利用特定上下文下的一系列不斷改進(jìn)歷史輸出來(lái)訓(xùn)練模型給出更加優(yōu)質(zhì)的結(jié)果。算法蒸餾(Algorithm Distillation, AD; Laskin 等, 2023)應(yīng)用了同樣的思想,它在強(qiáng)化學(xué)習(xí)任務(wù)中交叉使用了不同輪的運(yùn)行軌跡(cross-episode trajectories),也就是算法運(yùn)算使用了一個(gè)長(zhǎng)期歷史依賴的策略。考慮一個(gè)與環(huán)境進(jìn)行多次交互的智能體,在每一輪(episode)新的交互中,它都會(huì)改進(jìn)一點(diǎn)點(diǎn)。AD將這些學(xué)習(xí)歷史信息串連在一起,然后喂給模型。這樣,我們期望模型可以給出相比于之前更好的結(jié)果。算法將重點(diǎn)放在了強(qiáng)化學(xué)習(xí)的學(xué)習(xí)過(guò)程而非訓(xùn)練一個(gè)任務(wù)特定的策略本身。
算法蒸餾工作示意圖
論文假設(shè)任何可以生成一些列歷史學(xué)習(xí)信息的算法都可以通過(guò)行為克隆的方式將其壓縮到一個(gè)神經(jīng)網(wǎng)絡(luò)中去。歷史數(shù)據(jù)可以通過(guò)一些源策略生成,這些源策略可以由某些特定的任務(wù)訓(xùn)練而來(lái)。在訓(xùn)練階段,每次強(qiáng)化學(xué)習(xí)的運(yùn)行會(huì)隨機(jī)采樣一個(gè)任務(wù),得到多輪的交互軌跡用于訓(xùn)練。以此方式所習(xí)得的策略是任務(wù)無(wú)關(guān)的。
實(shí)際上,模型的上下文窗口長(zhǎng)度是有限制的。因此,每一輪交互軌跡應(yīng)該要足夠短,這樣才能夠包含多輪的交互軌跡。為了可以學(xué)習(xí)到一個(gè)近乎最優(yōu)的情景(in-context)強(qiáng)化學(xué)習(xí)算法,訓(xùn)練樣本中包含2-4輪的歷史交互軌跡是必要的。情景強(qiáng)化學(xué)習(xí)算法需要足夠長(zhǎng)的上下文信息。
相比于三個(gè)基線算法 ED (專家蒸餾,使用專家軌跡而非學(xué)習(xí)歷史進(jìn)行行為克?。?、源策略(用于生成UCB的蒸餾軌跡)以及RL^2(Duan 等, 2017; 將其用作上界,因?yàn)樗且环N在線強(qiáng)化學(xué)習(xí)算法),在情景強(qiáng)化學(xué)習(xí)中,AD使用離線強(qiáng)化學(xué)習(xí)策略可以達(dá)到接近在線算法RL^2的性能表現(xiàn)。此外,AD相比于其它基線算法,學(xué)習(xí)速度更快。在僅使用部分訓(xùn)練歷史信息的情況下,AD算法的改進(jìn)速度仍然要快于ED。
AD、ED、源策略、RL^2在需要記憶與探索的環(huán)境中的性能對(duì)比
部件二:記憶
(非常感謝ChatGPT幫我起草本小節(jié)。在我與ChatGPT的對(duì)話中,我學(xué)習(xí)到了很多關(guān)于人類大腦以及快速M(fèi)IPS的數(shù)據(jù)結(jié)構(gòu)。)
記憶類型
記憶可以定義為用于獲取、存儲(chǔ)、保留以及后期檢索信息的過(guò)程。人類大腦中存在幾種記憶類型:
感官記憶:這是記憶的最早階段,在最初接受感覺(jué)刺激之后,它提供了保留感官信息(視覺(jué)、聽覺(jué)等)的能力。感官記憶僅持續(xù)幾秒鐘。該分類的子類包括圖像記憶(視覺(jué)),聲音記憶(聽覺(jué))以及觸覺(jué)記憶(觸摸)
短期記憶(Short-Term Memory, STM)或者工作記憶:它存儲(chǔ)了我們當(dāng)前注意以及處理當(dāng)前復(fù)雜認(rèn)知任務(wù)(如學(xué)習(xí)、推理等)所需的信息。短期記憶被認(rèn)為可以同時(shí)保留大概7件事,持續(xù)大概20-30秒
長(zhǎng)期記憶(Long-Term Memory, LTM):長(zhǎng)期記憶可以將信息存儲(chǔ)相當(dāng)長(zhǎng)的一段時(shí)間,范圍從幾天到幾十年不等,它的容量幾乎是無(wú)限的。LTM分為兩個(gè)子類:
顯式/陳述性記憶(declarative memory):這是對(duì)事實(shí)和事件的記憶,即那些可以被主動(dòng)回憶起的事,包括情景記憶(時(shí)間和經(jīng)歷)以及語(yǔ)義記憶(事實(shí)和概念)
隱式/程序性記憶:此類記憶是無(wú)意識(shí)的,包括一些技巧以及自動(dòng)執(zhí)行的流程,像騎自行車或者敲鍵盤等
人類記憶分類
我們可以大致考慮以下的對(duì)應(yīng)關(guān)系:
感官記憶對(duì)應(yīng)學(xué)習(xí)原始輸入的嵌入表征,包括文本、圖片以及其它模態(tài)
短期記憶對(duì)應(yīng)情景學(xué)習(xí)。它是短暫且有限的,因?yàn)樗艿絋ransformer上下文窗口長(zhǎng)度的限制
長(zhǎng)期記憶對(duì)應(yīng)外部存儲(chǔ)向量,智能體在查詢階段可以隨時(shí)獲取
最大內(nèi)積搜索(Maximum Inner Product Search, MIPS)
外部記憶可以緩解注意力范圍有限的問(wèn)題。一個(gè)標(biāo)準(zhǔn)的實(shí)踐是將信息的嵌入表征保存在向量數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)應(yīng)支持快速最大內(nèi)積搜索(MIPS)。為了優(yōu)化信息獲取速度,常見的選擇是使用近似最近鄰(approximate nearest neighbors, ANN)算法來(lái)返回k個(gè)近似最優(yōu)解。ANN能夠以很小的準(zhǔn)確率損失來(lái)?yè)Q取巨大的搜索加速。
有一些常用的快速M(fèi)IPS ANN算法:
本地敏感哈希(Locality-Sensitive Hashing, LSH):這是一個(gè)新的哈希函數(shù)類別,它可以將輸入相近的元素以較高概率映射到同一哈希上。不同哈希值的數(shù)量要遠(yuǎn)小于輸入樣本的數(shù)量
ANNOY(Approximate Nearest Neighbors Oh Yeah):它的核心數(shù)據(jù)結(jié)構(gòu)是隨機(jī)映射樹,即一系列二分樹的集合。每一棵二分樹中的非葉子結(jié)點(diǎn)代表一個(gè)輸入空間的分割平面,它將輸入空間分成兩部分。樹的每個(gè)葉子結(jié)點(diǎn)存儲(chǔ)了一個(gè)數(shù)據(jù)點(diǎn)。樹以獨(dú)立隨機(jī)的方式生成。因此,從某種意義上來(lái)說(shuō),它模擬了一個(gè)哈希函數(shù)。ANNOY搜索使用所有的樹進(jìn)行搜索,在樹的每個(gè)節(jié)點(diǎn)上找到與查詢向量相近的后續(xù)節(jié)點(diǎn)進(jìn)行迭代,最后再將所有樹的結(jié)果聚合到一起。這個(gè)想法非常類似KD樹,但是擴(kuò)展性要強(qiáng)很多
HNSW(Hierarchical Navigable Small World):此算法源自小世界網(wǎng)絡(luò)理論。在小世界中,絕大部分結(jié)點(diǎn)都可以用很少的步驟到達(dá)其它任意一個(gè)結(jié)點(diǎn),比如社交網(wǎng)絡(luò)中著名的“六度分割理論”。HNSW將這些小世界圖構(gòu)建為分層結(jié)構(gòu),其中底層包含了實(shí)際的數(shù)據(jù)點(diǎn)。中間層創(chuàng)建了加速搜索的快捷方式。在搜索時(shí),HNSW從頂層的一個(gè)隨機(jī)結(jié)點(diǎn)開始向目標(biāo)導(dǎo)航。當(dāng)其無(wú)法再更靠近的時(shí)候,它就向下層移動(dòng),直至到達(dá)底層。在上層中的每一次移動(dòng)可能意味著數(shù)據(jù)空間中很大距離的移動(dòng),在底層中的每一次移動(dòng)都會(huì)對(duì)搜索結(jié)果進(jìn)行改善
FAISS(Facebook AI Similarity Search):此算法基于這樣一個(gè)假設(shè):在高維空間中,結(jié)點(diǎn)間的距離遵循高斯分布,因此,應(yīng)該存在數(shù)據(jù)點(diǎn)的聚集。FAISS使用向量量化技術(shù)將空間分割成很多群,而后又在群內(nèi)作量化改進(jìn)。搜索過(guò)程首先使用粗粒度量化尋找群,然后在群內(nèi)使用更細(xì)的量化進(jìn)行進(jìn)一步搜索
ScaNN(Scalable Nearest Neighbors):ScaNN的主要?jiǎng)?chuàng)新點(diǎn)是各向異性向量量化。它將數(shù)據(jù)點(diǎn)量化為,滿足內(nèi)積與原值盡可能相近,而非選擇最近的量化質(zhì)心點(diǎn)
MIPS算法對(duì)比,指標(biāo):recall@10
查看更多MIPS算法及其性能對(duì)比:ann-benchmarks.com。
部件三:工具使用
工具的使用是人類的一個(gè)顯著的、具有區(qū)分性的能力。我們可以創(chuàng)建、修改以及利用外部實(shí)體來(lái)完成超出我們身體和認(rèn)知極限的事情。使用外部工具武裝LLMs可以極大擴(kuò)展模型的能力。
一張海獺漂浮在水中時(shí)用巖石敲開貝殼的照片。其它一些動(dòng)物也可以使用工具,但是復(fù)雜程度無(wú)法如人類相比
MRKL(Modular Reasoning, Knowledge and Language; Karpas 等, 2022)是一個(gè)應(yīng)用于自動(dòng)化智能體的神經(jīng)符號(hào)架構(gòu)。MRKL系統(tǒng)包含一些專家模塊,通用的LLM可以用于將查詢路由到最合適的專家模塊。這些模塊可以是基于神經(jīng)網(wǎng)絡(luò)的(如深度學(xué)習(xí)模型)或者基于符號(hào)的(比如:數(shù)學(xué)計(jì)算器、貨幣轉(zhuǎn)換器、天氣API等)。
他們針對(duì)算術(shù)問(wèn)題進(jìn)行了一個(gè)實(shí)驗(yàn),微調(diào)LLM來(lái)調(diào)用一個(gè)計(jì)算器。他們的實(shí)驗(yàn)表明,解決口頭數(shù)學(xué)問(wèn)題比明確表述的數(shù)學(xué)問(wèn)題更難,因?yàn)長(zhǎng)LMs(7B Jurassic1-large model)無(wú)法為基本算術(shù)問(wèn)題正確、可靠地提取參數(shù)。實(shí)驗(yàn)結(jié)果強(qiáng)調(diào)當(dāng)外部符號(hào)工具可以可靠工作時(shí),知道何時(shí)以及如何使用工具至關(guān)重要,這些都由LLMs的能力來(lái)決定。
TALM(Tool Augmented Language Models; Parisi 等, 2022)和Toolformer(Schick 等, 2023)都對(duì)LM進(jìn)行了微調(diào)以學(xué)習(xí)如何使用外部工具。新添加的API注解對(duì)模型輸出的改善結(jié)果被用于對(duì)數(shù)據(jù)集進(jìn)行擴(kuò)展。一些細(xì)節(jié)可以參考提示工程的“外部APIs”章節(jié)。
ChatGPT的插件以及OpenAI API的函數(shù)調(diào)用都是外部工具增強(qiáng)的LLMs的優(yōu)秀用例。工具APIs可以由其他開發(fā)者(類似插件)提供或者是自定義的(比如函數(shù)調(diào)用)。
HuggignGPT(Shen 等, 2023)是一個(gè)將ChatGPT作為一個(gè)任務(wù)規(guī)劃器的框架。它使用ChatGPT來(lái)分析HuggingFace平臺(tái)上模型的描述,并選取相應(yīng)模型,最后根據(jù)模型的執(zhí)行結(jié)果輸出一個(gè)概要描述。
HuggingGPT工作方式示意圖
系統(tǒng)由四個(gè)階段組成:
任務(wù)規(guī)劃:LLM作為大腦,它將用戶的請(qǐng)求分解成多個(gè)任務(wù)。每個(gè)任務(wù)有四個(gè)相關(guān)的屬性:任務(wù)類型、ID、依賴以及參數(shù)。他們使用很少的樣本來(lái)引導(dǎo)LLM進(jìn)行任務(wù)的分解與規(guī)劃。 指令:
The AI assistant can parse user input to several tasks: [{"task": task, "id", task_id, "dep": dependency_task_ids, "args": {"text": text, "image": URL, "audio": URL, "video": URL}}]. The "dep" field denotes the id of the previous task which generates a new resource that the current task relies on. A special tag "-task_id" refers to the generated text image, audio and video in the dependency task with id as task_id. The task MUST be selected from the following options: {{ Available Task List }}. There is a logical relationship between tasks, please note their order. If the user input can't be parsed, you need to reply empty JSON. Here are several cases for your reference: {{ Demonstrations }}. The chat history is recorded as {{ Chat History }}. From this chat history, you can find the path of the user-mentioned resources for your task planning.
模型選擇:LLM將任務(wù)分發(fā)給專家模型,請(qǐng)求方式是讓模型回答一個(gè)多項(xiàng)選擇問(wèn)題。LLM需要從模型列表中選擇出所需模型。由于上下文長(zhǎng)度的限制,基于任務(wù)類型的過(guò)濾是必要的。 指令:
Given the user request and the call command, the AI assistant helps the user to select a suitable model from a list of models to process the user request. The AI assistant merely outputs the model id of the most appropriate model. The output must be in a strict JSON format: "id": "id", "reason": "your detail reason for the choice". We have a list of models for you to choose from {{ Candidate Models }}. Please select one model from the list.
任務(wù)執(zhí)行:專家模型工作于特定任務(wù)之上,并且記錄執(zhí)行結(jié)果。 指令:
With the input and the inference results, the AI assistant needs to describe the process and results. The previous stages can be formed as - User Input: {{ User Input }}, Task Planning: {{ Tasks }}, Model Selection: {{ Model Assignment }}, Task Execution: {{ Predictions }}. You must first answer the user's request in a straightforward manner. Then describe the task process and show your analysis and model inference results to the user in the first person. If inference results contain a file path, must tell the user the complete file path.
響應(yīng)生成:LLM接受執(zhí)行結(jié)果,并且向用戶提供結(jié)果描述
為了讓HuggingGPT可以在現(xiàn)實(shí)世界中可以使用,還有一些挑戰(zhàn)有待解決:
效率優(yōu)化:LLM的推理迭代次數(shù)和模型間的交互都降低了響應(yīng)速度
在復(fù)雜的任務(wù)內(nèi)容上,它依賴于一個(gè)非常長(zhǎng)的上下文窗口進(jìn)行交流通信
模型輸出以及外部模型服務(wù)的穩(wěn)定性有待改善
API-Bank(Li 等, 2023)是一個(gè)衡量工具強(qiáng)化的LLMs性能的基準(zhǔn)。它包含了53個(gè)常用API工具,一個(gè)完整的工具加強(qiáng)的LLM工作流,以及264個(gè)注解對(duì)話(涵蓋568個(gè)API調(diào)用)。APIs的選擇非常多樣化,包含搜索引擎、計(jì)算器、日歷查詢、智能家居控制、日程管理、健康數(shù)據(jù)管理、賬戶認(rèn)證工作流等等。由于大量APIs的存在,LLM首先需要調(diào)用搜索引擎來(lái)找到合適的API,而后根據(jù)對(duì)應(yīng)的文檔來(lái)進(jìn)行正確的API調(diào)用。
LLM在API-Bank中進(jìn)行API調(diào)用的偽代碼
在API-Bank的工作流中,LLMs需要做出一系例的決策,在每一步中我們可以評(píng)估它的決策的正確性。決策包括:
是否需要一個(gè)API調(diào)用
識(shí)別正確的API類型:如果不夠好,LLMs需要迭代修改API的輸入(比如:決定搜索引擎API的搜索關(guān)鍵字)
根據(jù)API的返回結(jié)果進(jìn)行響應(yīng):如果返回結(jié)果不夠好,模型可以選擇進(jìn)行改進(jìn)并在此進(jìn)行API調(diào)用
此基準(zhǔn)在三個(gè)等級(jí)上評(píng)估了智能體的工具使用能力:
等級(jí)一評(píng)估了正確使用API的能力。給定一個(gè)API的描述,模型需要決定是否調(diào)用給定的API,如何正確調(diào)用,如何處理API的返回結(jié)果
等級(jí)二檢測(cè)其API的選取能力。模型需要搜索可以解決用戶需求的合適API,并且通過(guò)文檔的閱讀學(xué)習(xí)如何使用它們
等級(jí)三進(jìn)一步測(cè)量了它的規(guī)劃能力。給定一個(gè)不明確的用戶要求(比如:排定會(huì)議日程、預(yù)訂行程機(jī)票/酒店/餐館),模型可能需要調(diào)用多次API來(lái)解決問(wèn)題
案例研究
科學(xué)發(fā)現(xiàn)智能體
ChemCrow(Bran 等, 2023)是一個(gè)專用領(lǐng)域的智能體。它的LLM使用了13個(gè)專家工具來(lái)輔助完成任務(wù)。這些任務(wù)包括有機(jī)合成、藥物發(fā)現(xiàn)和材料設(shè)計(jì)。基于**LangChain**實(shí)現(xiàn)的工作流反應(yīng)了之前在ReAct和MRKL中描述的內(nèi)容,并將CoT推理與任務(wù)相關(guān)的工具進(jìn)行了整合:
LLM可以獲取專家工具輸入/輸出的詳細(xì)描述,包括工具名稱、功能描述等等
而后,利用專家工具,LLM被要求根據(jù)指令回答用戶指定提示的問(wèn)題。指令知道模型遵循ReAct格式 - 想法,動(dòng)作,動(dòng)作輸入,狀態(tài)觀察
一個(gè)有趣的發(fā)現(xiàn)是基于LLM的評(píng)估得到結(jié)論是GPT-4和ChemCrow的表現(xiàn)幾乎一致。而人類專家根據(jù)解決方案的完成度以及化學(xué)相關(guān)正確性的評(píng)估表明ChemCrow的表現(xiàn)要遠(yuǎn)好于GPT-4。這揭露了使用LLM來(lái)評(píng)估其在專業(yè)領(lǐng)域問(wèn)題上性能的一個(gè)潛在問(wèn)題。缺乏專業(yè)性可能會(huì)導(dǎo)致LLMs缺乏其對(duì)其自身弱點(diǎn)的了解,這樣就無(wú)法判斷任務(wù)結(jié)果的正確性。
Boiko 等, 2023同樣也對(duì)LLM智能體在科學(xué)發(fā)現(xiàn)方面的能力進(jìn)行了探索,包括處理復(fù)雜科學(xué)實(shí)驗(yàn)的自主設(shè)計(jì)、規(guī)劃和執(zhí)行。該智能體使用工具來(lái)瀏覽互聯(lián)網(wǎng)、閱讀文檔、執(zhí)行代碼、調(diào)用機(jī)器人實(shí)驗(yàn)APIs以及利用其它LLMs。
舉例來(lái)說(shuō),當(dāng)被要求開發(fā)一種新的抗癌藥,模型提出以下步驟:
查詢當(dāng)前抗癌藥物發(fā)現(xiàn)的趨勢(shì)
選擇一個(gè)目標(biāo)
請(qǐng)求這些化合物的結(jié)構(gòu)
一旦化合物被確定,模型便嘗試合成
他們同樣也討論了風(fēng)險(xiǎn)問(wèn)題,特別是非法藥物與生化武器的問(wèn)題。他們做了一個(gè)涵蓋知名化學(xué)武器的列表的數(shù)據(jù)集,并請(qǐng)求智能體合成它們。4/11的請(qǐng)求(36%)被模型接收生成合成方案,智能體嘗試編輯文檔來(lái)執(zhí)行這些步驟。7/11的請(qǐng)求被拒絕,這7個(gè)被拒絕的請(qǐng)求中,有5個(gè)是模型在使用網(wǎng)絡(luò)搜索之后被拒絕的,另外兩個(gè)是僅根據(jù)前置提示而直接拒絕的。
生成式智能體仿真
Generative Agents(GA, Park 等, 2023)是一個(gè)有趣的實(shí)驗(yàn)。在實(shí)驗(yàn)中,由LLM控制的25個(gè)虛擬任務(wù)角色居住在一個(gè)沙盒環(huán)境中,彼此可以通過(guò)沙盒進(jìn)行交流(受到模擬人生游戲的啟發(fā))。GA為交互式應(yīng)用程序創(chuàng)建了可靠的人類行為模擬。
GA的設(shè)計(jì)將LLM與記憶、規(guī)劃以及思維機(jī)制相結(jié)合,讓智能體可以基于過(guò)去的經(jīng)歷來(lái)決定其自身行為,同時(shí)也可以與其它智能體進(jìn)行交互。
記憶流是一個(gè)長(zhǎng)期記憶模塊(外部數(shù)據(jù)庫(kù)),它可以使用自然語(yǔ)言記錄大量的智能體經(jīng)歷
每條記憶是一個(gè)狀態(tài)觀察(observation),即由智能體提供的事件。智能體之間的交流可以生成新的自然語(yǔ)言描述
檢索模型根據(jù)相關(guān)性、新近度和重要性,為智能體的行為提供上下文
新近度(recency):時(shí)間越近,評(píng)分越高
重要性:將核心記憶與平淡的記憶區(qū)分開來(lái),可直接通過(guò)向LLM詢問(wèn)得到
相關(guān)性:基于其與當(dāng)前的場(chǎng)景/問(wèn)題的相關(guān)程度來(lái)判斷
思維機(jī)制:隨著時(shí)間的推移,將記憶合成為更高層次的推論,用于指導(dǎo)智能體的未來(lái)行為。它們是過(guò)去事件的高層次抽象描述(<- 注意這與前文的自我反思有點(diǎn)不同)
使用最近的100個(gè)觀察作為提示信息,并根據(jù)一組觀察結(jié)果/陳述生成三個(gè)最顯著的高級(jí)問(wèn)題讓LM進(jìn)行回答
規(guī)劃與響應(yīng):將思考與環(huán)境信息翻譯為動(dòng)作
規(guī)劃本質(zhì)上是為了優(yōu)化當(dāng)前即時(shí)動(dòng)作的可信度
提示模板:{Intro of an agent X}. Here is X's plan today in broad strokes: 1)
智能體之間的關(guān)系以及另一個(gè)智能體對(duì)某個(gè)智能體的觀察都會(huì)用于規(guī)劃與響應(yīng)
環(huán)境信息使用樹形結(jié)構(gòu)進(jìn)行組織
GA架構(gòu)
這種有趣的模擬會(huì)產(chǎn)生新的社交行為,例如信息傳播、關(guān)系記憶(比如兩個(gè)智能體持續(xù)某個(gè)對(duì)話主題)和社交活動(dòng)的協(xié)調(diào)(比如舉辦聚會(huì)并邀請(qǐng)其他人)。
概念驗(yàn)證舉例
AutoGPT引起了人們對(duì)建立以LLM作為主控制器的自動(dòng)化智能體的廣泛關(guān)注。雖然給定
自然語(yǔ)言處理接口,該方案仍然存在著非常多的可靠性問(wèn)題,但其仍不失為一個(gè)非??岬母拍铗?yàn)證應(yīng)用。AutoGPT中的很多代碼都是關(guān)于格式轉(zhuǎn)換的。
下面是一個(gè)AutoGPT使用的系統(tǒng)消息,其中{{...}}表示用戶輸入:
You are {{ai-name}}, {{user-provided AI bot description}}.
Your decisions must always be made independently without seeking user assistance. Play to your strengths as an LLM and pursue simple strategies with no legal complications.
GOALS:
1. {{user-provided goal 1}}
2. {{user-provided goal 2}}
3. ...
4. ...
5. ...
Constraints:
1. ~4000 word limit for short term memory. Your short term memory is short, so immediately save important information to files.
2. If you are unsure how you previously did something or want to recall past events, thinking about similar events will help you remember.
3. No user assistance
4. Exclusively use the commands listed in double quotes e.g. "command name"
5. Use subprocesses for commands that will not terminate within a few minutes
Commands:
1. Google Search: "google", args: "input": ""
2. Browse Website: "browse_website", args: "url": "", "question": ""
3. Start GPT Agent: "start_agent", args: "name": "
", "task": "", "prompt": ""
4. Message GPT Agent: "message_agent", args: "key": "", "message": ""
5. List GPT Agents: "list_agents", args:
6. Delete GPT Agent: "delete_agent", args: "key": ""
7. Clone Repository: "clone_repository", args: "repository_url": "", "clone_path": ""
8. Write to file: "write_to_file", args: "file": "", "text": ""
9. Read file: "read_file", args: "file": ""
10. Append to file: "append_to_file", args: "file": "", "text": ""
11. Delete file: "delete_file", args: "file": ""
12. Search Files: "search_files", args: "directory": ""
13. Analyze Code: "analyze_code", args: "code": ""
14. Get Improved Code: "improve_code", args: "suggestions": "", "code": ""
15. Write Tests: "write_tests", args: "code": "", "focus": ""
16. Execute Python File: "execute_python_file", args: "file": ""
17. Generate Image: "generate_image", args: "prompt": "
"
18. Send Tweet: "send_tweet", args: "text": ""
19. Do Nothing: "do_nothing", args:
20. Task Complete (Shutdown): "task_complete", args: "reason": ""
Resources:
1. Internet access for searches and information gathering.
2. Long Term memory management.
3. GPT-3.5 powered Agents for delegation of simple tasks.
4. File output.
Performance Evaluation:
1. Continuously review and analyze your actions to ensure you are performing to the best of your abilities.
2. Constructively self-criticize your big-picture behavior constantly.
3. Reflect on past decisions and strategies to refine your approach.
4. Every command has a cost, so be smart and efficient. Aim to complete tasks in the least number of steps.
You should only respond in JSON format as described below
Response Format:
{
"thoughts": {
"text": "thought",
"reasoning": "reasoning",
"plan": "- short bulleted\n- list that conveys\n- long-term plan",
"criticism": "constructive self-criticism",
"speak": "thoughts summary to say to user"
},
"command": {
"name": "command name",
"args": {
"arg name": "value"
}
}
}
Ensure the response can be parsed by Python json.loads
GPT-Engineer是另一個(gè)工程,它以自然語(yǔ)言描述的任務(wù)作為輸入,創(chuàng)建一個(gè)完整的代碼倉(cāng)庫(kù)。GPT-Engineer被指示考慮一些待構(gòu)建的小組件列表,并在必要的時(shí)候要求用戶澄清其問(wèn)題。
下面是一個(gè)GPT-Engineer所使用的用于任務(wù)澄清的對(duì)話樣本,該樣本會(huì)發(fā)送給OpenAI ChatCompletion 終端。用戶輸入被包含在{{user input text}}格式中。
[
{
"role": "system",
"content": "You will read instructions and not carry them out, only seek to clarify them.\nSpecifically you will first summarise a list of super short bullets of areas that need clarification.\nThen you will pick one clarifying question, and wait for an answer from the user.\n"
},
{
"role": "user",
"content": "We are writing {{a Super Mario game in python. MVC components split in separate files. Keyboard control.}}\n"
},
{
"role": "assistant",
"content": "Summary of areas that need clarification:\n1. Specifics of the Super Mario game (e.g. level design, characters, gameplay mechanics)\n2. Details about the MVC components (e.g. which components are in each file)\n3. Keyboard control implementation (e.g. which keys to use, how to handle input)\n\nClarifying question:\nCan you provide more details about the Super Mario game, such as level design, characters, and gameplay mechanics?"
},
{
"role": "user",
"content": "{{There are 10 levels in total. The main character is a plumber named Mario, who can walk and jump. It is a classical platform game just like Super Mario. The main character moves from left to right, trying to get to the destination, where there are many obstacles and attacks from enemies in the process.}}\n\nIs anything else unclear? If yes, only answer in the form:\n{remaining unclear areas} remaining questions.\n{Next question}\nIf everything is sufficiently clear, only answer \"Nothing more to clarify.\"."
},
{
"role": "assistant",
"content": "Remaining unclear areas: 2 remaining questions.\nCan you provide more information about how the MVC components are split into separate files?"
},
{
"role": "user",
"content": "{{Make your own assumptions and state them explicitly before starting}}"
}
]
在這些澄清之后,智能體使用一個(gè)不同的系統(tǒng)消息來(lái)切換到代碼編輯模式。系統(tǒng)提示消息為:
You will get instructions for code to write. You will write a very long answer. Make sure that every detail of the architecture is, in the end, implemented as code. Make sure that every detail of the architecture is, in the end, implemented as code.
Think step by step and reason yourself to the right decisions to make sure we get it right. You will first lay out the names of the core classes, functions, methods that will be necessary, as well as a quick comment on their purpose.
Then you will output the content of each file including ALL code. Each file must strictly follow a markdown code block format, where the following tokens must be replaced such that FILENAME is the lowercase file name including the file extension, LANG is the markup code block language for the code’s language, and CODE is the code:
FILENAME
```
CODE
```
You will start with the “entrypoint” file, then go to the ones that are imported by that file, and so on. Please note that the code should be fully functional. No placeholders.
Follow a language and framework appropriate best practice file naming convention. Make sure that files contain all imports, types etc. Make sure that code in different files are compatible with each other. Ensure to implement all code, if you are unsure, write a plausible implementation. Include module dependency or package manager dependency definition file. Before you finish, double check that all parts of the architecture is present in the files.
Useful to know: You almost always put different classes in different files. For Python, you always create an appropriate requirements.txt file. For NodeJS, you always create an appropriate package.json file. You always add a comment briefly describing the purpose of the function definition. You try to add comments explaining very complex bits of logic. You always follow the best practices for the requested languages in terms of describing the code written as a defined package/project.
Python toolbelt preferences:
- pytest
- dataclasses
對(duì)話舉例:
[
{
"role": "system",
"content": "You will get instructions for code to write.\nYou will write a very long answer. Make sure that every detail of the architecture is, in the end, implemented as code.\nMake sure that every detail of the architecture is, in the end, implemented as code.\n\nThink step by step and reason yourself to the right decisions to make sure we get it right.\nYou will first lay out the names of the core classes, functions, methods that will be necessary, as well as a quick comment on their purpose.\n\nThen you will output the content of each file including ALL code.\nEach file must strictly follow a markdown code block format, where the following tokens must be replaced such that\nFILENAME is the lowercase file name including the file extension,\nLANG is the markup code block language for the code's language, and CODE is the code:\n\nFILENAME\n```LANG\nCODE\n```\n\nYou will start with the \"entrypoint\" file, then go to the ones that are imported by that file, and so on.\nPlease note that the code should be fully functional. No placeholders.\n\nFollow a language and framework appropriate best practice file naming convention.\nMake sure that files contain all imports, types etc. Make sure that code in different files are compatible with each other.\nEnsure to implement all code, if you are unsure, write a plausible implementation.\nInclude module dependency or package manager dependency definition file.\nBefore you finish, double check that all parts of the architecture is present in the files.\n\nUseful to know:\nYou almost always put different classes in different files.\nFor Python, you always create an appropriate requirements.txt file.\nFor NodeJS, you always create an appropriate package.json file.\nYou always add a comment briefly describing the purpose of the function definition.\nYou try to add comments explaining very complex bits of logic.\nYou always follow the best practices for the requested languages in terms of describing the code written as a defined\npackage/project.\n\n\nPython toolbelt preferences:\n- pytest\n- dataclasses\n"
},
# … same conversation as earlier, ended with "Make your own assumptions and state them explicitly before starting".
{
"role": "assistant",
"content": "Assumptions:\n1. Model: The model will contain the game's data, such as level information, character states, and enemy positions.\n2. View: The view will handle the game's visuals, including rendering the game objects, backgrounds, and updating the display.\n3. Controller: The controller will manage user input, such as keyboard controls, and update the model accordingly.\n\nWith these assumptions in mind, is there any specific aspect of the keyboard control implementation you would like me to clarify?"
},
{
"role": "user",
"content": "Please now remember the steps:\n\nThink step by step and reason yourself to the right decisions to make sure we get it right.\nFirst lay out the names of the core classes, functions, methods that will be necessary, As well as a quick comment on their purpose.\n\nThen you will output the content of each file including ALL code.\nEach file must strictly follow a markdown code block format, where the following tokens must be replaced such that\nFILENAME is the lowercase file name including the file extension,\nLANG is the markup code block language for the code's language, and CODE is the code:\n\nFILENAME\n```LANG\nCODE\n```\n\nPlease note that the code should be fully functional. No placeholders.\n\nYou will start with the \"entrypoint\" file, then go to the ones that are imported by that file, and so on.\nFollow a language and framework appropriate best practice file naming convention.\nMake sure that files contain all imports, types etc. The code should be fully functional. Make sure that code in different files are compatible with each other.\nBefore you finish, double check that all parts of the architecture is present in the files.\n"
}
]
挑戰(zhàn)
在對(duì)構(gòu)建以LLM為中心的智能體的核心思想以及應(yīng)用示范過(guò)了一遍之后,我發(fā)現(xiàn)一些局限性:
有限的上下文長(zhǎng)度:上下文容量的局限會(huì)限制可以包含的歷史信息、細(xì)節(jié)指令、API調(diào)用上下文以及響應(yīng)。系統(tǒng)的設(shè)計(jì)必須考慮工作在此通信帶寬限制之上。如果有更長(zhǎng)的或者無(wú)限的上下文窗口,類似從過(guò)去錯(cuò)誤中學(xué)習(xí)的自我反思之類的機(jī)制就可以收獲更大。雖然向量數(shù)據(jù)的存取與檢索可以提供一個(gè)更大的知識(shí)池,它們的表示能力還是無(wú)法和全注意力機(jī)制相提并論
長(zhǎng)期規(guī)劃與任務(wù)分解中的挑戰(zhàn):在一段跨度很長(zhǎng)的歷史信息上進(jìn)行規(guī)劃以及解決方案空間的高效探索都是非常具有挑戰(zhàn)性的。LLMs在面對(duì)異常錯(cuò)誤的時(shí)候很難對(duì)規(guī)劃進(jìn)行調(diào)整,這與從試錯(cuò)中學(xué)習(xí)的人類相比還是遠(yuǎn)不夠看
自然語(yǔ)言接口的可靠性:當(dāng)前的智能系統(tǒng)還依賴于自然語(yǔ)言作為L(zhǎng)LMs與外部組件(如記憶與工具)的接口。然而,模型輸出的可靠性還是一個(gè)問(wèn)題。LLMs可能會(huì)犯格式化錯(cuò)誤,并且偶爾也會(huì)犯?。ū热缇芙^遵循指令)。結(jié)果,大量的智能體示例都在重點(diǎn)關(guān)注如何轉(zhuǎn)換模型的輸出
引用
引用格式:
“
Weng, Lilian. (Jun 2023). LLM-powered Autonomous Agents". Lil’Log. https://lilianweng.github.io/posts/2023-06-23-agent/.
”
或者
@article{weng2023prompt,
title = "LLM-powered Autonomous Agents"",
author = "Weng, Lilian",
journal = "lilianweng.github.io",
year = "2023",
month = "Jun",
url = "https://lilianweng.github.io/posts/2023-06-23-agent/"
}
評(píng)論排行