『2023Q2』漫談ChatGPT系列(10):Auto-GPT、ReAct模式 與 策略流程的自動化生成。

本文系列文章之一,之前提到的內容不會再重復討論。完整索引見文章末尾。

上一篇 『2023H1』漫談ChatGPT系列《9》:談 語義處理框架 的設計

1 導言

1.1 LangChain Agent 與 Auto-GPT

《本節給沒有看過本系列上一篇,但了解AutoGPT的讀者》

最近Auto-GPT一下在全網變得很熱門,它的能力也讓人覺得相對於ChatGPT和LLM更進了一層。

不過實際上它使用的主要『技術』在半年前就已經有文章提出了,LangChain Agent也在5-6個月前就實現了對應的功能。但先發不等於知名,這塊能力被人廣為認知還是要等到2023.3月AutoGPT項目開始後。

本文目標是從它的能力來源和實現方式來做一些探討。

1.2 語義處理程序的自動化生成

《本節給已經看過上一篇,但不了解AutoGPT的讀者》

在系列上一篇中,討論了如何基於LLM能力來構建更復雜、更可靠的策略處理邏輯的思路。這個視角是將LLM當成以一個高級的語義處理工具《函數》,再其上再類似傳統編程的方式來堆砌處理邏輯。

那麼語義處理程序《或者其他高級概念的處理程序》是否能擺脫人工編寫,也來讓LLM實現呢?Self ask和ReAct模式 給我們指出一個方向。而Auto-GPT就可以看成是它們的一個優化一點的實現。

在寫上一篇文章的時候,我還沒有推演到這種更加激進的idea,也沒有想到它已經能夠落地成demo。直到最近,我才從Auto-GPT這條線反查了解了這個思路。由於這個想法的創新性和落地成本較低,也由於中文圈對於這塊的介紹和討論內容還不是很多,讓我覺得有必要來寫一下。而且這個思路也是我上一篇內容的一個擴展。

2 讓LLM自己更好的思考

自從LLM被訓練出來,如何更多的『調用它的能力的不同方面』一直是人們探索的一個方向。相信大家已經耳熟能詳 思維鏈《Chain of Thoughts,簡寫為CoT》prompt模式,而本文要討論的self ask 和 ReAct也是類似的prompt模式,可以調動LLM的一部分新的能力。

本質上來講,chain of thoughts、self ask、ReAct三者其實手段類似,都是讓LLM以一個更細的粒度來思考。

2.1 Self ask

提出self ask方式的論文 Measuring and Narrowing the Compositionality Gap in Language Model ,作者的英文介紹文 Self-ask Prompting 。

這裡對齊最核心內做一個簡要介紹:

  • 主要思路:引導LLM將一個復雜的問題拆分為簡單的問題,逐個回答,然後匯總稱為答案。
  • 實施細節1:在prompt中直接提問『是否需要拆分出子問題』。
  • 實施細節2:拆分出的子問題,不依賴LLM自己進行回答,而是調用外部搜索工具進行回答。並把結果交給LLM繼續思考推理。

這個方式可以引入外部知識庫來補充LLM所不知道的信息,還可以讓LLM對它使用的事實進行校驗。

但如何引導LLM正確的分解問題,並且以合適的方式與上層調度整個過程的程序進行交互呢?是靠Few-shot的方式在prompt中先舉一些分解的例子《也有人稱為in-context learning》。

2.2 ReAct

ReAct是 Reasoning + Acting的簡寫,提出的論文是 ReAct: Synergizing Reasoning and Acting in Language Models ,一個英文的詳細介紹可以見 https://tsmatz.wordpress.com/2023/03/07/react-with-openai-gpt-and-langchain/ 。

ReAct也是引導LLM將復雜的問題解決過程拆解為簡單的步驟,差異是:

  • 和self ask不同,ReAct每次讓LLM輸出一個當前的『思考』和『要做的動作』,這個動作並不隻限於檢索信息,可以是調用任何工具,類似ChatGPT plugin。LLM通過few shot的例子和工具自帶的描述、還有它自己學到的常識來決定何時調用工具以及如何調用工具。

