自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一文帶你了解大模型:智能體(Agent)

人工智能
通過智能體技術(shù),我們可以創(chuàng)建各種各樣的 AI 應(yīng)用,比如:Copilot、DB-GPT 等等,一些 AI 應(yīng)用已經(jīng)成為工作生活中不可缺少的存在

作者 | lucasgftang

大語言模型 vs 人類

大語言模型很強(qiáng)大,就像人類的大腦一樣擁有思考的能力。如果人類只有大腦,沒有四肢,沒有工具,是沒辦法與世界互動的。如果我們能給大模型配備上四肢和工具呢?大模型是不是就會打破次元壁,從數(shù)字世界走向現(xiàn)實(shí)世界,與現(xiàn)實(shí)世界實(shí)現(xiàn)夢幻聯(lián)動呢?

大語言模型(后文將用 LLM 指代)可以接受輸入,可以分析&推理、可以輸出文字\代碼\媒體。然而,其無法像人類一樣,擁有規(guī)劃思考能力、運(yùn)用各種工具與物理世界互動,以及擁有人類的記憶能力。

  • LLM:接受輸入、思考、輸出
  • 人類:LLM(接受輸入、思考、輸出)+ 記憶 + 工具 + 規(guī)劃

如果我們給 LLM 配備上:與物理世界互動的工具、記憶能力、規(guī)劃思考能力。LLM 是否就可以像人類一樣,能夠自主思考并規(guī)劃完成任務(wù)的過程,能檢索記憶,能使用各種工具提高效率,最終完成某個任務(wù)。

智能體是什么

智能體的英文是 Agent,AI 業(yè)界對智能體提出了各種定義。個人理解,智能體是一種通用問題解決器。從軟件工程的角度看來,智能體是一種基于大語言模型的,具備規(guī)劃思考能力、記憶能力、使用工具函數(shù)的能力,能自主完成給定任務(wù)的計(jì)算機(jī)程序。

圖 1. 由 LLM 驅(qū)動的智能體系統(tǒng)

如圖 1 所示,在基于 LLM 的智能體中,LLM 的充當(dāng)著智能體的“大腦”的角色,同時還有 3 個關(guān)鍵部分:

  • 規(guī)劃(Planning) : 智能體會把大型任務(wù)分解為子任務(wù),并規(guī)劃執(zhí)行任務(wù)的流程;智能體會對任務(wù)執(zhí)行的過程進(jìn)行思考和反思,從而決定是繼續(xù)執(zhí)行任務(wù),或判斷任務(wù)完結(jié)并終止運(yùn)行。
  • 記憶(Memory): 短期記憶,是指在執(zhí)行任務(wù)的過程中的上下文,會在子任務(wù)的執(zhí)行過程產(chǎn)生和暫存,在任務(wù)完結(jié)后被清空。長期記憶是長時間保留的信息,一般是指外部知識庫,通常用向量數(shù)據(jù)庫來存儲和檢索。
  • 工具使用(Tool use):為智能體配備工具 API,比如:計(jì)算器、搜索工具、代碼執(zhí)行器、數(shù)據(jù)庫查詢工具等。有了這些工具 API,智能體就可以是物理世界交互,解決實(shí)際的問題。

智能體能做什么

相信看到這里,我們已經(jīng)對智能體有了基本的認(rèn)知。如果你還覺得智能體這個概念有點(diǎn)抽象,沒關(guān)系,現(xiàn)在我們來點(diǎn)好玩的,一起來看看智能體能玩出什么花樣?

1.智能體之調(diào)研員

調(diào)研員智能體,可以根據(jù)用戶的調(diào)研問題,從搜索引擎上搜索資料并總結(jié),然后生成調(diào)研報告。這里使用 MetaGPT 框架中的調(diào)研員 示例來展示一個智能體的實(shí)際作用及其構(gòu)成。

運(yùn)行一下試試:

  • 輸入調(diào)研課題:調(diào)研特斯拉 FSD 和華為 ADS 這兩個自動駕駛系統(tǒng)
~ python3 -m metagpt.roles.researcher "特斯拉FSD vs 華為ADS"
  • 智能體執(zhí)行調(diào)研

