2025年,擁抱AI Agent!
嘿,大家好!這里是一個(gè)專注于AI智能體的頻道~
在a16z預(yù)測2025年的發(fā)展中,Agent占據(jù)了很重要的一個(gè)環(huán)節(jié)。昨天中金也發(fā)研報(bào),表示看好Agent的發(fā)展趨勢。包括langchain發(fā)布的24年總結(jié)報(bào)告,Agent是持續(xù)保持增長的。
所以25年,Agent或許值得期待?今天給家人們完全梳理一下Agent 智能體的系統(tǒng),作為Agent入門指南(超長超長)!
這篇文章會(huì)幫你理清頭緒,明確地告訴你智能體到底是什么,以及它們是怎么工作的。我們會(huì)拆解智能體的關(guān)鍵組成部分,包括“工具”這個(gè)重要角色。
同時(shí),也會(huì)分享一些實(shí)用的經(jīng)驗(yàn),教你如何構(gòu)建和部署智能體,從簡單的單次交互,到復(fù)雜的多智能體系統(tǒng)。
我們還會(huì)探討如何在企業(yè)環(huán)境中應(yīng)用多智能體架構(gòu),并將其與微服務(wù)進(jìn)行對(duì)比。在后續(xù)的文章中,我們會(huì)更深入地研究智能體和運(yùn)營(AgentOps),以及如何搭建一個(gè)企業(yè)級(jí)多智能體系統(tǒng)的平臺(tái)。
什么是Agent智能體?
簡單來說,“智能體就是一個(gè)prompt,它指示基礎(chǔ)模型去和特定的工具互動(dòng)。”
生成式 AI 智能體通過一個(gè)設(shè)計(jì)好的prompt,協(xié)調(diào)基礎(chǔ)模型(大模型)與外部工具之間的互動(dòng)。這個(gè)prompt告訴 LLM 何時(shí)以及如何使用這些工具。
每一個(gè)“工具”本質(zhì)上都包含了一組函數(shù)規(guī)范(或者我們叫它“聲明”)。這些聲明包括:
- 函數(shù)名稱:工具的唯一標(biāo)識(shí)符。
- 描述:詳細(xì)解釋工具的用途、能解決什么問題,以及在什么情況下可以使用它。
- 參數(shù):列出工具需要的輸入?yún)?shù),并解釋每個(gè)參數(shù)的含義、類型和期望值。
- 輸出(可選):描述工具返回結(jié)果的格式和內(nèi)容。
為了讓這些聲明標(biāo)準(zhǔn)化,市面上通常使用基于 JSON 的 OpenAPI 格式。這種標(biāo)準(zhǔn)化格式可以清晰、機(jī)器可讀地描述 API,方便與生成式 AI 模型無縫集成。舉個(gè)例子,下面是用 OpenAPI 格式聲明一個(gè)可以獲取股票價(jià)格的工具:
{
"tools": [
{
"functionDeclarations": [
{
"name": "get_stock_price",
"description": "獲取指定公司的當(dāng)前股票價(jià)格。",
"parameters": {
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "股票代碼(如,AAPL, MSFT)。"
}
},
"required": ["ticker"]
},
"returns": {
"type": "number",
"description": "當(dāng)前股票價(jià)格。"
}
}
]
}
]
}
我們也可以用 Python SDK 以編程方式創(chuàng)建相同的函數(shù)聲明,比如 Vertex AI 提供的 SDK。這樣做可以更靈活地創(chuàng)建和管理工具規(guī)范:
from vertexai.generative_models import (
FunctionDeclaration,
GenerationConfig,
GenerativeModel,
Part,
Tool,
)
# 創(chuàng)建函數(shù)聲明
get_stock_price = FunctionDeclaration(
name="get_stock_price",
descriptinotallow="獲取指定公司的當(dāng)前股票價(jià)格",
parameters={
"type": "object",
"properties": {
"ticker": {
"type": "string",
"description": "公司的股票代碼",
}
},
"required": ["ticker"]
},
returns={ # 添加 returns 字段!
"type": "number",
"description": "當(dāng)前股票價(jià)格。"
}
)
# ... 可以添加更多的函數(shù)聲明
# 定義一個(gè)工具,包含可以被 FM 使用的函數(shù)列表
company_insights_tool = Tool(
function_declaratinotallow=[
get_stock_price,
# ... 其他函數(shù)聲明
],
)
為了更直觀地展示這些概念,我們將在下面的例子中使用 Vertex AI SDK 和 Gemini 的函數(shù)調(diào)用功能。這些例子基于這個(gè)代碼倉庫,推薦去看看(https://github.com/GoogleCloudPlatform/generative-ai/blob/main/gemini/function-calling/use_case_company_news_and_insights.ipynb)。這種方法能讓你從更底層的角度理解智能體的工作原理。一旦你掌握了這些基礎(chǔ)知識(shí),就可以更輕松地使用 LangChain 等更高級(jí)的智能體框架了。
到目前為止,我們主要關(guān)注如何用 JSON 定義工具結(jié)構(gòu),以及如何用 Vertex AI SDK 以編程方式創(chuàng)建這些定義。這些工具定義最終會(huì)被轉(zhuǎn)換成文本,并附加到指令提示中。這讓模型可以判斷,為了滿足用戶的請求,是否需要使用工具,如果要用,該用哪個(gè),以及應(yīng)該使用哪些參數(shù)。
下面這個(gè)例子演示了工具、模型和指令是如何一起工作的:
# 選擇 LLM,配置參數(shù),并提供可用的工具
gemini_model = GenerativeModel(
"gemini-2.0-flash-exp",
generation_cnotallow=GenerationConfig(temperature=0),
tools=[company_insights_tool],
)
# 為 LLM 準(zhǔn)備指令
instruction = """
給出一個(gè)簡潔、高層次的總結(jié)。只使用你從 API 響應(yīng)中獲取的信息。
"""
agent = gemini_model.start_chat()
接下來,就可以開始向模型發(fā)送新的輸入了:
# 為 LLM 準(zhǔn)備你的查詢/問題
query = "Google當(dāng)前股票價(jià)格是多少?"
# 將指令和查詢一起發(fā)送給 LLM
prompt = instruction + query
response = agent.send_message(prompt)
你覺得模型會(huì)怎么回應(yīng)?它會(huì)調(diào)用真實(shí)的函數(shù)嗎?
如果 ??company_insights_tool?
?? 定義正確(包括帶有 ??ticker?
?? 參數(shù)和 ??returns?
?? 字段的 ??get_stock_price?
?? 函數(shù),就像前面的例子那樣),Gemini 應(yīng)該能識(shí)別出它有一個(gè)可以回答這個(gè)問題的工具。它很可能會(huì)生成一個(gè)結(jié)構(gòu)化的請求,調(diào)用 ??get_stock_price?
?? 函數(shù),并將 ??ticker?
? 參數(shù)設(shè)為 "GOOG" (或者 "GOOGL",取決于你如何處理谷歌的兩類股票)。
這里要注意的是,Gemini 本身不會(huì)直接執(zhí)行外部代碼或者實(shí)時(shí)調(diào)用股票價(jià)格 API。相反,它會(huì)生成一個(gè)結(jié)構(gòu)化的請求,讓你(開發(fā)者)來執(zhí)行。運(yùn)行下面的代碼:
# LLM 檢查可用的工具聲明
# LLM 返回最適用的函數(shù)和參數(shù)
function_call = response.candidates[0].content.parts[0].function_call
響應(yīng)大概會(huì)像這樣(簡化版):
name: "get_stock_price"
args {
fields
{ key: "ticker"
value {string_value: "Google"}
}
}
那么,你該如何真正獲取股票價(jià)格呢?這就輪到你的代碼出場了:
也就是說,用戶(更常見的情況是你的代碼)需要負(fù)責(zé)根據(jù)模型的響應(yīng)觸發(fā)正確的代碼。為了做到這一點(diǎn),我們需要為每一個(gè)工具聲明都實(shí)現(xiàn)一個(gè)單獨(dú)的 Python 函數(shù)。下面是 ??get_stock_price?
? 函數(shù)的例子:
# 為每個(gè)聲明實(shí)現(xiàn)一個(gè) Python 函數(shù)
def get_stock_price_from_api(content):
url = f"https://www.alphavantage.co/query?functinotallow=GLOBAL_QUOTE"
f"&symbol={content['ticker']}&apikey={API_KEY}"
api_request = requests.get(url)
return api_request.text
# ... 其他函數(shù)實(shí)現(xiàn)
為了簡化函數(shù)調(diào)用的觸發(fā)過程,我們建議創(chuàng)建一個(gè)函數(shù)處理器(也就是一個(gè) Python 字典),把函數(shù)聲明中的函數(shù)名稱和實(shí)際的代碼函數(shù)對(duì)應(yīng)起來:
# 將函數(shù)聲明和對(duì)應(yīng)的 Python 函數(shù)連接起來
function_handler = {
"get_stock_price": get_stock_price_from_api,
# ...,
}
現(xiàn)在,有了 Python 函數(shù),并且能夠從模型的響應(yīng)中拿到函數(shù)名稱和參數(shù),下一步就是執(zhí)行相應(yīng)的函數(shù):
# LLM 檢查可用的工具聲明
# LLM 返回最適用的函數(shù)和參數(shù)
function_call = response.candidates[0].content.parts[0].function_call
function_name = function_call.name
params = {key: value for key, value in function_call.args.items()}
# 調(diào)用對(duì)應(yīng)的 Python 函數(shù) (或者 API)
function_api_response = function_handler[function_name](params)[:20000]
API 調(diào)用的輸出大概是這樣:
{
"Global Quote": {
"01. symbol": "GOOG",
"02. open": "179.7500",
"03. high": "180.4450",
"04. low": "176.0300",
"05. price": "177.3500",
"06. volume": "17925763",
"07. latest trading day": "2024-11-14",
"08. previous close": "180.4900",
"09. change": "-3.1400",
"10. change percent": "-1.7397%"
}
}
接下來,就可以把結(jié)果發(fā)送回模型進(jìn)行最終處理和響應(yīng)生成了:
# 將函數(shù)的返回值發(fā)送給 LLM,生成最終答案
final_response = agent.send_message(
Part.from_function_response(
name=function_name,
respnotallow={"content": function_api_response},
),
)
把函數(shù)的響應(yīng)傳遞給 LLM 后,我們就能得到最終的答案:
谷歌 (GOOG) 的股價(jià)目前為 177.35 美元,相比昨天的 180.49 美元收盤價(jià)下跌了 1.74%。
這才是最終用戶期望得到的答案。
簡單總結(jié)一下,這個(gè)過程包含五個(gè)步驟:
- 用戶提問:用戶向模型提問(“谷歌的當(dāng)前股票價(jià)格是多少?”)。
- 模型請求函數(shù)調(diào)用:模型生成一個(gè)請求,指出應(yīng)該調(diào)用哪個(gè)函數(shù)(“get_stock_price”),以及應(yīng)該使用哪個(gè)參數(shù)值(“谷歌”)。
- 開發(fā)者執(zhí)行函數(shù):你的代碼從響應(yīng)中提取函數(shù)調(diào)用信息,并用對(duì)應(yīng)的參數(shù)值運(yùn)行相應(yīng)的 Python 函數(shù)(“get_stock_price_from_api”)。這個(gè)函數(shù)會(huì)從外部 API 獲取真實(shí)的股票價(jià)格數(shù)據(jù)。
- 將函數(shù)結(jié)果發(fā)回模型:從外部 API 得到的結(jié)果(股票價(jià)格數(shù)據(jù))被發(fā)送回 LLM。
- 模型生成最終響應(yīng):模型使用得到的數(shù)據(jù),生成最終的、人類可以理解的響應(yīng)。
我們剛才描述的流程是智能體的基礎(chǔ)。具體來說,我們展示的流程是單輪智能體的核心邏輯:一個(gè)輸入觸發(fā)一個(gè)函數(shù)調(diào)用,并產(chǎn)生一個(gè)響應(yīng)。這種模塊化設(shè)計(jì)非常適合云部署和擴(kuò)展。你可以把這個(gè)邏輯容器化,然后部署在 Google Cloud Run 等服務(wù)上。這樣,你就可以創(chuàng)建一個(gè)穩(wěn)定、無服務(wù)器的智能體,它可以通過 API 訪問,并且可以在你的 VPC 內(nèi)或者更廣闊的網(wǎng)絡(luò)中使用。
邁向多輪智能體
雖然單輪模型奠定了基礎(chǔ),但大多數(shù)現(xiàn)實(shí)世界的生成式 AI 應(yīng)用需要更復(fù)雜的交互。用戶往往不能通過一次問答就得到所有需要的信息。所以接下來,我們來探索多輪智能體。這種智能體可以記住上下文,處理后續(xù)問題,并且協(xié)調(diào)多個(gè)函數(shù)調(diào)用來實(shí)現(xiàn)更復(fù)雜的目標(biāo)。
為了說明這個(gè)概念,我們用一個(gè)受這個(gè)代碼倉庫啟發(fā)的例子(https://github.com/google-gemini/cookbook/blob/main/quickstarts/Function_calling.ipynb)。我們的目標(biāo)是創(chuàng)建一個(gè)可以回答特定區(qū)域電影和影院相關(guān)問題的生成式 AI 智能體。和單輪智能體一樣,我們首先需要定義智能體可以使用的函數(shù)。為了簡單起見,我們直接在代碼中提供函數(shù)簽名和描述:
def find_movies(description: str, location: str = ""):
"""根據(jù)任何描述(類型、標(biāo)題詞等)查找當(dāng)前正在影院上映的電影。參數(shù):description:任何類型的描述,包括類別或類型、標(biāo)題詞、屬性等。location:城市和州,例如舊金山,CA,或者郵政編碼,例如 95616"""
...
return ["Barbie", "Oppenheimer"]
def find_theaters(location: str, movie: str = ""):
"""查找特定地點(diǎn),以及可選的正在上映的電影的影院。參數(shù):location:城市和州,例如舊金山,CA,或者郵政編碼,例如 95616。movie:任何電影標(biāo)題"""
...
return ["Googleplex 16", "Android Theatre"]
def get_showtimes(location: str, movie: str, theater: str, date: str):
"""查找特定影院上映電影的開始時(shí)間。參數(shù):location:城市和州,例如舊金山,CA,或者郵政編碼,例如 95616。movie:任何電影標(biāo)題。theater:影院名稱。date:請求放映時(shí)間的日期"""
...
return ["10:00", "11:00"]
下一步是在循環(huán)中運(yùn)行函數(shù)識(shí)別、執(zhí)行(使用函數(shù)處理器)和響應(yīng)生成,直到模型擁有足夠的信息來完全響應(yīng)用戶的請求。為了實(shí)現(xiàn)多輪交互,Gemini 支持自動(dòng)函數(shù)調(diào)用,我們可以使用以下代碼自動(dòng)完成:
chat = model.start_chat(enable_automatic_function_calling=True)
response = chat.send_message(
"今晚在山景城上映哪些喜劇電影?什么時(shí)間?")
for content in chat.history:
print(content.role, "->", [type(part).to_dict(part) for part in content.parts])
print("-" * 80)
下面的交互展示了,當(dāng)代碼使用用戶查詢“今晚在山景城上映哪些喜劇電影?什么時(shí)間?”執(zhí)行時(shí),模型的行為:
user -> [{'text': '今晚在山景城上映哪些喜劇電影?什么時(shí)間?'}]
--------------------------------------------------------------------------------
model -> [{'function_call': {'name': 'find_movies', 'args': {'location': '山景城, CA', 'description': '喜劇'}}}]
--------------------------------------------------------------------------------
user -> [{'function_response': {'name': 'find_movies', 'response': {'result': ['Barbie', 'Oppenheimer']}}}]
--------------------------------------------------------------------------------
model -> [{'function_call': {'name': 'find_theaters', 'args': {'movie': 'Barbie', 'location': '山景城, CA'}}}]
--------------------------------------------------------------------------------
user -> [{'function_response': {'name': 'find_theaters', 'response': {'result': ['Googleplex 16', 'Android Theatre']}}}]
--------------------------------------------------------------------------------
model -> [{'function_call': {'name': 'get_showtimes', 'args': {'date': '今晚', 'location': '山景城, CA', 'theater': 'Googleplex 16', 'movie': 'Barbie'}}}]
--------------------------------------------------------------------------------
user -> [{'function_response': {'name': 'get_showtimes', 'response': {'result': ['10:00', '11:00']}}}]
--------------------------------------------------------------------------------
model -> [{'text': '喜劇電影《Barbie》今晚在 Googleplex 16 的放映時(shí)間是 10:00 和 11:00。'}]
--------------------------------------------------------------------------------
這個(gè)交互表明,模型在每一輪中都會(huì)使用完整的對(duì)話歷史,以此來判斷還需要哪些信息,應(yīng)該使用哪個(gè)工具,以及如何組織自己的響應(yīng)。這種記錄過去的交互信息的方式,對(duì)多輪對(duì)話來說至關(guān)重要,我們稱之為短期記憶。此外,除了對(duì)話歷史記錄,存儲(chǔ)一些操作指標(biāo)也很重要,例如每個(gè)模型交互的執(zhí)行時(shí)間、延遲和內(nèi)存等,方便我們進(jìn)一步實(shí)驗(yàn)和優(yōu)化。
下面是圖中描述的多輪智能體執(zhí)行過程的 7 步驟摘要:
- 新查詢:用戶發(fā)起新的交互,提出新的查詢或問題。
- 函數(shù)識(shí)別:基礎(chǔ)模型 (FM) 會(huì)分析查詢,結(jié)合可用的工具和指令,判斷是否需要進(jìn)行函數(shù)調(diào)用。如果需要,它會(huì)識(shí)別出合適的函數(shù)名稱和需要的參數(shù)。
- 準(zhǔn)備函數(shù)調(diào)用:FM 會(huì)生成一個(gè)結(jié)構(gòu)化的函數(shù)調(diào)用請求,指定函數(shù)名稱和要傳遞的參數(shù)。
- 執(zhí)行函數(shù)調(diào)用:這一步由開發(fā)者的代碼執(zhí)行,而不是 FM 本身(但是 Gemini 支持自動(dòng)函數(shù)調(diào)用,方便實(shí)現(xiàn))。代碼會(huì)接收函數(shù)調(diào)用請求,執(zhí)行對(duì)應(yīng)的函數(shù)(例如,調(diào)用 API),并獲取結(jié)果。
- 中間響應(yīng):函數(shù)執(zhí)行的結(jié)果(函數(shù)獲取的數(shù)據(jù))會(huì)被發(fā)送回 FM,作為中間響應(yīng)。
- 更新上下文(對(duì)話歷史):FM 會(huì)使用中間響應(yīng)更新其對(duì)話歷史(在圖中被稱為“短期記憶”)。然后,F(xiàn)M 會(huì)使用更新后的上下文,來決定是否需要進(jìn)一步的函數(shù)調(diào)用,或者是否已經(jīng)收集到足夠的信息來生成最終響應(yīng)。如果需要更多信息,過程會(huì)循環(huán)回到步驟 2。
- 最終響應(yīng):一旦 FM 認(rèn)為它已經(jīng)掌握所有必要的信息(或者達(dá)到了為避免無限循環(huán)而設(shè)定的最大步驟數(shù)),它會(huì)生成最終的響應(yīng),發(fā)送給用戶。這個(gè)響應(yīng)會(huì)整合從所有函數(shù)調(diào)用中獲取的信息。
這個(gè)多輪交互比較真實(shí)地展示了,生成式 AI 智能體是如何處理單個(gè)用戶請求的。然而,在現(xiàn)實(shí)世界中,我們經(jīng)常會(huì)多次重復(fù)使用智能體。想象一下,用戶這周用智能體查找電影放映時(shí)間,下周又回來提出類似的要求。如果智能體能夠記住過去交互的長期記憶,它就可以提供更有針對(duì)性的推薦,比如推薦用戶之前感興趣的電影或者影院。這種長期記憶會(huì)存儲(chǔ)每次交互的短期對(duì)話歷史的摘要或完整記錄。
短期和長期記憶都在實(shí)現(xiàn)有效的多輪智能體交互中起著至關(guān)重要的作用。下面是它們各自的說明和實(shí)現(xiàn)方式:
短期記憶(對(duì)話歷史):存儲(chǔ)在單個(gè)用戶會(huì)話中正在進(jìn)行的對(duì)話。這包括用戶的查詢、模型的函數(shù)調(diào)用以及來自這些函數(shù)調(diào)用的響應(yīng)。這種上下文對(duì)于模型理解后續(xù)問題,以及在整個(gè)交互中保持連貫性至關(guān)重要。實(shí)現(xiàn)選項(xiàng):
- 日志(小文本日志):對(duì)于對(duì)話比較短的簡單應(yīng)用,可以將交互歷史記錄存儲(chǔ)為純文本日志。這種方式實(shí)現(xiàn)簡單,但是對(duì)于長對(duì)話或高流量,效率可能會(huì)降低。
- 云存儲(chǔ)/數(shù)據(jù)庫(大型非文本日志):對(duì)于更復(fù)雜的應(yīng)用(例如,利用多模態(tài)模型處理圖像或者音頻輸入),云存儲(chǔ)服務(wù)或者數(shù)據(jù)庫會(huì)是更好的選擇。這種方式能更結(jié)構(gòu)化地存儲(chǔ),并高效地檢索對(duì)話歷史。
- API 會(huì)話(客戶端存儲(chǔ)):對(duì)話歷史也可以在客戶端(例如,網(wǎng)頁瀏覽器或者手機(jī)應(yīng)用)使用 API 會(huì)話管理。這種方式能減少服務(wù)器端的存儲(chǔ)壓力,但存儲(chǔ)的數(shù)據(jù)量可能會(huì)有限制。
- 以上所有方式的組合:可以混合使用不同的存儲(chǔ)方式,根據(jù)應(yīng)用的特定需求來選擇合適的方案。
長期記憶:存儲(chǔ)用戶在多個(gè)會(huì)話中的歷史交互信息。這使得智能體能夠?qū)W習(xí)用戶的偏好,提供個(gè)性化的推薦,并在長期使用中提供更高效的服務(wù)。實(shí)現(xiàn)選項(xiàng):
- 向量數(shù)據(jù)庫(用于 RAG - 檢索增強(qiáng)生成):向量數(shù)據(jù)庫特別適合在智能體應(yīng)用中進(jìn)行長期記憶存儲(chǔ)。它們將數(shù)據(jù)存儲(chǔ)為向量嵌入,從而捕捉數(shù)據(jù)的語義含義。這使得智能體可以高效地進(jìn)行相似性搜索,從而根據(jù)當(dāng)前用戶查詢,從過去的交互中檢索相關(guān)信息。這通常用于檢索增強(qiáng)生成(RAG)流程中。
- 元數(shù)據(jù)存儲(chǔ)/圖(會(huì)話 ID、其他元數(shù)據(jù)):元數(shù)據(jù)存儲(chǔ)(如圖形數(shù)據(jù)庫或鍵值存儲(chǔ))可以用來存儲(chǔ)關(guān)于用戶會(huì)話的信息,例如會(huì)話 ID、時(shí)間戳和其他相關(guān)元數(shù)據(jù)。這可以用來組織和檢索過去的對(duì)話歷史和交互關(guān)系。
- 云存儲(chǔ)/數(shù)據(jù)庫(實(shí)際日志):過去的對(duì)話完整日志可以存儲(chǔ)在云存儲(chǔ)或數(shù)據(jù)庫中。這種方式提供了所有交互的完整記錄,但可能需要更多的存儲(chǔ)空間和更復(fù)雜的檢索機(jī)制。
- 以上所有方式的組合:和短期記憶類似,可以使用多種存儲(chǔ)機(jī)制的組合來優(yōu)化性能和存儲(chǔ)效率。例如,摘要信息可以存儲(chǔ)在向量數(shù)據(jù)庫中以便快速檢索,而完整日志可以存儲(chǔ)在成本更低的云存儲(chǔ)中,用于審計(jì)或者更詳細(xì)的分析。
智能體調(diào)用智能體:多智能體系統(tǒng)的力量
雖然單個(gè)智能體可以處理復(fù)雜的任務(wù),但有些問題需要協(xié)同努力才能解決。多智能體系統(tǒng)通過讓多個(gè)智能體一起工作來解決這個(gè)問題,每個(gè)智能體負(fù)責(zé)一個(gè)特定的子任務(wù)。這種協(xié)作方法允許將復(fù)雜問題分解為更小的、更易于管理的部分,從而實(shí)現(xiàn)更高效、更強(qiáng)大的解決方案。
多智能體系統(tǒng)的一個(gè)關(guān)鍵概念是把智能體當(dāng)作工具:就像一個(gè)智能體可以使用外部 API 或者函數(shù)一樣,它也可以使用其他的智能體來執(zhí)行特定的子任務(wù)。這種“智能體即工具”的模式允許我們創(chuàng)建分層系統(tǒng),由一個(gè)智能體來協(xié)調(diào)其他智能體的工作。
下面是一些最常見的多智能體模式:
- 路由智能體(逐一):在這種模式中,一個(gè)中央的“路由器”智能體接收初始請求,然后把它逐一委派給其他的智能體。路由器充當(dāng)協(xié)調(diào)者的角色,決定哪個(gè)智能體最適合處理任務(wù)的哪個(gè)部分。當(dāng)一個(gè)智能體完成它的子任務(wù)后,結(jié)果會(huì)返回給路由器,然后路由器會(huì)決定下一步的操作。這種模式適用于那些可以分解成順序步驟的任務(wù),其中一個(gè)步驟的輸出會(huì)影響到下一個(gè)步驟。
- 并行(一對(duì)多):在這種模式中,一個(gè)智能體會(huì)把子任務(wù)同時(shí)分發(fā)給多個(gè)智能體。當(dāng)子任務(wù)彼此獨(dú)立并且可以并行執(zhí)行時(shí),這種模式很有效,可以顯著減少整體處理時(shí)間。一旦所有的智能體都完成了它們的工作,它們的結(jié)果會(huì)被匯總起來,通常由分發(fā)任務(wù)的初始智能體來完成。
- 順序(預(yù)定義順序):這種模式涉及到智能體之間預(yù)定義的信息流。一個(gè)智能體的輸出會(huì)直接作為輸入,傳遞給固定序列中的下一個(gè)智能體。這種模式適用于那些有明確線性工作流程的任務(wù)。
- 循環(huán)流(預(yù)定義順序):和順序模式類似,但信息流形成一個(gè)循環(huán)。序列中最后一個(gè)智能體的輸出會(huì)被傳遞回第一個(gè)智能體,形成一個(gè)循環(huán)。這對(duì)于迭代過程來說很有用,在這種過程中,智能體會(huì)根據(jù)循環(huán)中其他智能體的反饋來改進(jìn)自己的輸出。
- 動(dòng)態(tài)(全對(duì)全):在這種更復(fù)雜的模式中,任何智能體都可以與其他任何智能體通信。沒有中央?yún)f(xié)調(diào)器或者預(yù)定義的信息流。智能體可以動(dòng)態(tài)地交換信息,并且相互協(xié)商以實(shí)現(xiàn)共同的目標(biāo)。這種模式更靈活,但管理起來也更復(fù)雜,需要復(fù)雜的通信和協(xié)調(diào)機(jī)制。
總結(jié)一下,你可以這樣理解:
- 在路由器模式中,路由器智能體把其他的智能體當(dāng)作專門的工具來使用,根據(jù)需要逐一調(diào)用它們。
- 在并行模式中,初始智能體同時(shí)使用多個(gè)智能體作為工具,來加速整個(gè)過程。
- 在順序和循環(huán)流模式中,智能體在一個(gè)預(yù)定義的流程或循環(huán)中使用,像工具一樣。
- 在動(dòng)態(tài)模式中,智能體的互動(dòng)更像是一個(gè)團(tuán)隊(duì),每個(gè)智能體都同時(shí)充當(dāng)其他智能體的用戶和工具,具體情況而定。
這些模式提供了不同的方式來構(gòu)建多智能體交互,開發(fā)者可以根據(jù)應(yīng)用的特定需求,選擇最合適的方式。
在了解了多智能體協(xié)作的概念后,下一個(gè)問題自然是如何在企業(yè)環(huán)境中實(shí)踐。上圖展示了一個(gè)基于微服務(wù)方法的企業(yè)級(jí)架構(gòu)。這種方法把每個(gè)智能體都視為一個(gè)獨(dú)立的微服務(wù),就像微服務(wù)把大型應(yīng)用分解成可以獨(dú)立部署的組件一樣。這個(gè)類比非常有用,因?yàn)樗试S我們利用現(xiàn)有的微服務(wù)最佳實(shí)踐:每個(gè)業(yè)務(wù)部門可以獨(dú)立開發(fā)和部署自己的智能體,作為獨(dú)立的微服務(wù),并根據(jù)自己的特定需求進(jìn)行定制。這種分散式的方法可以提高靈活性,并加快開發(fā)周期,因?yàn)閳F(tuán)隊(duì)可以獨(dú)立工作,而不會(huì)影響系統(tǒng)的其他部分。就像微服務(wù)通過 API 進(jìn)行通信一樣,多智能體系統(tǒng)中的智能體也通過交換消息進(jìn)行通信,消息通常使用 JSON 等結(jié)構(gòu)化格式。為了確保互操作性并避免重復(fù)開發(fā),一個(gè)中央工具注冊表會(huì)提供對(duì)共享工具的訪問,而一個(gè)智能體模板目錄會(huì)提供可重用的代碼和最佳實(shí)踐。這種方法可以促進(jìn)協(xié)作,加快開發(fā)速度,并提高整個(gè)組織的一致性。我們會(huì)在后續(xù)的文章中,更深入地探討這個(gè)架構(gòu)。
結(jié)論
這篇文章的關(guān)鍵要點(diǎn)包括:
- 生成式 AI 模型依賴智能體通過定義良好的函數(shù)聲明,與外部工具進(jìn)行交互。
- 智能體本質(zhì)上是一個(gè)提示,它指示基礎(chǔ)模型與特定工具進(jìn)行交互。
- 多輪智能體通過動(dòng)態(tài)調(diào)用各種函數(shù),并在整個(gè)交互過程中維護(hù)上下文,來處理復(fù)雜的用戶請求。
- 多智能體系統(tǒng)使智能體能夠通過委派子任務(wù)和協(xié)調(diào)彼此的工作,來協(xié)作解決復(fù)雜的問題。
本文轉(zhuǎn)載自 ??探索AGI??,作者: 獼猴桃
