
一、基本概念
- 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 实战
环境准备
安装相关库并配置环境变量:
plain
pip install langchain openai python-dotenv
创建.env文件设置 API 密钥:
plain
OPENAI_API_KEY=<your_api_key>
简单工具调用 Agent
实现一个调用计算器工具的简单 Agent:
plain
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:
plain
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 datetime
return 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实现记忆功能,能保存对话历史,在处理复杂任务时可基于上下文进行连贯交互,先使用规划工具分解任务,再调用相应工具完成各步骤。