圖2. 從搜索引擎進(jìn)行搜索并獲取Url地址列表

(圖左為馮·諾依曼;右為奧本海默;背后是世界上第一臺馮·諾依曼架構(gòu)的“現(xiàn)代”計(jì)算機(jī))

圖3. 瀏覽網(wǎng)頁并總結(jié)網(wǎng)頁內(nèi)容

圖4.生成調(diào)研報告

  • 輸出調(diào)研報告metaGPT 生成并保存了調(diào)研報告

文件:特斯拉FSD vs 華為ADS.md

圖5

2.拆解調(diào)研員

(1) 調(diào)研員智能體構(gòu)成

回到前文所說的,如果僅有 LLM 這個大腦,是無法完成整個調(diào)研流程的。在調(diào)研員智能體中,為 LLM 大腦配備了規(guī)劃、工具、記憶的能力,使得他能獨(dú)立完成調(diào)研任務(wù),下面列出其基本構(gòu)成,構(gòu)成分三部分:角色、工具、記憶。在角色中,會注冊各種工具,定義思考規(guī)劃的方式,以及本身具備的短期記憶能力。

(2) 圖解調(diào)研員智能體

圖6

智能體的關(guān)鍵構(gòu)成

智能體 如上圖所示,在基于 LLM 的智能體中,LLM 的充當(dāng)著智能體的“大腦”的角色,同時還有 3 個關(guān)鍵部分:規(guī)劃(Planning)、記憶(Memory)、工具使用(Tool use)

1.規(guī)劃(Planing)

規(guī)劃,可以為理解觀察和思考。如果用人類來類比,當(dāng)我們接到一個任務(wù),我們的思維模式可能會像下面這樣:

  • 我們首先會思考怎么完成這個任務(wù)。
  • 然后我們會審視手頭上所擁有的工具,以及如何使用這些工具高效地達(dá)成目的。
  • 我們會把任務(wù)拆分成子任務(wù)(就像我們會使用 TAPD 做任務(wù)拆分)。
  • 在執(zhí)行任務(wù)的時候,我們會對執(zhí)行過程進(jìn)行反思和完善,吸取教訓(xùn)以完善未來的步驟
  • 執(zhí)行過程中思考任務(wù)何時可以終止

這是人類的規(guī)劃能力,我們希望智能體也擁有這樣的思維模式,因此可以通過 LLM 提示工程,為智能體賦予這樣的思維模式。在智能體中,最重要的是讓 LLM 具備這以下兩個能力:

(1) 子任務(wù)分解

通過 LLM 使得智能體可以把大型任務(wù)分解為更小的、更可控的子任務(wù),從而能夠有效完成復(fù)雜的任務(wù)。

① 思維鏈(Chain of Thoughts, CoT)

思維鏈已經(jīng)是一種比較標(biāo)準(zhǔn)的提示技術(shù),能顯著提升 LLM 完成復(fù)雜任務(wù)的效果。當(dāng)我們對 LLM 這樣要求「think step by step」,會發(fā)現(xiàn) LLM 會把問題分解成多個步驟,一步一步思考和解決,能使得輸出的結(jié)果更加準(zhǔn)確。這是一種線性的思維方式。

思維鏈的 prompt 可以像是如下這樣(這里只是一個極簡的 prompt,實(shí)際會按需進(jìn)行 prompt 調(diào)優(yōu)):

template="Answer the question: Q: {question}? Let's think step by step:"

② 思維樹(Tree-of-thought, ToT)

對 CoT 的進(jìn)一步擴(kuò)展,在思維鏈的每一步,推理出多個分支,拓?fù)湔归_成一棵思維樹。使用啟發(fā)式方法評估每個推理分支對問題解決的貢獻(xiàn)。選擇搜索算法,使用廣度優(yōu)先搜索(BFS)或深度優(yōu)先搜索(DFS)等算法來探索思維樹,并進(jìn)行前瞻和回溯。

圖7

③ 反思和完善

智能體在執(zhí)行任務(wù)過程中,通過 LLM 對完成的子任務(wù)進(jìn)行反思,從錯誤中吸取教訓(xùn),并完善未來的步驟,提高任務(wù)完成的質(zhì)量。同時反思任務(wù)是否已經(jīng)完成,并終止任務(wù)。

