天天看點

網紅項目AutoGPT源碼内幕及綜合案例實戰

AutoGPT Internals及源碼

本節會從幾個方面跟大家談,第一個方面,首先跟大家看一下AutoGPT本身的一些核心内容,另一方面,看一下AutoGPT代碼内部運作的過程,通過報錯資訊,展示内部的堆棧調用。大家如果寫代碼有經驗,或者研究代碼有經驗的話,都會知道這幾乎是一個最大的捷徑,如果有一個很好的、新開源的項目,你想比較深入系統的研究它,一個比較簡單的方式,在它最簡單的案例示例或者代碼中,讓它抛出一個異常,因為一旦抛出異常,一般現在的內建開發環境,都會有堆棧調動,沿着這個堆棧調動,去看它内部的工作機制。

本節跟大家講解LangChain到底是怎麼實作的,不僅看LangChain的代碼本身,而且會對應案例的代碼學習。在正式進入本節的内容之前,很有必要做一個基本的回顧,LangChain的代理(Agent)進行管理,語言模型、工具和資料三者互相作用,語言模型顯然是驅動,代理是管理者,代理去管理模型、去管理工具、去管理資料,它管理過程的核心是,模型告訴代理調動哪個工具,或者調用什麼資料,LangChain本身可以讓模型跟你的私有資料或者第三方的資料互相作用,同時還作為一個代理的角色,這就是LangChain的核心。

從代碼的角度,LangChain提供了很多非常好的工具,以及一些頂級論文的具體實作,它作為一個目前開源界和工業界認可度最高的大模型開發架構,确實極大的節省了很多時間,因為LangChain本身既是一個架構,又是一個工具,它幫我們做了很多實作,我們直接基于LangChain的架構,去使用這些工具就行了,你可以認為LangChain所有的東西都是一個工具,如果從宏觀的角度,來看Agent的運作機制,其實是非常簡潔的。Gavin大咖微信:NLP_Matrix_Space

如圖13-1所示,我們有模型、有工具,可以認為它是一個推理的過程,圖中間部分顯示的任務(Task)以T開頭,這些都是它一步一步執行的具體任務。在執行任務的過程中,它要參考上下文(context),參考示例(examples),參考一些限制條件,包括AutoGPT中實作的自我反思機制上的不斷優化。LangChain在實作的時候,它本身會有很多語言模型,提供了很多工具,也提供了很多圍繞語言模型和工具的代理的内容。

網紅項目AutoGPT源碼内幕及綜合案例實戰

圖13- 1 LangChain的運作機制

如圖13-2所示,LangChain提供了很多語言模型的實作。不同的語言模型,你都可以去嘗試,大家也可以按照它提供的接口,去實作自己的語言模型。

網紅項目AutoGPT源碼内幕及綜合案例實戰

圖13- 2 LangChain的語言模型代碼

在base.py代碼中,定義了一個BaseLLM類,它是一個基本的大語言模型的抽象接口,繼承自BaseLanguageModel類和ABC類,該類有五個屬性:緩存、是否列印響應文本、回調、回調管理器、标簽和中繼資料,其中緩存屬性為可選,而其他四個屬性都有預設值,該類的_generate等方法是抽象方法,子類繼承該類,需要具體實作其抽象方法。

base.py的BaseLLM代碼實作:Gavin大咖微信:NLP_Matrix_Space

  1. class BaseLLM(BaseLanguageModel, ABC):
  2. """ 基本LLM抽象接口。
  3. 它接收一個提示并傳回一個字元串."""
  4. cache: Optional[bool] = None
  5. verbose: bool = Field(default_factory=_get_verbosity)
  6. """是否列印出響應文本"""
  7. callbacks: Callbacks = Field(default=None, exclude=True)
  8. callback_manager: Optional[BaseCallbackManager] = Field(default=None, exclude=True)
  9. tags: Optional[List[str]] = Field(default=None, exclude=True)
  10. """要添加到運作跟蹤的标記."""
  11. metadata: Optional[Dict[str, Any]] = Field(default=None, exclude=True)
  12. """要添加到運作跟蹤的中繼資料."""

