解碼通用 AI Agent:七步構(gòu)建你的智能系統(tǒng)
LLM Agent 高層次概述(圖片由原文作者提供)
為什么要構(gòu)建通用 Agent?因為這是一個很好的工具,可以為我們的目標(biāo)使用場景提供原型,并為設(shè)計我們自己的定制 Agent 架構(gòu)奠定基礎(chǔ)。
在我們繼續(xù)深入之前,先快速介紹一下 LLM Agent。如果您已經(jīng)了解,可以跳過這部分。
1.什么是 LLM Agent?
LLM Agent 是一種程序,其執(zhí)行邏輯由底層模型控制。
從獨立的 LLM 到具備 Agent 功能的系統(tǒng)。(圖片由原文作者提供)
LLM Agent 與簡單的少量樣本提示(few-shot prompting)或預(yù)設(shè)工作流程的不同之處在于,它能夠制定并調(diào)整執(zhí)行用戶查詢所需的步驟。當(dāng)擁有諸如代碼執(zhí)行或網(wǎng)絡(luò)搜索等工具集的訪問權(quán)限時,Agent 能夠自主決定使用何種工具、如何使用,并依據(jù)輸出結(jié)果進行迭代優(yōu)化。這種靈活性使得系統(tǒng)能夠以極低的配置需求應(yīng)對多樣化的場景。
LLM Agent 架構(gòu)譜系。(圖片由原文作者提供)
Agent 架構(gòu)存在于一個連續(xù)的變化范圍內(nèi),從固定工作流程的可靠性到 autonomous agents 的高度靈活性。例如,像檢索增強生成(RAG)[1]這樣的預(yù)設(shè)流程,可以通過加入自我反思循環(huán)(self-reflection loop)來提升改進,使得程序在初次響應(yīng)不充分時能夠進行改進。另一方面,ReAct[2] Agent 可以配備預(yù)設(shè)流程作為其工具之一,實現(xiàn)一種既靈活又有條理的處理方式。架構(gòu)的選擇最終應(yīng)根據(jù)具體應(yīng)用場景以及可靠性與靈活性之間的平衡需求來決定。
想要更全面的了解,請觀看此視頻[3]。
2.讓我們從頭開始打造一款通用 LLM Agent
第一步:挑選合適的 LLM
挑選合適的模型是實現(xiàn)預(yù)期性能的關(guān)鍵。在決策時,需考慮多個因素,如版權(quán)許可、成本和語言支持。對于構(gòu)建 LLM Agent 來說,最關(guān)鍵的考慮因素是模型在核心任務(wù)上的表現(xiàn),例如編程、調(diào)用工具和邏輯推理。以下是一些評估標(biāo)準(zhǔn):
大規(guī)模多任務(wù)語言理解(MMLU)[4](用于推理能力評估)
伯克利大學(xué)的函數(shù)調(diào)用排行榜[5](用于工具的選擇與調(diào)用能力評估)
HumanEval[6] 和BigCodeBench[7] (用于編程能力評估)
此外,模型的處理窗口大小也非常重要。Agent 的工作流程可能會消耗大量 token —— 有時甚至超過 10 萬個 —— 因此,更大的處理窗口將大大提高處理效率。
當(dāng)前值得關(guān)注的模型(本文撰寫時)包括:
前沿模型:GPT4-o[8],Claude 3.5[9]
開源模型:Llama 3.2[10],Qwen 2.5[11]
一般來說,模型越大,性能越優(yōu)越。但能夠在本地運行的小型模型也是一個不錯的選擇。小型模型通常適用于較為簡單的場景,并且可能只能與一到兩個基礎(chǔ)工具對接。
第二步:設(shè)定智能體的控制邏輯(亦稱為通信結(jié)構(gòu))
圖片
單智能體(single Agent)架構(gòu)圖示。(圖片由原文作者創(chuàng)作)
簡單大語言模型(LLM)與智能體(Agent)之間的核心差異,主要體現(xiàn)在系統(tǒng)提示詞上。
就 LLM 而言,系統(tǒng)提示詞[12]是指在模型開始處理用戶查詢前,提供給模型的一系列指令和背景信息。
我們可以通過系統(tǒng)提示詞來編碼大語言模型應(yīng)展現(xiàn)的智能體行為。
以下是一些常見的智能體行為模式,它們可以根據(jù)您的具體需求進行調(diào)整:
- 工具運用:智能體判斷何時應(yīng)將問題轉(zhuǎn)交給適當(dāng)?shù)墓ぞ咛幚?,或是依賴自身知識庫。
- 自我反思:智能體在回復(fù)用戶前,會審視并修正自己的答案。大多數(shù) LLM 系統(tǒng)也可以加入這一反思過程。
- Reason-then-Act(ReAct):智能體通過反復(fù)推理來確定解決問題的方法,執(zhí)行操作,觀察結(jié)果,并決定是否需要進一步行動或直接給出回答。
- Plan-then-Execute:智能體通過將任務(wù)細(xì)分為多個子步驟(如有必要)來進行事前規(guī)劃,然后逐一執(zhí)行這些步驟。
在構(gòu)建通用單智能體時,ReAct 和 Plan-then-Execute 這兩種模式通常是起步的最佳選擇。
常見智能體行為模式概覽。(圖片由原文作者創(chuàng)作)
為了有效地實現(xiàn)這些行為模式,我們需要對提示詞進行精心設(shè)計??赡苓€需要采用結(jié)構(gòu)化生成技術(shù)[13],這意味著會調(diào)整 LLM 的輸出,使其符合特定的格式或架構(gòu),從而確保智能體的回復(fù)與我們所追求的溝通風(fēng)格保持一致。
舉例:下面是 Bee Agent Framework[14] 中一個 ReAct 風(fēng)格智能體的系統(tǒng)提示詞片段。
圖片
第三步:設(shè)定智能體的核心指令
我們往往會想當(dāng)然地認(rèn)為,大語言模型(LLMs)一開箱就能提供一系列功能。雖然其中某些功能非常出色,但并非所有功能都能滿足我們的具體需求。要想實現(xiàn)期望的性能表現(xiàn),就需要在系統(tǒng)提示詞中詳細(xì)列出應(yīng)該包含以及不應(yīng)該包含的功能。
這可能涉及以下指令:
- 智能體的名稱與職責(zé):智能體的命名及其預(yù)期執(zhí)行的任務(wù)。
- 語言風(fēng)格與簡潔性:智能體在交流時應(yīng)該保持的正式或隨意程度,以及信息傳達(dá)的簡潔性。
- 工具使用時機:確定何時應(yīng)該利用外部工具,何時依賴模型自身的知識庫。
- 錯誤處理:當(dāng)工具使用或流程執(zhí)行出現(xiàn)問題時,智能體應(yīng)采取的行動。
示例:以下摘錄自 Bee Agent Framework[14] 的操作指南部分。
圖片
第四步:定義并優(yōu)化核心工具集
工具就是賦予智能體超能力的魔法。只需一套定義明確的工具,就能實現(xiàn)廣泛的應(yīng)用功能。重要的工具包括代碼執(zhí)行、網(wǎng)絡(luò)檢索、文檔讀取和數(shù)據(jù)解析等。
對于每一項工具,都需要定義以下信息,并將其融入系統(tǒng)提示詞之中:
- Tool Name:為這項功能起一個獨特且具描述性的名稱。
- Tool Description:清晰地闡述該工具的作用及其使用時機。這有助于智能體判斷何時選用合適的工具。
- Tool Input Schema:這是一個框架,它規(guī)定了必需和可選的參數(shù)、參數(shù)類型以及所有約束條件。智能體根據(jù)用戶的提問,利用這個框架來填充所需的輸入。
- 提供一個指示或者指南,告訴用戶或者開發(fā)者這個工具應(yīng)該在哪里以及如何被運行。
例如:以下是從 Langchain 社區(qū)摘錄的 Arxiv 工具實現(xiàn)片段[15],需要 ArxivAPIWrapper[16] 的支持。
圖片
在某些場景下,為了達(dá)到預(yù)期的性能,我們需要對工具進行優(yōu)化。這可能需要通過微調(diào)工具名稱或描述來進行提示詞工程,設(shè)置高級配置來處理常見問題,或是過濾、篩選工具的輸出結(jié)果。
第五步:確立內(nèi)存管理策略
大語言模型(LLMs)受限于它們的上下文窗口大小 —— 也就是它們一次性能夠“記下”的 tokens 數(shù)量。在多輪對話中,過往互動、工具輸出的長文本或者是 Agent 所依賴的額外上下文信息,都可能迅速占滿內(nèi)存空間。因此,制定一個有效的內(nèi)存管理策略是非常重要的。
在這里,所謂的“內(nèi)存”是指智能體(Agent)存儲、調(diào)用并利用歷史交互信息的能力。這種能力使得智能體能夠持續(xù)跟蹤對話上下文,基于之前的對話來優(yōu)化回答,從而提供更加定制化的用戶體驗。
常見的內(nèi)存管理策略包括:
- Sliding Memory:只保留最近 k 輪對話的記憶,較早的對話則被舍棄。
- Token Memory:只記下最近 n 個 tokens,其余的則被遺忘。
- Summarized Memory:每輪對話后,使用 LLM 對對話內(nèi)容進行總結(jié)摘要,并丟棄原始信息。
另外,我們還可以利用 LLM 來識別關(guān)鍵信息(key moments),并將其存儲在長期記憶中。這樣,智能體就能“記住”用戶的重要信息,使用戶體驗更加個性化。
我們目前所討論的五個步驟為創(chuàng)建智能體奠定了基礎(chǔ)。那么,如果在這個階段我們通過 LLM 處理用戶查詢,會發(fā)生什么呢?
圖片
示例如下:
圖片
此時,智能體會生成一段原始的文本輸出。那么,我們?nèi)绾未_保智能體能夠執(zhí)行后續(xù)操作呢?這就需要引入解析和編排機制了。
第六步:解析智能體(Agent)的原始輸出
解析器的作用是將原始數(shù)據(jù)轉(zhuǎn)換成應(yīng)用程序能夠識別和使用的數(shù)據(jù)格式(例如,帶有特定屬性的對象)。
對于我們正在構(gòu)建的智能體,解析器必須能夠辨認(rèn)出我們在第二步中設(shè)定的通信結(jié)構(gòu),并將其轉(zhuǎn)換成結(jié)構(gòu)化數(shù)據(jù)輸出,例如 JSON 格式。這樣做可以讓應(yīng)用程序更加便捷地處理和執(zhí)行智能體的后續(xù)動作。
備注:某些模型供應(yīng)商,例如 OpenAI,可以默認(rèn)提供可直接解析的輸出。而對于其他模型,尤其是那些開源模型,可能需要額外進行解析配置。
第七步:規(guī)劃智能體的后續(xù)行動
最后一步是建立編排邏輯。這一邏輯決定了 LLM 輸出內(nèi)容結(jié)果之后的處理流程。依據(jù)輸出內(nèi)容,系統(tǒng)將執(zhí)行以下任一操作:
- 執(zhí)行工具調(diào)用,或者
- 給出回應(yīng) —— 這可能是對用戶查詢的直接回答,也可能是為了獲取更多信息而提出的后續(xù)問題。
擴展的單智能體架構(gòu)圖示。(圖片由原文作者提供)
如果觸發(fā)了工具調(diào)用,工具的輸出信息會被送回 LLM(作為其工作記憶的一部分)。LLM 將據(jù)此決定如何利用這些新數(shù)據(jù):是繼續(xù)進行工具調(diào)用,還是直接向用戶返回答案。
以下是在代碼中實現(xiàn)這種編排邏輯的一個示例:
圖片
大功告成!現(xiàn)在,你已經(jīng)有了一個能夠應(yīng)對多種場景的智能體系統(tǒng) —— 無論是進行競爭分析、深入研究,還是實現(xiàn)復(fù)雜工作流程的自動化。
3.多智能體(multi-agent)系統(tǒng)在什么情況下派上用場?
盡管當(dāng)前 LLM 的表現(xiàn)令人印象深刻,但它們在處理海量信息時卻顯得力不從心[17]。一旦上下文過多或工具使用過雜,模型便可能不堪重負(fù),導(dǎo)致性能下滑。面向多種用途的單智能體系統(tǒng)最終會觸及這一上限,尤其是在它們對 token 的消耗量之大已是眾所周知。
對于某些使用場景,部署多智能體系統(tǒng)或許更為合適。通過將任務(wù)分?jǐn)偨o多個智能體,可以有效避免單一 LLM Agent 的上下文負(fù)載過重,從而提高整體的執(zhí)行效率。
盡管如此,通用的單智能體系統(tǒng)仍然是原型開發(fā)的一個極好起點。它能幫助我們迅速驗證使用場景,并發(fā)現(xiàn)系統(tǒng)何時開始出現(xiàn)故障。在這個過程中,你將能夠:
- 洞察哪些任務(wù)環(huán)節(jié)確實能通過 Agent 模式得到優(yōu)化。
- 確定可以作為獨立流程分離出來,成為更大工作流程中一環(huán)的部分。
- 從單智能體起步,這樣能夠獲得他人寶貴的經(jīng)驗、見解,以便在構(gòu)建更復(fù)雜系統(tǒng)時調(diào)整和優(yōu)化策略。
4.如何開始上手?
已經(jīng)迫不及待想要開始構(gòu)建智能體了嗎?使用框架是快速測試和迭代智能體配置的好方法。
- 如果你打算使用 Llama 3 這樣的開源模型,不妨試試 Bee Agent Framework[18] 提供的初始模板[19]。
- 如果你打算使用 OpenAI 這樣的前沿模型,試試 LangGraph[20] 提供的教程[21]可能會給你帶來幫助。
Thanks for reading!
Hope you have enjoyed and learned new things from this blog!
About the authors
Maya Murad
Interdisciplinary techie currently tinkering with LLM agents. I write about AI, innovation ecosystems, and my creative coding experiments.
原文鏈接:https://towardsdatascience.com/build-a-general-purpose-ai-agent-c40be49e7400