(2) ReAct

(剛接觸到這個單詞時,腦子里冒出來的是 「React 是由 Facebook 開源的一個進(jìn)行創(chuàng)建用戶界面的一款 JavaScript 庫....」,打住,我們好像走錯片場了,此 React 非彼 ReAct ?﹏? )

ReAct(Yao et al. 2023) ,《ReAct: Synergizing Reasoning and Acting in Language Models》 這篇論文提出一種用于增強(qiáng)大型語言模型的方法,它通過結(jié)合推理(Reasoning)和行動(Acting)來增強(qiáng)推理和決策的效果。

  • 推理(Reasoning): LLM 基于「已有的知識」或「行動(Acting)后獲取的知識」,推導(dǎo)出結(jié)論的過程。
  • 行動(Acting): LLM 根據(jù)實(shí)際情況,使用工具獲取知識,或完成子任務(wù)得到階段性的信息。

為什么結(jié)合推理和行動,就會有效增強(qiáng) LLM 完成任務(wù)的能力?這個問題其實(shí)很好回答,我們用上面的「調(diào)研員智能體」舉例,我提出了問題:「特斯拉 FSD 對比華為 ADS」,下面列出幾種不同規(guī)劃模式的推演:

  • 僅推理(Reasoning Only):LLM 僅僅基于已有的知識進(jìn)行推理,生成答案回答這個問題。很顯然,如果 LLM 本身不具備這些知識,可能會出現(xiàn)幻覺,胡亂回答一通。
  • 僅行動(Acting Only):大模型不加以推理,僅使用工具(比如搜索引擎)搜索這個問題,得出來的將會是海量的資料,不能直接回到這個問題。
  • 推理+行動(Reasoning and Acting):LLM 首先會基于已有的知識,并審視擁有的工具。當(dāng)發(fā)現(xiàn)已有的知識不足以回答這個問題,則會調(diào)用工具,比如:搜索工具、生成報告等,然后得到新的信息,基于新的信息重復(fù)進(jìn)行推理和行動,直到完成這個任務(wù)。其推理和行動的步驟會是如下這樣:
推理1:當(dāng)前知識不足以回答這個問題,要回答該問題,需要知道什么是「特斯拉FSD 」和「華為ADS」
行動1:使用搜索工具搜索「特斯拉FSD 」和「華為ADS」的資料
觀察1:總結(jié)行動1的內(nèi)容

推理2:基于行動1和觀察1的信息,得知這是關(guān)于兩個自動駕駛提供商的方案對比,基于已有的信息,現(xiàn)在需要生成報告
行動2:使用生成報告的工具,生成調(diào)研報告
觀察2:任務(wù)完成

圖8

通過巧妙的 promt 提示設(shè)計(jì),使得 LLM 重復(fù)地執(zhí)行推理和行動,最終完成任務(wù)。ReAct 的 prompt 模版的大致思路為:

Thought(思考): ...
Action(行動): ...
Observation(觀察): ...

Thought(思考): ...
Action(行動): ...
Observation(觀察): ...

...(Repeated many times(重復(fù)多次))

2.記憶(Memory)

記憶是什么?當(dāng)我們在思考這個問題,其實(shí)人類的大腦已經(jīng)在使用記憶。記憶是大腦存儲、保留和回憶信息的能力。記憶可以分為不同的類型:

  • 短期記憶(或工作記憶):這是一種持續(xù)時間較短的記憶,能夠暫時存儲和處理有限數(shù)量的信息。例如,記住一個電話號碼直到撥打完畢。
  • 長期記憶:這是一種持續(xù)時間較長的記憶,可以存儲大量信息,從幾分鐘到一生。長期記憶可以進(jìn)一步分為顯性記憶和隱性記憶。顯性記憶,可以有意識地回憶和表達(dá)的信息,顯性記憶又可以分為情景記憶(個人經(jīng)歷的具體事件)和語義記憶(一般知識和概念)。隱性記憶,這種記憶通常是無意識的,涉及技能和習(xí)慣,如騎自行車或打字。