這樣ReAct引入了外部工具的概念,讓LLM能夠通過這種步進式的方式逐步思考並調用外部工具,根絕外部工具的結果進一步思考循環。同時也可以僅僅是輸出一步思考,並繼續下去,類似CoT。

整個過程是逐步推進的,並且可以直觀的輸出整個策略系統的思考和執行過程,對用戶的可解釋性也很好。

這個過程仍然是靠few-shot的方式給例子,引導LLM類似的『思考』,並按格式返回後續步驟的信息。

2.3 Auto-GPT

ReAct再加上一些工具《如搜索等》,其實就已經能夠有Auto-GPT大部分的能力,這塊LangChain Agent中已經實現了ReAct的版本。不過Auto-GPT有一些改進:

  • 支持更多的工具/操作,包括對於本地文件系統的控制。這也是為什麼AutoGPT需要被放到一個沙盒docker中運行,為了保證用戶環境的安全。
  • 每次讓LLM輸出的內容包括:
    • Thoughts:當前的思考
    • Reasoning:推理過程
    • Plan:後續計劃
    • Criticism:《在執行操作前預想的》自我批判審視
    • Next action:下一步行動
    • 這個引導思考的模板比ReAct更全面一些。其中的Criticism看起來LLM外部沒有用,但其實是通過對話歷史給到後續的LLM調用中,幫助改善LLM的推理結果的。
  • 此外,還通過prompt對於LLM給到一些信息和要求:
    • 它自己的記憶很短,重要內容要盡快保存到文件中。
    • 不要依賴用戶。
    • 持續回顧和分析自己之前的行為,目標是充分發揮自己的能力。
    • 自我批判。
    • 反思過去的決定和策略來改進後續的方法。
    • 每個命令都有成本,要盡可能高效,減少步驟。

這些prompt指定都在 https://github.com/Significant-Gravitas/Auto-GPT/blob/master/autogpt/prompt.py

Auto-GPT似乎並沒有通過few-shot的方式來舉例讓LLM模仿思考方式,而是直接給了一些更抽象層面的指示。這看起來就像是給一個人的指示,再加上Auto-GPT運行時所展示的思考能力,會讓人覺得這已經像是一個非常非常簡單的AGI。

更詳細的AutoGPT源代碼分析見 Auto-GPT實現解析

3 對Auto-GPT的評論

3.0 Auto-GPT 不是人

雖然Auto-GPT自己使用的prompt和Auto-GPT在各種問題上展示的思考過程都很讓人覺得它已經很像人,雖然它還有這個各種各樣的問題,會卡在各種各樣簡單的地方。但這個能力確實看起來遠超過人類創造的任何一個工具。

那它是一個困在模型中的人麼?它有自己的意識麼?

我對此的回答還是跟對LLM和ChatGPT一樣,它雖然看起來有類人的反應能力,但它沒有意識。也沒有我們意義上的那種很好的《多步》思考能力,如果單步反應也算是思考的化。

當然這已經是一個哲學問題,每個人會有自己的思考和認知的演變過程。我覺得這個問題得留給哲學家來回答。

3.1 技術上的問題

這方面已經有了一個文章對它進行評論了: https://jina.ai/news/auto-gpt-unmasked-hype-hard-truths-production-pitfalls/

這裡簡要概括一下其中指出的問題:

  • 成本高昂。主要來自於:LLM的調用成本、需要的LLM的調用次數較多、每次調用需要使用的Context很長。
  • 已有思考過程無法固化。每次對於同類問題都需要重復進行思考,耗費同樣的費用成本。
  • 經常陷入死循環。

3.2 思考/決策過程的可靠性

雖然Auto-GPT看起來功能強大,但我得說:它的質量隻能算的上是一個demo。Auto-GPT項目自己也自稱為一個實驗。

