一、基本概念
- LLM 特性:擅長理解和生成文本,但采用 “一次性” 響應模式,本質上是無記憶的生成模型。
- Agent 本質:包含 LLM 的系統應用,具備自主規劃、工具調用和環境反饋能力,是將 LLM 從 “聊天機器人” 升級為能處理復雜任務的 “智能助理”。
- 常見誤解:ChatGPT 等應用本身并非 Agent,其 “記憶” 功能來自外部記憶模塊而非 LLM 本身。
- 基本特點:具有自主性(根據預設目標自主決策執行)、感知能力(多渠道獲取環境狀態)、行動系統(執行具體操作)、目標導向(行為圍繞預設目標展開),且感知數據來自前序行動反饋,形成 “感知 - 決策 - 行動” 閉環。
二、大模型與 Agent 的關系及理論
- LLM 核心:如同 “缸中大腦”,具備理解輸入、思考生成結果的能力。
- Agent 構成:是 LLM + 記憶模塊 + 工具使用 + 長任務規劃的系統組合。
- 螺旋共生:Agent 使用產生數據反哺 LLM 訓練,LLM 升級使 Agent 更智能,形成數據飛輪與性能迭代的良性循環。
- 具身智能:如宇樹科技機器人、波士頓動力等,展示 LLM 與物理世界的結合可能。
- 理論模型:
- BDI 模型:即信念(對環境的認知)、愿望(想要達成的狀態)、意圖(為實現愿望制定的計劃和承諾)模型。
- 理性 Agent 模型:在給定的感知序列下,能做出使性能度量最大化的行動,具有自主性、適應性和協作性。
- Agent 分類:
- 簡單反射 Agent(僅依當前感知反應,無記憶和規劃)
- 基于模型的反射 Agent(通過內部模型追蹤世界狀態)
- 基于目標的 Agent(依狀態和目標決策,有一定規劃)
- 基于效用的 Agent(考慮行動效用,權衡多目標)
- 學習 Agent(通過學習改進性能)
三、Agent 的組件、能力與技術棧
- 核心組件:
- 傳感器系統(收集環境數據)
- 推理引擎(LLM + 提示詞構成決策核心)
- 執行機構(將決策轉化為具體行動)
- 交互閉環(行動結果反饋形成持續循環)
- 核心能力與優勢:
- 任務分解:拆解復雜目標為可執行步驟,動態調整計劃。
- 工具調用:集成多樣化工具,由 LLM 決策使用時機和方式。
- 長期記憶:通過向量數據庫存儲歷史信息,實現連貫交互和持續學習。
- 環境交互:突破文本生成局限,實際影響外部系統。
- 核心技術棧:
- 模型服務層:底層基礎設施,主流服務包括 Hugging Face、GPT-4、Meta(閉源)及 Llama 3 等開源模型。
- 開發框架層:LangChain 生態最健全,支持多智能體開發;LlamaIndex 專注 RAG 數據處理;Semantic Kernel 為微軟開源基礎工具,LangChain 因功能全面為首選。
- 核心能力層:規劃(依賴 LLM 能力)、記憶(含 RAG 設計和向量數據庫應用)、工具(涉及接口設計)、執行(實現決策到操作閉環)。
- 類型與智能化程度:場景維度從操作型到模擬型再到自主型(智能遞增);技術維度包括聊天機器人、多智能體等;智能維度從簡單反射型到自主學習型(實現難度遞增)。
四、Agent 開發模塊、流程與迭代
- 關鍵模塊特性:支持 60 + 大模型接入,提供 60 + 工具和工具包,記憶系統分短期(GPU 顯存)和長期(40 + 向量數據庫支持);通過預定義 15 種 Agent 類型和提示詞模板降低開發門檻。
- 開發流程:
- 定義目標與范圍:明確具體任務和邊界約束,80% 時間用于思考問題定義。
- 選擇核心 LLM:需具備指令遵循、推理和工具使用能力,直接影響 Agent 表現上限。
- 設計智能體架構:核心邏輯或控制器負責流程控制與決策;規劃模塊由 LLM 實現任務分解;工具集定義可調用工具及接口;記憶模塊分短期和長期,行動執行器負責實際調用功能。
- 工具開發與集成:約 50% 工具可能需自主開發,確保 LLM 理解工具信息,封裝成標準化模塊。
- 提示工程:占 Agent 性能差異的 50%,需包含角色定位、任務目標等要素,放大 LLM 能力。
- 記憶機制實現:可采用簡單列表或向量數據庫,需保存歷史對話和執行結果。
- 測試評估與迭代:從任務完成率、執行效率、魯棒性評估,優化 prompt、工具等,形成持續閉環。
五、基于 LangChain 的 Agent 實戰
環境準備
安裝相關庫并配置環境變量:
pip install langchain openai python-dotenv
創建.env文件設置 API 密鑰:
OPENAI_API_KEY=<your_api_key>
簡單工具調用 Agent
實現一個調用計算器工具的簡單 Agent:
from langchain.agents import initialize_agent, Tool, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.tools import BaseTool
from dotenv import load_dotenv
import os
load_dotenv()
class CalculatorTool(BaseTool):name = "Calculator"description = "用于進行數學計算"def _run(self, query: str) -> str:try:result = eval(query)return f"計算結果:{result}"except Exception as e:return f"計算錯誤:{str(e)}"async def _arun(self, query: str) -> str:return self._run(query)
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
tools = [CalculatorTool()]
agent = initialize_agent(tools, llm, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
result = agent.run("計算3的平方加上5的立方等于多少?")
print(result)
復雜任務處理 Agent(含記憶)
實現能處理復雜任務且具備記憶功能的 Agent:
from langchain.agents import initialize_agent, Tool, AgentType
from langchain.chat_models import ChatOpenAI
from langchain.tools import BaseTool
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.memory import ConversationBufferMemory
from dotenv import load_dotenv
import os
load_dotenv()
# 時間工具
class TimeTool(BaseTool):name = "Time"description = "用于獲取當前時間"def _run(self, query: str) -> str:from datetime import datetimereturn datetime.now().strftime("%Y-%m-%d %H:%M:%S")async def _arun(self, query: str) -> str:return self._run(query)
# 規劃工具
planning_prompt = PromptTemplate(input_variables=["task"],template="你需要完成以下任務:{task}。請列出完成該任務需要的步驟。"
)
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
planning_chain = LLMChain(llm=llm, prompt=planning_prompt)
class PlanningTool(BaseTool):name = "Planning"description = "用于對復雜任務進行規劃,列出步驟"def _run(self, query: str) -> str:return planning_chain.run(task=query)async def _arun(self, query: str) -> str:return self._run(query)
# 初始化記憶功能
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 初始化Agent
tools = [TimeTool(), PlanningTool()]
agent = initialize_agent(tools,llm,agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,memory=memory,verbose=True
)
# 測試復雜任務處理,記憶功能會保存對話歷史,支持上下文連貫交互
result = agent.run("我想明天上午10點去圖書館,幫我規劃一下從家到圖書館的行程,包括出發時間、交通方式,并告訴我明天的天氣情況。")
print(result)
# 后續對話可基于之前的記憶繼續交互
result2 = agent.run("幫我把出發時間提前半小時,重新規劃一下")
print(result2)
此 Agent 通過ConversationBufferMemory實現記憶功能,能保存對話歷史,在處理復雜任務時可基于上下文進行連貫交互,先使用規劃工具分解任務,再調用相應工具完成各步驟。