仿照人類的記憶機(jī)制,智能體實(shí)現(xiàn)了兩種記憶機(jī)制:

  • 短期記憶:在當(dāng)前任務(wù)執(zhí)行過程中所產(chǎn)生的信息,比如某個工具或某個子任務(wù)執(zhí)行的結(jié)果,會寫入短期記憶中。記憶在當(dāng)前任務(wù)過程中產(chǎn)生和暫存,在任務(wù)完結(jié)后被清空。
  • 長期記憶:長期記憶是長時間保留的信息。一般是指外部知識庫,通常用向量數(shù)據(jù)庫來存儲和檢索。

3.工具使用(Tool use)

LLM 是數(shù)字世界中的程序,想要與現(xiàn)實(shí)世界互動、獲取未知的知識,或是計(jì)算某個復(fù)雜的公式等,都離不開不工具。所以我們需要為智能體配備各種工具以及賦予它使用工具的能力。

工具是什么?它可以是錘子、螺絲刀,也可以是函數(shù)(function)、軟件開發(fā)工具包(sdk)。工具是人類智慧的具象化,擴(kuò)展我們的能力,提升工作效率。在智能體中,工具就是函數(shù)(Function),工具使用就是調(diào)用函數(shù)(Call Function)。

在 LLM 中實(shí)現(xiàn)函數(shù)調(diào)用,使用到 LLM 的這個能力:

(1) Function Calling

Function Calling 是一種實(shí)現(xiàn)大型語言模型連接外部工具的機(jī)制。通過 API 調(diào)用 LLM 時,調(diào)用方可以描述函數(shù),包括函數(shù)的功能描述、請求參數(shù)說明、響應(yīng)參數(shù)說明,讓 LLM 根據(jù)用戶的輸入,合適地選擇調(diào)用哪個函數(shù),同時理解用戶的自然語言,并轉(zhuǎn)換為調(diào)用函數(shù)的請求參數(shù)(通過 JSON 格式返回)。調(diào)用方使用 LLM 返回的函數(shù)名稱和參數(shù),調(diào)用函數(shù)并得到響應(yīng)。最后,如果需求,把函數(shù)的響應(yīng)傳給 LLM,讓 LLM 組織成自然語言回復(fù)用戶。

function calling 具體工作流程如下圖所示:

圖9

不同 LLM 的 API 接口協(xié)議會有所不同,下文將以O(shè)penAI 的 API 協(xié)議為例,說明如何實(shí)現(xiàn) Function Calling

① 函數(shù)描述

我們可以按照智能體的需要來實(shí)現(xiàn)函數(shù),比如前文的「調(diào)研員」智能體,為其實(shí)現(xiàn)了這些函數(shù):WebBrowseAndSummarize:瀏覽網(wǎng)頁并總結(jié)網(wǎng)頁內(nèi)容;ConductResearch:生成調(diào)研報告等。如果是一個智能家居的智能體,可能會需要這些函數(shù):開關(guān)燈、開光空調(diào)、獲取環(huán)境信息等。函數(shù)的實(shí)現(xiàn)在這里不展開贅述,一個函數(shù)可以自行編碼實(shí)現(xiàn),也可以通過調(diào)用外部 API 實(shí)現(xiàn)。

假設(shè)你的函數(shù)已經(jīng)被實(shí)現(xiàn),我們需要向 LLM 描述這個函數(shù),函數(shù)描述的必備要素:

  • 函數(shù)名
  • 函數(shù)的功能描述
  • 函數(shù)的請求參數(shù)說明
  • 函數(shù)的響應(yīng)參數(shù)說明(可選)

「查詢最近天氣」的函數(shù)描述:

tools = [
{
        "type": "function",
        "function": {
            "name": "get_n_day_weather_forecast",
            "description": "獲取最近n天的天氣預(yù)報",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市或鎮(zhèn)區(qū) 如:深圳市南山區(qū)",
                    },
                    "format": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "要使用的溫度單位,攝氏度 or 華氏度",
                    },
                    "num_days": {
                        "type": "integer",
                        "description": "預(yù)測天數(shù)",
                    }
                },
                "required": ["location", "format", "num_days"]
            },
        }
    }
]

② 調(diào)用 LLM 獲得函數(shù)的請求參數(shù)

