智能體是什么
????????智能體是指基于大語言模型(LLMs)構建的智能體,具有強大的語言理解和處理能力,可以自動化地完成各種復雜的任務。大模型智能體的構建需要使用大量的數據和計算資源,并進行精細的模型訓練和優化,以實現高性能的智能體,展現出類似人類的歸納和思考能力。
智能體的應用場景
大模型智能體在多個領域有廣泛的應用:
- 自然語言處理:處理文本分類、情感分析、命名實體識別等功能。
- 問答系統:自動回答用戶問題,提供準確的信息和服務。
- 文本生成:生成新聞報道、小說、廣告語等。
- 語音識別和生成:實現語音轉文字、文字轉語音等功能。
- 機器翻譯:將一種語言的文本翻譯成另一種語言。
智能體的組成
智能體四個組成部分:大模型+工具+記憶+規劃
規劃(Planning)
把大型任務分解為子任務,以便高效的處理復雜任務,并規劃執行任務的流程;
對任務執行的過程進行思考和反思,從而決定是繼續執行任務,或判斷任務完結并終止運行。
規劃,可以理解為觀察和思考。如果用人類來類比,當我們接到一個任務,我們的思維模式可能會像下面這樣:
- 我們首先會思考怎么完成這個任務。
- 然后我們會審視手頭上所擁有的工具,以及如何使用這些工具高效地達成目的。
- 我們會把任務拆分成子任務。
- 在執行任務的時候,我們會對執行過程進行反思和完善,吸取教訓以完善未來的步驟
- 執行過程中思考任務何時可以終止
這是人類的規劃能力,我們希望智能體也擁有這樣的思維模式,因此可以通過 LLM 提示工程,為智能體賦予這樣的思維模式。在智能體中,最重要的是讓 LLM 具備這以下能力:
子任務分解(Subgoal decomposition)
通過 LLM 使得智能體可以把大型任務分解為更小的、更可控的子任務,從而能夠有效完成復雜的任務。
思維鏈(Chain of Thoughts, CoT)
思維鏈已經是一種比較標準的提示技術,能顯著提升 LLM 完成復雜任務的效果。當我們對 LLM 這樣要求「think step by step」,會發現 LLM 會把問題分解成多個步驟,一步一步思考和解決,能使得輸出的結果更加準確。這是一種線性的思維方式。
思維鏈的 prompt 可以像是如下這樣(這里只是一個極簡的 prompt,實際會按需進行 prompt 調優):
template="Answer the question: Q: {question}? Let's think step by step:"
反思和完善(self-critics)
智能體在執行任務過程中,通過 LLM 對完成的子任務進行反思,從錯誤中吸取教訓,并完善未來的步驟,提高任務完成的質量。同時反思任務是否已經完成,并終止任務。這種反思和完善可以幫助 Agent 提高自身的智能和適應性。
Reflection
通過結合推理(Reasoning)和行動(Acting)來增強推理和決策的效果
- 推理(Reasoning): LLM 基于已有的知識或行動(Acting)后獲取的知識,推導出結論的過程。
- 行動(Acting): LLM 根據實際情況,使用工具獲取知識,或完成子任務得到階段性的信息。
為什么結合推理和行動?
- 僅推理(Reasoning Only):LLM 僅僅基于已有的知識進行推理,生成答案來回答這個問題。很顯然,如果 LLM 本身不具備這些知識,可能會出現幻覺,胡亂回答一通。
- 僅行動(Acting Only):大模型不加以推理,僅使用工具(比如搜索引擎)搜索這個問題,得出來的將會是海量的資料,不能直接回答這個問題。
- 推理+行動(Reasoning and Acting):LLM 首先會基于已有的知識,并審視擁有的工具。當發現已有的知識不足以回答這個問題,則會調用工具,比如:搜索工具、生成報告等,然后得到新的信息,基于新的信息重復進行推理和行動,直到完成這個任務。
Reasoning+Acting 的 prompt 模版的大致思路為:
Thought(思考): ...
Action(行動): ...
Observation(觀察): ...Thought(思考): ...
Action(行動): ...
Observation(觀察): ......(Repeated many times(重復多次))
Final Answer: ...
使用LangChain實現零樣本智能體,零樣本智能體是指在不給大模型任何樣本提示信息的情況,由大模型去實現工具調用來得到問題的答案,代碼實現如下:
from langchain.agents import tool
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
from datetime import date
llm = OpenAI(
api_key="sk-esjT0arInWjjUXbfCcF228498d99433...........",
base_url="https://api.aigc369.com/v1"
)
@tool
def time() -> str:
"""
Return the date of Today
"""
return str(date.today())
agent = initialize_agent([time], llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("今天是什么日期")
智能體執行過程如下:
> Entering new AgentExecutor chain...
I should use the tool "time" to find the date
Action: time
Action Input: Today
Observation: 2024-11-06
Thought: I now know the final answer
Final Answer: Today's date is November 6th, 2024.
> Finished chain.
記憶(Memory)
短期記憶是指在執行任務的過程中的上下文,會在子任務的執行過程產生和暫存,在任務完結后被清空,短期記憶受到有限上下文窗口長度的限制,不同的模型的上下文窗口限制不同。
長期記憶是長時間保留的信息,一般是指外部知識庫,通常用向量數據庫來存儲和檢索,向量數據庫通過將數據轉化為向量存儲。
工具(Tool)
LLM 是數字世界中的程序,想要與現實世界互動、獲取未知的知識,或是計算某個復雜的公式等,都離不開工具。有了這些工具 API,智能體就可以與物理世界交互,解決實際的問題。因此需要為智能體配備各種工具以及賦予它使用工具的能力。
Function Calling 是一種實現大型語言模型連接外部工具的機制。通過 API 調用 LLM 時,調用方可以提供一系列描述函數(包括函數的功能描述、請求參數說明、響應參數說明),讓 LLM 根據用戶的輸入,合適地選擇調用哪個函數,同時理解用戶的自然語言,并轉換為調用函數的請求參數(通過 JSON 格式返回)。調用方使用 LLM 返回的函數名稱和參數,調用本地函數并得到響應。最后,如果有進一步需求,把本地函數的響應傳給 LLM,讓 LLM 組織成自然語言再給出最終答案。
function calling 具體工作流程如下圖所示:
詳細介紹可以參考文章大模型 Function Call介紹
本文是對大模型Agent入門級學習,參考了以下文章:
https://cloud.tencent.com/developer/article/2422923,后續有新的收獲再進行更新。。。