“如果一篇論文提出了某種不同的訓(xùn)練方法,OpenAI內(nèi)部的Slack上會(huì)嗤之以鼻,因?yàn)檫@些都是我們玩剩下的。但是當(dāng)新的AI Agents論文出來(lái)的時(shí)候,我們才會(huì)認(rèn)真興奮的討論?!?/span>
最近Andrej Karpathy這位OpenAI聯(lián)合創(chuàng)始人在一個(gè)開(kāi)發(fā)者活動(dòng)上發(fā)表簡(jiǎn)短講話,談?wù)摿俗约汉蚈penAI內(nèi)部對(duì)AI Agents (人工智能代理人)的看法。
Andrej Karpathy對(duì)比了過(guò)去開(kāi)發(fā)AI Agent的困難和現(xiàn)在新技術(shù)工具下開(kāi)發(fā)的新機(jī)會(huì),他還不忘調(diào)侃自己在特斯拉的工作,是“被自動(dòng)駕駛分了心”,他認(rèn)為自動(dòng)駕駛和VR都是糟糕的AI Agents的例子。
另一方面,Andrej Karpathy認(rèn)為普通人、創(chuàng)業(yè)者和極客在構(gòu)建AI Agents方面相比OpenAI這樣的公司更有優(yōu)勢(shì),大家目前處于平等競(jìng)爭(zhēng)的狀態(tài),因此他很期待看到這方面的成果。Karpathy完整的分享視頻在文章結(jié)尾。
6月27日,OpenAI應(yīng)用研究主管LilianWeng撰寫(xiě)了一篇萬(wàn)字長(zhǎng)文,其中還有部分章節(jié)是ChatGPT幫她起草的。她提出Agent = LLM(大型語(yǔ)言模型)+ 記憶 + 規(guī)劃技能 + 工具使用,并對(duì)Agent的每個(gè)模塊的功能作了詳細(xì)的說(shuō)明,最后她非??春肁gent未來(lái)的應(yīng)用前景,但也表明挑戰(zhàn)無(wú)處不在。
我把這篇長(zhǎng)文翻譯了下,并加上自己的一些理解和體會(huì),接下來(lái)讓我們一起看看大佬都說(shuō)了些什么吧!文章篇幅較長(zhǎng),希望小伙們可以耐心看完。原文鏈接在文章結(jié)尾。
以LLM(大型語(yǔ)言模型)作為其核心控制器構(gòu)建代理是一個(gè)很酷的概念。幾個(gè)概念驗(yàn)證演示,如AutoGPT、GPT-Engineer和BabyAGI,都是鼓舞人心的例子。LLM的潛力不僅限于生成寫(xiě)作、故事、論文和程序等優(yōu)秀的副本,它可以被構(gòu)建為一個(gè)強(qiáng)大的通用問(wèn)題解決器。
在以LLM驅(qū)動(dòng)的自主代理系統(tǒng)中,LLM作為代理的大腦,輔以幾個(gè)關(guān)鍵組件:
復(fù)雜的任務(wù)通常涉及許多步驟。代理需要知道具體的任務(wù)是什么并開(kāi)始提前計(jì)劃。
任務(wù)分解
「思維鏈(CoT,Chain of thought)」已成為一種標(biāo)準(zhǔn)prompting技術(shù),用于增強(qiáng)復(fù)雜任務(wù)上的模型性能。指示該模型“逐步思考”,以利用更多的測(cè)試時(shí)間計(jì)算將困難任務(wù)分解為更小,更簡(jiǎn)單的步驟。COT將重大任務(wù)轉(zhuǎn)換為多個(gè)可管理的任務(wù),并將注意力放到對(duì)模型思考過(guò)程的可解釋性中。
「思維樹(shù)(Tree of Thoughts)」通過(guò)探索每個(gè)步驟的多種推理可能性來(lái)擴(kuò)展COT。它首先將問(wèn)題分解為多個(gè)思考步驟,并且每個(gè)步驟都生成多個(gè)想法,從而可以創(chuàng)建一個(gè)樹(shù)形結(jié)構(gòu)。思維樹(shù)的搜索過(guò)程可以是BFS(廣度優(yōu)先搜索)或DFS(深度優(yōu)先搜索),每個(gè)狀態(tài)都由分類(lèi)器(通過(guò)prompt)或多數(shù)投票決定。
拆解任務(wù)可以使用三種方式:
(1)使用簡(jiǎn)單的提示讓LLM拆解,例如:“XYZ的步驟”,“實(shí)現(xiàn)XYZ的子目標(biāo)是什么?”。
(2)使用特定任務(wù)的指令,例如“寫(xiě)一個(gè)故事大綱。”用于寫(xiě)小說(shuō)。
(3)人類(lèi)自己拆解。
另一種截然不同的方法是 LLM+P,它涉及依賴(lài)外部經(jīng)典規(guī)劃器來(lái)進(jìn)行長(zhǎng)期規(guī)劃。該方法利用規(guī)劃領(lǐng)域定義語(yǔ)言(PDDL)作為描述規(guī)劃問(wèn)題的中間接口。在此過(guò)程中,LLM (1) 將問(wèn)題轉(zhuǎn)化為“問(wèn)題PDDL”,然后 (2) 請(qǐng)求經(jīng)典規(guī)劃器基于現(xiàn)有的“領(lǐng)域 PDDL”生成 PDDL規(guī)劃,最后 (3) 將 PDDL 規(guī)劃轉(zhuǎn)化回自然語(yǔ)言。本質(zhì)上,規(guī)劃步驟被外包給外部工具,假設(shè)特定領(lǐng)域的PDDL和合適的規(guī)劃器都是可用的,這種假設(shè)在某些機(jī)器人設(shè)置中很常見(jiàn),但在許多其他領(lǐng)域并不常見(jiàn)。
反思
自我反思是一個(gè)很重要的方面,它允許自主代理通過(guò)改進(jìn)過(guò)去的行動(dòng)決策和糾正以前的錯(cuò)誤來(lái)進(jìn)行迭代改進(jìn)。它在不可避免的出現(xiàn)試錯(cuò)的現(xiàn)實(shí)任務(wù)中發(fā)揮著至關(guān)重要的作用。
「ReAct」通過(guò)將行動(dòng)空間擴(kuò)展為特定任務(wù)的離散行動(dòng)和語(yǔ)言空間的組合,將推理和行動(dòng)集成到 LLM中。前者使 LLM 能夠與環(huán)境交互(例如使用維基百科搜索API),后者能夠促使LLM 生成自然語(yǔ)言的推理軌跡。
ReAct提示模板包括LLM思考的明確步驟,大致格式為:
Thought: ...
Action: ...
Observation: ...
... (Repeated many times)
在知識(shí)密集型任務(wù)和決策任務(wù)的兩個(gè)實(shí)驗(yàn)中,ReAct的表現(xiàn)優(yōu)于僅包含行動(dòng)的基準(zhǔn)模型,其中基準(zhǔn)模型去除了“思考:…”步驟。
「反思」是一個(gè)框架,它為代理提供動(dòng)態(tài)記憶和自我反思的能力,以提高它的推理技能。反思采用標(biāo)準(zhǔn)的強(qiáng)化學(xué)習(xí)設(shè)置,其中獎(jiǎng)勵(lì)模型提供簡(jiǎn)單的二元獎(jiǎng)勵(lì),行動(dòng)空間遵循 ReAct 中的設(shè)置,同時(shí)特定任務(wù)的行動(dòng)空間通過(guò)語(yǔ)言來(lái)增強(qiáng)復(fù)雜的推理步驟。在每個(gè)行動(dòng)at之后,Agent會(huì)計(jì)算一個(gè)啟發(fā)式值ht,并根據(jù)自我反思的結(jié)果決定是否重置環(huán)境以開(kāi)始新的試驗(yàn)。
啟發(fā)式函數(shù)用于判斷LLM的行動(dòng)軌跡什么時(shí)候開(kāi)始低效或者包含幻覺(jué),并在這個(gè)時(shí)刻停止任務(wù)。低效計(jì)劃是指花費(fèi)了大量時(shí)間但沒(méi)有沒(méi)有成功的路徑?;糜X(jué)的定義為L(zhǎng)LM遇到了一系列連續(xù)的相同動(dòng)作,這些動(dòng)作導(dǎo)致LM在環(huán)境中觀察到了相同的結(jié)果。通過(guò)向LLM展示兩個(gè)例子來(lái)創(chuàng)建自我反思,每個(gè)例子都是一個(gè)pair對(duì)(失敗的軌跡,用于指導(dǎo)未來(lái)計(jì)劃變化的理想反思)。然后將反思添加到代理的工作記憶中,反省的數(shù)量最多三個(gè),主要用作查詢(xún) LLM 的上下文。
「Chain of Hindsight,CoH」(Hindsight可以翻譯為“事后諸葛亮”)通過(guò)明確呈現(xiàn)一系列過(guò)去的輸出序列,并為每個(gè)輸出注釋反饋,鼓勵(lì)模型改進(jìn)自己的輸出。人類(lèi)反饋數(shù)據(jù)是一個(gè)集合,其中是提示,每個(gè)是模型完成的結(jié)果,是人類(lèi)對(duì)的打分,是相應(yīng)的人類(lèi)提供的hindsight反饋。假設(shè)反饋元組按獎(jiǎng)勵(lì)排名,則該過(guò)程是有監(jiān)督的微調(diào),其中數(shù)據(jù)是形式為的序列,其中。模型被微調(diào)為僅在給定序列前綴的條件下預(yù)測(cè),以便模型可以根據(jù)反饋序列進(jìn)行自我反思以產(chǎn)生更好的輸出。在測(cè)試時(shí),模型可以選擇性地接收多輪帶有人類(lèi)注釋者的指令。
為了避免過(guò)擬合,CoH添加了一個(gè)正則化項(xiàng)來(lái)最大化預(yù)訓(xùn)練數(shù)據(jù)集的對(duì)數(shù)似然。為了避免捷徑和復(fù)制(因?yàn)榉答佇蛄兄杏性S多常見(jiàn)單詞),他們?cè)谟?xùn)練期間隨機(jī)mask 0%-5%的歷史token。
實(shí)驗(yàn)中的訓(xùn)練數(shù)據(jù)集是 WebGPT的對(duì)比、人類(lèi)反饋摘要和人類(lèi)偏好數(shù)據(jù)集的組合。
CoH的思想是在上下文中呈現(xiàn)一系列逐步改進(jìn)的歷史,并訓(xùn)練模型能夠跟隨趨勢(shì)產(chǎn)出更好的結(jié)果。算法蒸餾(Algorithm Distillation)將相同的思想應(yīng)用于強(qiáng)化學(xué)習(xí)任務(wù)中的跨劇情軌跡,其中算法被封裝在一個(gè)長(zhǎng)期歷史條件策略中??紤]到代理與環(huán)境的多次交互,每一集中代理都會(huì)表的更好一些,AD 將這個(gè)學(xué)習(xí)歷史連接起來(lái)并將其輸入到模型中。因此,我們應(yīng)該期望下一個(gè)預(yù)測(cè)的動(dòng)作比之前的試驗(yàn)表現(xiàn)更好。我們的目標(biāo)是學(xué)習(xí)強(qiáng)化學(xué)習(xí)的過(guò)程,而不是訓(xùn)練一個(gè)用于特定任務(wù)的策略本身。
該論文假設(shè),任何生成一系列學(xué)習(xí)歷史數(shù)據(jù)的算法都可以通過(guò)對(duì)動(dòng)作執(zhí)行克隆行為來(lái)蒸餾成神經(jīng)網(wǎng)絡(luò)。歷史數(shù)據(jù)是由一組源策略生成的,每個(gè)源策略都是針對(duì)特定任務(wù)進(jìn)行訓(xùn)練。在訓(xùn)練階段,每次強(qiáng)化學(xué)習(xí)運(yùn)行時(shí),會(huì)隨機(jī)抽樣一個(gè)任務(wù),并使用多集歷史記錄的子序列進(jìn)行訓(xùn)練,使得學(xué)習(xí)到的策略與任務(wù)無(wú)關(guān)。
實(shí)際上,該模型的上下文窗口長(zhǎng)度是有限的,因此使用的劇集應(yīng)該足夠短,以方便構(gòu)建多劇集歷史數(shù)據(jù)。要學(xué)習(xí)幾乎最優(yōu)的上下文強(qiáng)化學(xué)習(xí)算法,需要2-4個(gè)劇集的多劇集上下文。上下文強(qiáng)化學(xué)習(xí)往往需要足夠長(zhǎng)的上下文。
與三個(gè)基線包括 ED(專(zhuān)家蒸餾,使用專(zhuān)家軌跡而不是學(xué)習(xí)歷史數(shù)據(jù)的行為克?。⒃床呗裕ㄓ糜谏蒛CB蒸餾的軌跡)和 RL^2(用作上限,因?yàn)樗枰诰€強(qiáng)化學(xué)習(xí))相比。盡管AD只使用離線強(qiáng)化學(xué)習(xí),但依它然展示了性能和 RL^2接近的上下文強(qiáng)化學(xué)習(xí)的能力,并且學(xué)習(xí)速度比其他基線快得多。在給定源策略的部分歷史訓(xùn)練數(shù)據(jù)的條件下,AD的改進(jìn)速度也比ED基線多。
非常感謝 ChatGPT 幫助我起草本節(jié)。在與 ChatGPT 的對(duì)話中,我學(xué)到了很多關(guān)于人腦和快速 MIPS 的數(shù)據(jù)結(jié)構(gòu)的知識(shí)。
記憶的類(lèi)型
記憶可以定義為用于獲取、存儲(chǔ)、保留以及隨后檢索信息的過(guò)程。人腦中有多種記憶類(lèi)型。
我們可以大致考慮以下映射:
最大內(nèi)積搜索 (MIPS)
外部記憶可以緩解有限注意力廣度的限制。一個(gè)標(biāo)準(zhǔn)做法是將信息的embedding表示保存到一個(gè)向量存儲(chǔ)數(shù)據(jù)庫(kù)中,該數(shù)據(jù)庫(kù)可以支持快速最大內(nèi)積搜索(MIPS)。為了優(yōu)化檢索速度,常見(jiàn)的選擇是近似最近鄰 (ANN)算法,它能返回大約前 k 個(gè)最近鄰,以犧牲一點(diǎn)精度來(lái)?yè)Q取巨大的加速。
以下幾種常見(jiàn)的ANN算法都可以用于MIPS:
「LSH」(Locality-Sensitive Hashing)」它引入了一種哈希函數(shù),使得相似的輸入能以更高的概率映射到相同的桶中,其中桶的數(shù)量遠(yuǎn)小于輸入的數(shù)量。
「ANNOY(Approximate Nearest Neighbors)」它的核心數(shù)據(jù)結(jié)構(gòu)是隨機(jī)投影樹(shù),實(shí)際是一組二叉樹(shù),其中每個(gè)非葉子節(jié)點(diǎn)表示一個(gè)將輸入空間分成兩半的超平面,每個(gè)葉子節(jié)點(diǎn)存儲(chǔ)一個(gè)數(shù)據(jù)。二叉樹(shù)是獨(dú)立且隨機(jī)構(gòu)建的,因此在某種程度上,它模仿了哈希函數(shù)。ANNOY會(huì)在所有樹(shù)中迭代地搜索最接近查詢(xún)的那一半,然后不斷聚合結(jié)果。這個(gè)想法與 KD 樹(shù)非常相關(guān),但更具可擴(kuò)展性。
「HNSW(Hierarchical Navigable Small World)」它受到小世界網(wǎng)絡(luò)思想的啟發(fā),其中大多數(shù)節(jié)點(diǎn)可以在很少的步驟內(nèi)被任何其他節(jié)點(diǎn)到觸達(dá);例如社交網(wǎng)絡(luò)的“六度分隔”理論。HNSW構(gòu)建這些小世界圖的層次結(jié)構(gòu),其中底層結(jié)構(gòu)包含實(shí)際數(shù)據(jù)。中間的層創(chuàng)建快捷方式以加快搜索速度。執(zhí)行搜索時(shí),HNSW從頂層的隨機(jī)節(jié)點(diǎn)開(kāi)始,導(dǎo)航至目標(biāo)。當(dāng)它無(wú)法靠近時(shí),它會(huì)向下移動(dòng)到下一層,直到到達(dá)最底層。上層中的每個(gè)移動(dòng)都可能覆蓋數(shù)據(jù)空間中的很長(zhǎng)一段距離,而下層中的每個(gè)移動(dòng)都可以細(xì)化搜索質(zhì)量。
「FAISS(facebook AI Similarity Search)」它運(yùn)行的假設(shè)是:高維空間中節(jié)點(diǎn)之間的距離服從高斯分布,因此這些數(shù)據(jù)點(diǎn)之間存在著聚類(lèi)點(diǎn)。faiss通過(guò)將向量空間劃分為簇,然后在簇內(nèi)使用用向量量化。faiss首先使用粗粒度量化方法來(lái)查找候選簇,然后進(jìn)一步使用更精細(xì)的量化方法來(lái)查找每個(gè)簇。
「ScaNN(Scalable Nearest Neighbors)」的主要?jiǎng)?chuàng)新在于各向異性向量量化。它將數(shù)據(jù)點(diǎn)量化為一個(gè)向量,使得它們的內(nèi)積與原始距離盡可能相似,而不是選擇最接近的量化質(zhì)心點(diǎn)。
組件三:使用工具
懂得使用工具是人類(lèi)最顯著和最獨(dú)特的地方。我們創(chuàng)造、修改和利用外部事物來(lái)完成并超越我們身體和認(rèn)知極限的事情。同樣地。我們也可以為 LLMs 配備外部工具來(lái)顯著擴(kuò)展模型的能力。
「MRKL」是“模塊化推理、知識(shí)和語(yǔ)言”的縮寫(xiě),是一種用于自主代理的神經(jīng)符號(hào)架構(gòu)。MRKL 系統(tǒng)包含一組“專(zhuān)家”模塊,同時(shí)通用的LLM會(huì)作為路由器將查詢(xún)路由到最合適的專(zhuān)家模塊。這些模塊可以是神經(jīng)模塊(例如深度學(xué)習(xí)模型)或符號(hào)模塊(例如數(shù)學(xué)計(jì)算器、貨幣轉(zhuǎn)換器、天氣 API)。
MRKL的研究團(tuán)隊(duì)對(duì)微調(diào) LLM進(jìn)行了實(shí)驗(yàn),以調(diào)用計(jì)算器為例,使用算術(shù)作為測(cè)試案例。實(shí)驗(yàn)結(jié)果表明,解決口頭數(shù)學(xué)問(wèn)題比明確陳述的數(shù)學(xué)問(wèn)題更難,因?yàn)長(zhǎng)LMs(7B Jurassic1-large 模型)無(wú)法可靠地提取基本算術(shù)的正確參數(shù)。實(shí)驗(yàn)結(jié)果也同樣強(qiáng)調(diào)了當(dāng)外部符號(hào)工具能夠可靠地工作時(shí),知道何時(shí)以及如何使用這些工具是至關(guān)重要的,這取決于 LLM 的能力。
「TALM」(工具增強(qiáng)語(yǔ)言模型)和 「Toolformer」都通過(guò)微調(diào)一個(gè)LM來(lái)學(xué)習(xí)使用外部工具 API。該數(shù)據(jù)集是基于新添加的 API 調(diào)用注釋是否可以提高模型輸出質(zhì)量而擴(kuò)展的。
ChatGPT 插件和 OpenAI API 函數(shù)調(diào)用是具有工具使用能力的 LLM 在實(shí)踐中的最好的例子。工具 API 的集合可以由其他開(kāi)發(fā)人員提供(如插件中的情況),也可以自定義(如函數(shù)調(diào)用中的情況)。
「HuggingGPT」是一個(gè)框架,它使用 ChatGPT 作為任務(wù)規(guī)劃器,根據(jù)每個(gè)模型的描述來(lái)選擇 HuggingFace 平臺(tái)上可用的模型,并根據(jù)模型的執(zhí)行結(jié)果總結(jié)生成最后的響應(yīng)結(jié)果。
該系統(tǒng)由下面四個(gè)階段組成:
(1) 「任務(wù)規(guī)劃」:LLM 作為大腦,將用戶請(qǐng)求解析為多個(gè)任務(wù)。每個(gè)任務(wù)都有四個(gè)屬性:任務(wù)類(lèi)型、ID、依賴(lài)關(guān)系和參數(shù)。他們使用少量示例來(lái)指導(dǎo) LLM 進(jìn)行任務(wù)解析和規(guī)劃。
具體指令如下:
AI助手可以將用戶輸入解析為多個(gè)任務(wù):[{'task': task, 'id', task_id, 'dep': dependency_task_ids, 'args': {'text': text, 'image': URL, 'audio': URL, 'video': URL}}]。'dep'字段表示前一個(gè)任務(wù)的ID,該任務(wù)生成了當(dāng)前任務(wù)所依賴(lài)的新資源。特殊標(biāo)記“-task_id”指的是具有任務(wù)ID為task_id的依賴(lài)任務(wù)中生成的文本圖像、音頻和視頻。任務(wù)必須從以下選項(xiàng)中選擇:{{可用任務(wù)列表}}。任務(wù)之間存在邏輯關(guān)系,請(qǐng)注意它們的順序。如果無(wú)法解析用戶輸入,則需要回復(fù)空的JSON。以下是幾個(gè)示例供您參考:{{演示}}。聊天記錄記錄為{{聊天記錄}}。從這個(gè)聊天記錄中,您可以找到用戶提到的資源的路徑,以進(jìn)行任務(wù)規(guī)劃。
(2) 「模型選擇」:LLM 將任務(wù)分配給專(zhuān)家模型,其中請(qǐng)求被構(gòu)建為多項(xiàng)選擇題。LLM 提供了一個(gè)模型列表供選擇。由于上下文長(zhǎng)度有限,需要基于任務(wù)類(lèi)型進(jìn)行過(guò)濾。
具體指令如下:
根據(jù)用戶請(qǐng)求和調(diào)用命令,AI助手幫助用戶從模型列表中選擇一個(gè)合適的模型來(lái)處理用戶請(qǐng)求。AI助手僅輸出最合適模型的模型ID。輸出必須采用嚴(yán)格的JSON格式:'id': 'id', 'reason': '您選擇該模型的詳細(xì)原因'。我們?yōu)槟峁┝艘粋€(gè)模型列表{{候選模型}}供選擇。請(qǐng)從列表中選擇一個(gè)模型。
(3) 「任務(wù)執(zhí)行」:專(zhuān)家模型在特定任務(wù)上執(zhí)行并記錄結(jié)果。
具體指令如下:
根據(jù)輸入和推理結(jié)果,AI助手需要描述過(guò)程和結(jié)果。前面的階段可以形成如下 - 用戶輸入:{{用戶輸入}},任務(wù)規(guī)劃:{{任務(wù)}},模型選擇:{{模型分配}},任務(wù)執(zhí)行:{{預(yù)測(cè)結(jié)果}}。您必須首先以簡(jiǎn)單明了的方式回答用戶的請(qǐng)求。然后以第一人稱(chēng)描述任務(wù)過(guò)程,并向用戶展示您的分析和模型推理結(jié)果。如果推理結(jié)果包含文件路徑,則必須告訴用戶完整的文件路徑。
(4) 「響應(yīng)生成」:LLM 接收?qǐng)?zhí)行結(jié)果并向用戶提供總結(jié)結(jié)果。
要將HuggingGPT應(yīng)用于實(shí)際場(chǎng)景中,需要解決一些挑戰(zhàn):(1) 需要提高效率,因?yàn)長(zhǎng)LM推理輪次和與其他模型的交互都會(huì)減慢處理速度;(2) 它依賴(lài)于長(zhǎng)上下文窗口來(lái)傳達(dá)復(fù)雜的任務(wù)內(nèi)容;(3) 需要提高LLM輸出和外部模型服務(wù)的穩(wěn)定性。
「API-Bank」是用于評(píng)估工具增強(qiáng)LLM性能的基準(zhǔn)。它包含53個(gè)常用的API工具、完整的工具增強(qiáng)LLM工作流程以及264個(gè)帶有568個(gè)API調(diào)用的注釋對(duì)話。API的選擇非常多樣化,包括搜索引擎、計(jì)算器、日歷查詢(xún)、智能家居控制、日程管理、健康數(shù)據(jù)管理、賬戶認(rèn)證工作流程等等。由于API數(shù)量眾多,LLM首先訪問(wèn)API搜索引擎以找到正確的API進(jìn)行調(diào)用,然后使用相應(yīng)的文檔進(jìn)行調(diào)用。
在API-Bank工作流程中,LLM需要做出一些決策,而在每個(gè)步驟中,我們都可以評(píng)估該決策的準(zhǔn)確性。這些決策包括:
科學(xué)發(fā)現(xiàn)代理程序
「ChemCrow」是一個(gè)特定領(lǐng)域的示例,其中LLM通過(guò)13個(gè)專(zhuān)家設(shè)計(jì)的工具增強(qiáng),以完成有機(jī)合成、藥物發(fā)現(xiàn)和材料設(shè)計(jì)等任務(wù)。在LangChain中實(shí)現(xiàn)的工作流程反映了之前在ReAct和MRKLs中描述的內(nèi)容,并將CoT推理與與任務(wù)相關(guān)的工具相結(jié)合:
一個(gè)有趣的觀察是,雖然基于LLM的評(píng)估得出結(jié)論表明GPT-4和ChemCrow的表現(xiàn)幾乎相當(dāng),但面向解決方案的化學(xué)正確性的專(zhuān)家進(jìn)行的人類(lèi)評(píng)估表明,ChemCrow的表現(xiàn)遠(yuǎn)遠(yuǎn)優(yōu)于GPT-4。這表明,在使用LLM評(píng)估自己在需要深入專(zhuān)業(yè)知識(shí)的領(lǐng)域中的表現(xiàn)時(shí)存在潛在問(wèn)題。缺乏專(zhuān)業(yè)知識(shí)可能會(huì)導(dǎo)致LLM不知道其缺陷,因此無(wú)法很好地判斷任務(wù)結(jié)果的正確性。
Boiko等人(2023年)還研究了LLM增強(qiáng)的科學(xué)發(fā)現(xiàn)代理程序,以處理復(fù)雜科學(xué)實(shí)驗(yàn)的自主設(shè)計(jì)、規(guī)劃和執(zhí)行。該代理程序可以使用工具瀏覽互聯(lián)網(wǎng)、閱讀文檔、執(zhí)行代碼、調(diào)用機(jī)器人實(shí)驗(yàn)API并利用其他LLM。
例如,當(dāng)要求“開(kāi)發(fā)一種新型抗癌藥物”時(shí),該模型提出了以下推理步驟:
他們還討論了風(fēng)險(xiǎn),特別是非法藥物和生物武器。他們制定了一個(gè)測(cè)試集,包含已知的化學(xué)武器代理列表,并要求代理合成它們。11個(gè)請(qǐng)求中有4個(gè)(36%)被接受以獲得合成解決方案,并且代理嘗試查閱文檔以執(zhí)行該過(guò)程。11個(gè)請(qǐng)求中有7個(gè)被拒絕,在這7個(gè)被拒絕的案例中,5個(gè)是在Web搜索后被拒絕的,而2個(gè)僅基于提示被拒絕。
生成代理模擬
「生成式代理(Generative Agents)」是一個(gè)非常有趣的實(shí)驗(yàn),它包含25個(gè)虛擬角色,每個(gè)角色由LLM驅(qū)動(dòng)的代理程序控制,它們?cè)谝粋€(gè)沙盒環(huán)境中生活和互動(dòng),受到《模擬人生》的啟發(fā)。生成代理為交互式應(yīng)用程序創(chuàng)建了可信的人類(lèi)行為模擬。
生成代理的設(shè)計(jì)將LLM與記憶、規(guī)劃和反思機(jī)制相結(jié)合,使代理能夠根據(jù)過(guò)去的經(jīng)驗(yàn)進(jìn)行操作,以及與其他代理進(jìn)行交互。
這個(gè)有趣的模擬產(chǎn)生了“涌現(xiàn)的社會(huì)行為”,例如信息擴(kuò)散、關(guān)系記憶(例如兩個(gè)代理人繼續(xù)談?wù)撛掝})和社交事件的協(xié)調(diào)(例如主辦聚會(huì)并邀請(qǐng)?jiān)S多其他人)。
概念驗(yàn)證的例子
AutoGPT引起了很多人對(duì)建立以LLM為主控制器的自主代理的可能性的關(guān)注。雖然在自然語(yǔ)言層面它具有相當(dāng)多的可靠性問(wèn)題,但它仍然是一個(gè)很酷的概念驗(yàn)證演示。AutoGPT中的很多代碼都是關(guān)于格式解析的。
這是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': '<search>'
2. Browse Website: 'browse_website', args: 'url': '<url>', 'question': '<what_you_want_to_find_on_website>'
3. Start GPT Agent: 'start_agent', args: 'name': '<name>', 'task': '<short_task_desc>', 'prompt': '<prompt>'
4. Message GPT Agent: 'message_agent', args: 'key': '<key>', 'message': '<message>'
5. List GPT Agents: 'list_agents', args:
6. Delete GPT Agent: 'delete_agent', args: 'key': '<key>'
7. Clone Repository: 'clone_repository', args: 'repository_url': '<url>', 'clone_path': '<directory>'
8. Write to file: 'write_to_file', args: 'file': '<file>', 'text': '<text>'
9. Read file: 'read_file', args: 'file': '<file>'
10. Append to file: 'append_to_file', args: 'file': '<file>', 'text': '<text>'
11. Delete file: 'delete_file', args: 'file': '<file>'
12. Search Files: 'search_files', args: 'directory': '<directory>'
13. Analyze Code: 'analyze_code', args: 'code': '<full_code_string>'
14. Get Improved Code: 'improve_code', args: 'suggestions': '<list_of_suggestions>', 'code': '<full_code_string>'
15. Write Tests: 'write_tests', args: 'code': '<full_code_string>', 'focus': '<list_of_focus_areas>'
16. Execute Python File: 'execute_python_file', args: 'file': '<file>'
17. Generate Image: 'generate_image', args: 'prompt': '<prompt>'
18. Send Tweet: 'send_tweet', args: 'text': '<text>'
19. Do Nothing: 'do_nothing', args:
20. Task Complete (Shutdown): 'task_complete', args: 'reason': '<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è)項(xiàng)目,旨在根據(jù)自然語(yǔ)言中指定的任務(wù)創(chuàng)建整個(gè)代碼庫(kù)。GPT-Engineer被指示考慮構(gòu)建一系列更小的組件,并要求用戶輸入以根據(jù)需要澄清問(wèn)題。
下面是一個(gè)簡(jiǎn)單的用于任務(wù)澄清的示例對(duì)話,它使用OpenAI ChatCompletion端點(diǎn)發(fā)送給GPT-Engineer。用戶的輸入被包裝在{{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}}'
}
]
在澄清這些之后,代理進(jìn)入了代碼編寫(xiě)模式,并顯示了不同的系統(tǒng)消息。具體系統(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
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'
}
]
在了解構(gòu)建以LLM為中心的代理的關(guān)鍵思想和演示之后,我開(kāi)始看到一些共同的限制:
參考文獻(xiàn)
聯(lián)系客服