Function Calling 是通過請求 LLM 的 chat API 實(shí)現(xiàn)的,在支持 Function Calling 模型的 chat API 參數(shù)中,會有一個 functions 參數(shù) (或 tools,不同 LLM 的參數(shù)會有所不同) ,通過傳入這個參數(shù),大模型則會知道擁有哪些參數(shù)可供使用。并且會根據(jù)用戶的輸入,推理出應(yīng)該調(diào)用哪些函數(shù),并將自然語言轉(zhuǎn)成函數(shù)的請求參數(shù),返回給請求方。下面以 OpenAI 的 SDK 舉例:

from openai import OpenAI

def chat_completion_request(messages, tools=None, tool_choice=None, model="gpt-3.5-turbo"):
    try:
        response = client.chat.completions.create(
            model=model,
            messages=messages,
            tools=tools,
            tool_choice=tool_choice,
        )
        return response
    except Exception as e:
        print("Unable to generate ChatCompletion response")
        print(f"Exception: {e}")
        return e


if __name__ == "__main__":
    messages = []
    messages.append({"role": "system", "content": "不要假設(shè)將哪些值輸入到函數(shù)中。如果用戶請求不明確,請要求澄清"})
    messages.append({"role": "user", "content": "未來5天深圳南山區(qū)的天氣怎么樣"})
    chat_response = chat_completion_request(
        messages, tools=tools
    )

 tool_calls = chat_response.choices[0].message.tool_calls
 print("===回復(fù)===")
 print(tool_calls)

LLM 將會返回get_n_day_weather_forecast函數(shù)的調(diào)用參數(shù):

===回復(fù)===
[ChatCompletionMessageToolCall(id='call_7qGdyUEWp34ihubinIUCTXyH', function=Function(arguments='{"location":"深圳市南山區(qū)","format":"celsius","num_days":5}', name='get_n_day_weather_forecast'), type='function')]

// 格式化看看:chat_response.choices[0].message.tool_calls:
[
  {
    "id": "call_7qGdyUEWp34ihubinIUCTXyH",
    "function": {
      "arguments": {
        "location": "深圳市南山區(qū)",
        "format": "celsius",
        "num_days": 5
      },
      "name": "get_n_day_weather_forecast"
    },
    "type": "function"
  }
]

③ 調(diào)用函數(shù)

調(diào)用方獲得 LLM 返回的函數(shù)調(diào)用信息(函數(shù)名稱和調(diào)用參數(shù))后,自行調(diào)用函數(shù),并得到函數(shù)執(zhí)行的響應(yīng)。如果有需要,還可以把函數(shù)執(zhí)行的響應(yīng)追加到 chat API 的對話中傳給 LLM,讓 LLM 組織成自然語言回復(fù)用戶。

# 執(zhí)行函數(shù)
for tool_call in tool_calls:
    function = tool_call.function.name
    arguments_list = json.loads(tool_call.function.arguments)
    function_to_call = globals().get(function)
    result = function_to_call(**arguments_list)
    print("===" + function + "===")
    print(result)

    # 把函數(shù)調(diào)用結(jié)果加入到對話歷史中
    messages.append(
        {
            "tool_call_id": tool_call.id,  # 用于標(biāo)識函數(shù)調(diào)用的 ID
            "role": "user",
            "name": function,
            "content": "函數(shù)執(zhí)行結(jié)果為:" + str(result)
        }
    )
# 函數(shù)執(zhí)行結(jié)果傳給LLM,組織成自然語言回復(fù)用戶
chat_response = chat_completion_request(
    messages, tools=tools
)
print("===回復(fù)===")
print(chat_response.choices[0].message.content)

執(zhí)行結(jié)果:

===get_n_day_weather_forecast===
[{'date': '2023-04-01', 'location': '深圳市南山區(qū)', 'temperature': '20°C', 'description': '晴朗'}, {'date': '2023-04-02', 'location': '深圳市南山區(qū)', 'temperature': '21°C', 'description': '多云'}, {'date': '2023-04-03', 'location': '深圳市南山區(qū)', 'temperature': '22°C', 'description': '晴朗'}, {'date': '2023-04-04', 'location': '深圳市南山區(qū)', 'temperature': '23°C', 'description': '多云'}, {'date': '2023-04-05', 'location': '深圳市南山區(qū)', 'temperature': '24°C', 'description': '晴朗'}]
===回復(fù)===
未來5天深圳南山區(qū)的天氣情況如下:
- 4月1日:晴朗,溫度20°C
- 4月2日:多云,溫度21°C
- 4月3日:晴朗,溫度22°C
- 4月4日:多云,溫度23°C
- 4月5日:晴朗,溫度24°C

