Agents(智能体)
它能理解用户意图、选择合适的工具、执行操作并根据结果不断调整,直到完成任务。这也是目前大语言模型应用中最灵活、最强大的范式之一。Agent 通过 “调用工具” 突破这些限制,把 LLM 的语言能力和工具执行结合起来,变成一个更实用的数字助手。,结合外部工具,让它具备推理、计划和执行能力。链看作是一个固定流程的 “流水线”,那么。更像是一个能自主决策的 “智能助手”。
·
9.1 基本概念
如果把 RetrievalQA 链看作是一个固定流程的 “流水线”,那么 Agent 更像是一个能自主决策的 “智能助手”。
它能理解用户意图、选择合适的工具、执行操作并根据结果不断调整,直到完成任务。这也是目前大语言模型应用中最灵活、最强大的范式之一。
1. Agent 是什么?
Agent 的核心思想是:
把 大语言模型(LLM)当作大脑,结合外部工具,让它具备推理、计划和执行能力。
运行逻辑一般是:
思考(Think) → 行动(Act) → 观察(Observe) → 再思考 / 行动 → 得到结
- 思考:需要查询奥利奥的热量数据。
- 行动:调用搜索工具。
- 观察:获得 “一份(3 块)约 160 卡路里”。
- 再思考:与常见零食对比,判断是否算高。
- 最终回答:热量偏高,建议适量食用。
2. 为什么需要 Agent?
单独的 LLM 存在一些限制:
- 知识过期和幻觉:不能保证信息实时、准确。
- 无法直接执行操作:只能描述,不能真的发邮件或运行代码。
- 弱计算能力:数学和实时数据获取不够可靠。
Agent 通过 “调用工具” 突破这些限制,把 LLM 的语言能力和工具执行结合起来,变成一个更实用的数字助手。
3. 核心组成部分
一个完整的 Agent 一般由以下部分组成:
-
LLM(大脑)
- 负责推理、决策。
- 决定何时用什么工具,以及如何解释结果。
-
工具(Tools)
- 外部函数或接口,扩展 LLM 的能力。
- 示例:
google_search
:网络搜索python_repl
:运行 Python 代码calculator
:数学计算wikipedia
:百科查询自定义工具
:数据库查询、发邮件、调用硬件等
-
代理(Agent)逻辑
- 决定如何选择工具、如何使用。
-
执行器(Agent Executor)
- 驱动整个循环:调用 Agent → 执行工具 → 返回结果 → 再次推理
- 同时处理异常、避免死循环等。
9.2 智能体案例
9.2.1 天气智能体
工具:
import requests # 用于发送HTTP请求到心知天气API
from dotenv import load_dotenv # 用于加载环境变量文件(.env)
import os # 用于访问操作系统环境变量
from langchain.tools import BaseTool # LangChain的工具基类
from pydantic import BaseModel, Field, ConfigDict # 数据验证和设置管理
from typing import Optional, Type, Any # 类型注解
# 1.先定义一个数据模型
class WeatherInput(BaseModel):
city: str = Field(..., description="查询天气的城市名称")
# 2.配置类管理,表示模型字段的配置,表示智能体工具类
class Config(BaseTool):
# 允许数据模型采取任意python的数据类型
model_config = ConfigDict(arbitrary_types_allowed=True)
#定义初始化方法
def __init__(selfself,**kwargs:Any):
super().__init__(
name = "get_weather_tool",
description = "用于回答特定城市的天气信息,输入的应该是城市名称",
**kwargs
)
# 4.定义智能体的工具
args_schema: Type[BaseModel] = WeatherInput
# 5.定义执行方法
def _run(self, city:str):
load_dotenv()
url = f"https://api.seniverse.com/v3/weather/now.json?key={os.getenv("xinzhi_key")}&location={city}&language=zh-Hans&unit=c"
re = requests.get(url)
data = re.json()
name = data["results"][0]["location"]["name"]
weather = data["results"][0]["now"]["text"]
temp = data["results"][0]["now"]["temperature"]
return f"城市:{name},今天的天气是{weather},温度是{temp}°"
9.2.2 邮件发送智能体
工具:
import requests # 用于发送HTTP请求到心知天气API
from dotenv import load_dotenv # 用于加载环境变量文件(.env)
import os # 用于访问操作系统环境变量
from langchain.tools import BaseTool # LangChain的工具基类
from pydantic import BaseModel, Field, ConfigDict # 数据验证和设置管理
from typing import Optional, Type, Any # 类型注解
import smtplib
from email.mime.text import MIMEText
# 1.先定义一个数据模型
class EmailInput(BaseModel):
to_email: str = Field(..., description="收件人的邮箱")
subject: str = Field(..., description="邮件的标题")
content: str = Field(..., description="邮件的内容")
# 2.配置类管理,表示模型字段的配置,表示智能体工具类
class EmailTool(BaseTool):
# 允许数据模型采取任意python的数据类型
model_config = ConfigDict(arbitrary_types_allowed=True)
#定义初始化方法
def __init__(self,**kwargs:Any):
super().__init__(
name = "get_email_tool",
description = "用于发送邮件信息的,输入的参数应该是收件人的邮箱,邮件标题,邮件内容",
**kwargs
)
# 4.定义智能体的工具
args_schema: Type[BaseModel] = EmailInput
# 5.定义执行方法
def _run(self, to_email:str, subject:str, content:str):
load_dotenv()
# 创建邮件对象
msg = MIMEText(content)
# 收件人邮箱
msg['To'] = to_email
# 发件人邮箱
msg['From'] = os.getenv("email_user")
msg['Subject'] = subject
try:
# 创建SMTP对象
smtp = smtplib.SMTP_SSL(host=os.getenv("email_host"), port=465)
# 登陆邮箱
smtp.login(os.getenv("email_user"), os.getenv("email_password"))
# 发送邮件
smtp.sendmail(os.getenv("email_user"), to_email, msg.as_string())
return "邮件发送成功"
except Exception as e:
print(e)
return "邮件发送失败"
9.2.3 创建文件智能体
工具:
import subprocess
from dotenv import load_dotenv # 用于加载环境变量文件(.env)
import os # 用于访问操作系统环境变量
from langchain.tools import BaseTool # LangChain的工具基类
from pydantic import BaseModel, Field, ConfigDict # 数据验证和设置管理
from typing import Type, Any # 类型注解
class PathInput(BaseModel):
name: str = Field(..., description="要创建文件夹的名称",)
path: str = Field(...,description="要创建的文件夹所在的父路径,例如 'D:\\' 或 '/home/user'")
class Pathtool(BaseTool):
model_config = ConfigDict(arbitrary_types_allowed=True)
def __init__(self, **kwargs: Any):
super().__init__(
name="get_path_tool",
description="用于在指定路径下创建文件夹,需要传入两个参数:文件夹名称(name)和父路径(path)",
**kwargs
)
# 4.定义智能体的工具
args_schema: Type[BaseModel] = PathInput
def _run(self, name:str,path: str):
load_dotenv()
folder_path = os.path.join(path, name)
# 创建文件夹(如果不存在)
if not os.path.exists(folder_path):
try:
os.makedirs(folder_path,exist_ok=True)
result = f"已创建文件夹: {folder_path}"
print(result)
except Exception as e:
result = f"创建文件夹失败: {e}"
print(result)
return result
else:
print(f"文件夹已存在: {folder_path}")
subprocess.Popen(["explorer", folder_path ])
print(f"已打开路径: {path}")
9.2.4 播放视频智能体
工具:
from dotenv import load_dotenv # 用于加载环境变量文件(.env)
import os # 用于访问操作系统环境变量
from langchain.tools import BaseTool # LangChain的工具基类
from pydantic import BaseModel, Field, ConfigDict # 数据验证和设置管理
from typing import Type, Any # 类型注解
class MP4Input(BaseModel):
file_path: str = Field(...,description="要播放的视频的路径,例如 'D:\\' 或 '/home/user'")
class MP4Tool(BaseTool):
model_config = ConfigDict(arbitrary_types_allowed=True)
def __init__(self,**kwargs:Any):
super().__init__(
name = "get_mp4_tool",
description = "用于在指定的路径下找到视频并播放,需要传入一个参数:视频的路径",
**kwargs)
args_schema :Type[BaseModel] = MP4Input
def _run(self,file_path:str):
load_dotenv()
if os.path.exists(file_path):
try:
os.startfile(file_path) # 使用默认程序打开
return "正在播放视频文件..."
except Exception as e:
return f"打开文件失败: {e}"
else:
print("文件不存在,请检查路径是否正确")
print(f"查找的路径: {file_path}")
9.2.5 最终的调用:
from my_agent.path_tool import Pathtool
from my_chat.my_chat_model import ChatModel
from langchain.prompts import ChatPromptTemplate
from my_agent.weather_tool import Config
from my_agent.email_tool import EmailTool
from langchain.agents import initialize_agent,AgentType
from my_agent.mp4_tool import MP4Tool
def one():
chat = ChatModel()
llm = chat.get_line_model()
prompt = ChatPromptTemplate.from_messages([
("system","你是一个AI助手"),
("human","{input}")
])
tool = [Config(),EmailTool(),Pathtool(),MP4Tool()]
agent = initialize_agent(
prompt=prompt,
llm=llm,
tools=tool,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
rs = agent.invoke({"input":"我要播放视频,播放这个 D:\\liulan\\test\\gy04.mp4路径的MP4视频"})
print(rs)
if __name__ == '__main__':
one()
更多推荐
所有评论(0)