9.1 基本概念

如果把 RetrievalQA 链看作是一个固定流程的 “流水线”,那么 Agent 更像是一个能自主决策的 “智能助手”。
它能理解用户意图、选择合适的工具、执行操作并根据结果不断调整,直到完成任务。这也是目前大语言模型应用中最灵活、最强大的范式之一。

1. Agent 是什么?

Agent 的核心思想是:
把 大语言模型(LLM)当作大脑,结合外部工具,让它具备推理、计划和执行能力。
运行逻辑一般是:

思考(Think) → 行动(Act) → 观察(Observe) → 再思考 / 行动 → 得到结

  1. 思考:需要查询奥利奥的热量数据。
  2. 行动:调用搜索工具。
  3. 观察:获得 “一份(3 块)约 160 卡路里”。
  4. 再思考:与常见零食对比,判断是否算高。
  5. 最终回答:热量偏高,建议适量食用。

2. 为什么需要 Agent?

单独的 LLM 存在一些限制:

  • 知识过期和幻觉:不能保证信息实时、准确。
  • 无法直接执行操作:只能描述,不能真的发邮件或运行代码。
  • 弱计算能力:数学和实时数据获取不够可靠。

Agent 通过 “调用工具” 突破这些限制,把 LLM 的语言能力和工具执行结合起来,变成一个更实用的数字助手。


3. 核心组成部分

一个完整的 Agent 一般由以下部分组成:

  1. LLM(大脑)

    • 负责推理、决策。
    • 决定何时用什么工具,以及如何解释结果。
  2. 工具(Tools)

    • 外部函数或接口,扩展 LLM 的能力。
    • 示例:
      • google_search:网络搜索
      • python_repl:运行 Python 代码
      • calculator:数学计算
      • wikipedia:百科查询
      • 自定义工具:数据库查询、发邮件、调用硬件等
  3. 代理(Agent)逻辑

    • 决定如何选择工具、如何使用。
  4. 执行器(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()

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