請注意天氣預(yù)報僅供參考,實(shí)際情況可能會有所變化。

智能體的開發(fā)框架

現(xiàn)在(2024 年 5 月)如果你想要開發(fā)一個 AI 智能體,已經(jīng)比大模型爆發(fā)的初期方便太多了,隨著 AI 應(yīng)用需求的持續(xù)火熱,智能體框架層出不窮。智能體開發(fā)框架,會抽象和封裝那些被高頻使用的模塊,如記憶能力、規(guī)劃能力、RAG 能力、大模型調(diào)用等。使用智能體框架,可讓幫助你快速搭建智能體。

根據(jù) awesome-ai-agents 的整理,無論是開源的還是閉源的,智能體應(yīng)用框架在各個領(lǐng)域,比如自定義智能體、編碼、研究、數(shù)據(jù)分析、多智能體等等,都有比較有代表性的產(chǎn)品可供選擇。

圖10

上文曾使用到MetaGPT ,MetaGPT 是一個多智能體框架,多智能體框架可以幫你開發(fā)一個由多個不同職責(zé)的智能體組合起來的多智能體。舉個例子,如果我們想開發(fā)一個多智能體軟件團(tuán)隊(duì),該軟件團(tuán)隊(duì)可以根據(jù)用戶需求交付代碼,其內(nèi)部會通過測試代碼、評審代碼來提升代碼質(zhì)量。該多智能體將包含:開發(fā)(coder)、測試(tester)、評審人(reviewer)這三個不同職責(zé)的智能體,他們各司其職,互相協(xié)作完成任務(wù)。下圖的左側(cè)是多智能體的協(xié)作流程,右側(cè)是單智能體的工作流程。

圖11

展望

隨著大模型的百花齊放,LLM 會支持更長的上下文、更大的參數(shù)規(guī)模,其推理能力也會愈發(fā)強(qiáng)大。因此,基于大模型搭建的智能體(AI Agent)的能力邊界也在不斷突破。通過智能體技術(shù),我們可以創(chuàng)建各種各樣的 AI 應(yīng)用,比如:Copilot、DB-GPT 等等,一些 AI 應(yīng)用已經(jīng)成為工作生活中不可缺少的存在。相信 AI 應(yīng)用的將會快速全面地重構(gòu)我們曾經(jīng)習(xí)以為常的軟件形態(tài)和交互方式,以及提升人類的生產(chǎn)效率。

責(zé)任編輯:趙寧寧 來源: 騰訊技術(shù)工程
相關(guān)推薦

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2023-11-20 08:18:49

Netty服務(wù)器

2023-09-12 07:02:19

騰訊混元大模型

2023-10-27 08:15:45

2022-02-24 07:34:10

SSL協(xié)議加密

2023-11-08 08:15:48

服務(wù)監(jiān)控Zipkin

2023-12-08 08:00:00

人工智能MusicGen音樂模型

2020-10-08 14:32:57

大數(shù)據(jù)工具技術(shù)

2025-01-15 09:06:57

servlet服務(wù)器Java

2022-09-29 13:09:38

DataClassPython代碼

2022-04-28 09:22:46

Vue灰度發(fā)布代碼

2020-02-02 15:14:24

HTTP黑科技前端

2023-09-18 08:50:51

智能模型

2024-05-07 08:49:36

Hadoop數(shù)據(jù)存儲-分布式存儲

2019-08-06 09:00:00

JavaScript函數(shù)式編程前端

2023-05-17 11:33:45

梯度下降機(jī)器學(xué)習(xí)

2024-05-27 00:00:00

.NET游戲引擎C#

2024-02-04 09:44:41

量子計(jì)算量子量子物理

2022-03-14 08:01:06

LRU算法線程池
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號