LangChain架構會有很多工具操縱各種資料,例如:shell、json或者jira等等,如果你是一個開發者,對于jira這些工具,應該是很熟悉的。如圖13-3所示。

網紅項目AutoGPT源碼内幕及綜合案例實戰

圖13- 3 LangChain的工具

從整個流程看,整體是一個代理,但LangChain裡面有很多不同代理的實作,包括AutoGPT,它也是基于代理的思路去實作的,代理和使用者進行互動,獲得一個具體的目标,語言模型會根據你的目标(goals)或者觀察結果(objectives)去産生具體的文本。使用者需清楚的說明自己的目标是什麼,隻不過我們這裡面很簡單,使用者的目标是讓它推薦自然語言處理方面最重要的5本圖書:Gavin大咖微信:NLP_Matrix_Space

  1. agent.run(["Recommend 5 best books to read in Python"])

以下日志顯示:運作一個新的LLMChain鍊,并提供一個格式化後的提示資訊,提示資訊包含了角色、決策原則、政策建議和任務目标。角色為是“Tom Assistant”,決策原則為“獨立決策,不尋求使用者協助”,建議采用不涉及法律問題的簡單政策。提示資訊還提供了一個任務目标,即“推薦5本Python最好的書”。

> Entering new LLMChain chain...

Prompt after formatting:

System: You are Tom, Assistant

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.

If you have completed all your tasks, make sure to use the "finish" command.

GOALS:

1. Recommend 5 best books to read in Python

從提示詞輸入的角度,AutoGPT内部會自動進行很多的優化,我們看見它,會根據這個目标,然後會有一些限制條件,注意限制條件是一個非常重要的東西,它給你一些可用的條件,你不能超越,顯然這是一種使用提示詞進行更細粒度操控模型的方式。

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"

以下是“commands”的運作日志,顯示了代理提供的四個指令及其參數,這四個指令分别為:“搜尋”、“寫檔案”、“讀檔案”、“完成”。Gavin大咖微信:NLP_Matrix_Space

Commands:

1. search: useful for when you need to answer questions about current events. You should ask targeted questions, args json schema: {"tool_input": {"type": "string"}}

2. write_file: Write file to disk, args json schema: {"file_path": {"title": "File Path", "description": "name of file", "type": "string"}, "text": {"title": "Text", "description": "text to write to file", "type": "string"}, "append": {"title": "Append", "description": "Whether to append to an existing file.", "default": false, "type": "boolean"}}

3. read_file: Read file from disk, args json schema: {"file_path": {"title": "File Path", "description": "name of file", "type": "string"}}

4. finish: use this to signal that you have finished all your objectives, args: "response": "final response to let people know you have finished your objectives"

如圖13-4所示,“commands”指令相當于這幅圖中的工具(Tools)。

網紅項目AutoGPT源碼内幕及綜合案例實戰

圖13- 4 LangChain運作架構的Tool工具

AutoGPT隻不過是一個更優化的架構,可以進行一些改進,在軟體架構中,如果想優化,可以把它解耦合。例如,會設定一個工具管理器去管理工具,把工具和其他的東西解耦合,也可以設定一個任務管理器去管理任務,把任務解耦合。舉一個很簡單的例子,如果你有一個任務管理器,可以管理一個或者多個任務,因為你的目标非常複雜,這個時候會有很多的好處,例如,每産生一個新的任務,相當于一個堆棧,它會越積越多,如圖13-5所示,大家應該看得很清楚,這些任務産生了一個又一個的中間結果,轉過來都會成為大語言模型新的上下文,它們都是提示詞的一部分,這樣提示詞會越來越大。如果你有任務管理器的話,可以在任務管理器的基礎上,進一步去優化它的提示詞,這也是AutoGPT,或者一些看上去比AutoGPT更強的工具或者架構,它們的核心發展方向,你可以不需要知道它是什麼,但底層優化的一個定律,就是解耦合。

網紅項目AutoGPT源碼内幕及綜合案例實戰

圖13- 5 任務生成新的上下文