目前依靠LLM的系統,如果希望可靠的解決問題、完成人物,LLM自身的不可靠都是一個主要的問題。本系列上一篇文章的主題也是如何基於LLM來構建一個更可靠的策略系統。Auto-GPT不光依賴LLM,還把策略本身的實現也交給LLM完成。當LLM的結果出現問題時,LLM以外沒有任何矯正能力,所以其整體的可靠性較低就不奇怪了。

特別是排除LLM後,整個系統就隻有一個循環迭代策略,這就很難避免超過LLM支持的的最大Context長度的死循環。

所以我的看法是:Auto-GPT雖然看起來功能強大,但光靠它自己是很難取得商業上的成功的,即使不考慮其昂貴的成本。

4 一些個人展望

回顧一下上一篇 《9》:談 語義處理框架 的設計 的內容和本文前面的內容,有:

4.1 Auto-GPT的prompt模式仍然可以改進

前面第2節提到的方式都是讓LLM以一個更小的粒度做決策,Auto-GPT中雖然加了讓其自我批判、自我反思的過程,但整個過程仍然是一個走不回頭路的過程。實際上,沿著類似的思路,我們可以進一步優化策略的可靠性:

  • 讓其對問題構造一個稍微通用一點的處理過程
  • 在實際執行前,讓LLM審視和優化這個過程
  • 然後再付諸執行,並在執行中可以根據當前的具體情況決定是否要重新生成整個策略過程再繼續執行。
  • 用上一篇文章的視角就可以描述成:先讓LLM生成一個語義處理程序,然後要求LLM優化這個語義處理程序,然後再付諸執行。當然本文討論的內容就並不限於一個簡單的語義,可以是事實的推理、感情的分析等等更加復雜抽象的問題處理策略。

    這個先生成策略流程、自我優化、再執行的過程其實也解決了第3.1節中的第二個問題,它生成的這個處理流程可以直接固化,在後續類似場景的調用中就可以變成一個工具來由LLM使用,或者由人直接調用。

    4.2 問題的自動解決過程的發展可能比我們想象的快

    在ReAct和AutoGPT之前,大概很少有人會想到現在我們就已經有了一個可以實際把玩的demo。我自己也驚訝於我們現在就能看到這樣的東西,而且它的實現成本還比較低。

    雖然光靠AutoGPT自己還很難可靠的完成任務,降低成本,但如果配合一些類似前文提到的框架之類的,再配合人的一些監督和指導,快速堆砌出一個解決策略、或者是根據已有策略的應用日志來優化它大概比我們想象的要近。

    之前是接開發需求做工程開發的人感到了自己被替代的風險,現在是策略算法崗或者策略產品崗人看到了自己的工作可以被部分替代的風險。

    這是目前我看到的最強的支持AGI可能沒有我們想象的那麼遠的證據。不過我目前仍然不覺得可靠的AGI能夠在未來10年出現,但確實不可靠的AGI似乎已經開始了。

    附錄、系列文章索引

    『2022Q2』重新思考如何從語言模型中挖掘知識——GPT-3能理解我們的提示麼?談思維鏈CoT prompt的發現《1》

    『2022.12』漫談ChatGPT系列《2》:ChatGPT介紹與展望

    『2023.2』漫談ChatGPT系列《3》

    『2023.2』漫談ChatGPT系列《4》:從New Bing看下一代的搜索產品

    『2023H1』漫談ChatGPT系列《5》:如何理解 大型語言模型的邏輯推理能力,兼談 知識圖譜

    『2023H1』漫談ChatGPT系列《6》:談LLM的文本生成策略

    『2023H1』漫談ChatGPT系列《7》:談LLM能處理的最大 有效上下文長度

    『2023Q1』漫談ChatGPT系列《8》:談LLM的語義級回避 與 二階自監督學習

    『2023H1』漫談ChatGPT系列《9》:談 語義處理框架 的設計

    本文成文於 2023.4.17