跳至内容

智能体创建


一、Tools,create_agent,Middleware


一句话总结:Tools 是智能体可以调用的外部能力,create_agent 是 LangChain v1.0 创建智能体的标准 API,Middleware 则是在智能体执行过程中插入业务逻辑的可插拔钩子系统。

1. 组件总览

组件 定位 核心内容
Tools 智能体可以调用的外部能力 @tool 装饰器、BaseTool 基类
create_agent v1.0 创建智能体的标准 API modeltoolspromptmiddleware
Middleware 智能体执行过程中的可插拔钩子系统 PIIMiddlewareSummarizationMiddlewareHumanInTheLoopMiddleware
text
用户消息
create_agent 基础循环
(模型调用 → 工具执行 → 再次调用模型 → 结束)
Middleware 钩子
before_agent → before_model → wrap_model_call
→ wrap_tool_call → after_model → after_agent
最终回复

2. Tools(工具)

2.1 定位

Tools 是智能体可以调用的外部能力,例如查天气、查数据库、发邮件、调用 API。模型本身不会执行工具,它只会决定“调用哪个工具、传什么参数”,真正的执行由 Tools 完成。

2.2 使用 @tool 装饰器定义工具(推荐)

python
from langchain.tools import tool


@tool
def get_weather(city: str) -> str:
    """获取指定城市的天气信息。"""
    return f"{city} 今天晴天,气温 28 摄氏度。"


@tool
def send_email(to: str, content: str) -> str:
    """向指定邮箱发送邮件。"""
    return f"邮件已发送至 {to}"

说明:

  • 函数名会作为工具名。
  • 函数 docstring 会作为工具描述,供模型判断何时调用。
  • 函数参数和类型注解会转换为工具的输入结构。

2.3 使用 BaseTool 基类定义工具

当工具逻辑复杂,或需要自定义参数校验、异步实现时,可以继承 BaseTool

python
from langchain.tools import BaseTool
from pydantic import BaseModel, Field


class WeatherInput(BaseModel):
    city: str = Field(description="要查询天气的城市名称")


class WeatherTool(BaseTool):
    name: str = "get_weather"
    description: str = "获取指定城市的天气信息"
    args_schema: type[BaseModel] = WeatherInput

    def _run(self, city: str) -> str:
        return f"{city} 今天晴天,气温 28 摄氏度。"

    async def _arun(self, city: str) -> str:
        return self._run(city)

3. create_agent(智能体创建器)

3.1 定位

create_agent 是 LangChain v1.0 中创建智能体的标准 API,替代旧版的 AgentExecutor + create_react_agent 组合。它内置了“模型调用 -> 工具执行 -> 模型再次调用”的基础循环,同时支持通过 Middleware 深度定制。

核心参数:

参数 作用
model 智能体使用的大模型
tools 智能体可以调用的工具列表
prompt 系统提示词,v1.0 标准写法为 system_prompt
middleware 智能体执行过程中插入的中间件列表

注意:讲义里写的 prompt,在 v1.0 标准 API 中通常写作 system_prompt

3.2 新老写法对比

旧版:

python
from langchain.agents import AgentExecutor
from langgraph.prebuilt import create_react_agent

agent = create_react_agent(model=model, tools=tools)
executor = AgentExecutor(agent=agent, tools=tools)

v1.0:

python
from langchain.agents import create_agent

agent = create_agent(
    model=model,
    tools=tools,
)

3.3 create_agent 使用示例

python
from langchain.agents import create_agent
from langchain.tools import tool


@tool
def get_weather(city: str) -> str:
    """获取指定城市的天气信息。"""
    return f"{city} 今天晴天,气温 28 摄氏度。"


agent = create_agent(
    model="openai:gpt-4o-mini",
    tools=[get_weather],
    system_prompt="你是一个天气助手,需要使用工具回答天气问题。",
)

result = agent.invoke({
    "messages": [
        {"role": "user", "content": "上海今天天气怎么样?"},
    ],
})

print(result["messages"][-1].content)

因为 create_agent 基于 LangGraph 构建,还自动支持持久化、流式输出、人工审批和时间回溯等能力。

4. Middleware(中间件)

4.1 定位

Middleware 是智能体执行过程中的可插拔钩子系统,可以在模型调用前、模型调用后、工具调用时等节点插入自定义逻辑,例如脱敏、日志、限流、人工审批和上下文管理。

4.2 核心钩子

钩子 触发时机 典型用途
before_agent Agent 开始执行前 加载记忆、校验输入
before_model 每次模型调用前 动态修改提示词、裁剪消息
wrap_model_call 包裹每次模型调用 重试、缓存、模型切换
wrap_tool_call 包裹每次工具调用 工具监控、工具结果处理
after_model 每次模型响应后 输出校验、护栏
after_agent Agent 执行结束后 保存结果、清理资源

4.3 预置中间件

LangChain 提供了一些预置中间件:

  • PIIMiddleware:在发给模型前对敏感信息脱敏或拦截。
  • SummarizationMiddleware:对话历史过长时自动摘要。
  • HumanInTheLoopMiddleware:敏感工具调用前要求人工审批。
python
from langchain.agents import create_agent
from langchain.agents.middleware import (
    HumanInTheLoopMiddleware,
    PIIMiddleware,
    SummarizationMiddleware,
)
from langchain.tools import tool


@tool
def read_email() -> str:
    """读取最新邮件。"""
    return "最新邮件:系统将于今晚 22:00 维护。"


@tool
def send_email(to: str, content: str) -> str:
    """向指定邮箱发送邮件。"""
    return f"邮件已发送至 {to}"


agent = create_agent(
    model="openai:gpt-4o-mini",
    tools=[read_email, send_email],
    system_prompt="你是一位邮件助手",
    middleware=[
        PIIMiddleware("email", strategy="redact", apply_to_input=True),
        SummarizationMiddleware(
            model="openai:gpt-4o-mini",
            trigger={"tokens": 500},
        ),
        HumanInTheLoopMiddleware(
            interrupt_on={
                "send_email": {
                    "allowed_decisions": ["approve", "edit", "reject"],
                },
            },
        ),
    ],
)

4.4 自定义中间件

继承 AgentMiddleware,实现需要的钩子方法:

python
from typing import Any, Callable

from langchain.agents import create_agent
from langchain.agents.middleware import AgentMiddleware, AgentState
from langchain.messages import ToolMessage
from langchain.tools import tool
from langchain.tools.tool_node import ToolCallRequest
from langgraph.runtime import Runtime
from langgraph.types import Command


@tool
def get_weather(city: str) -> str:
    """获取指定城市的天气信息。"""
    return f"{city} 今天晴天,气温 28 摄氏度。"


class LoggingMiddleware(AgentMiddleware):
    def before_agent(
        self,
        state: AgentState,
        runtime: Runtime,
    ) -> dict[str, Any] | None:
        print("Agent 开始执行")
        return None

    def before_model(
        self,
        state: AgentState,
        runtime: Runtime,
    ) -> dict[str, Any] | None:
        print(f"调用模型前,消息数量:{len(state['messages'])}")
        return None

    def wrap_tool_call(
        self,
        request: ToolCallRequest,
        handler: Callable[[ToolCallRequest], ToolMessage | Command[Any]],
    ) -> ToolMessage | Command[Any]:
        print(f"调用工具:{request.tool_call['name']}")
        result = handler(request)
        print(f"工具返回:{result}")
        return result

    def after_agent(
        self,
        state: AgentState,
        runtime: Runtime,
    ) -> dict[str, Any] | None:
        print("Agent 执行结束")
        return None


agent = create_agent(
    model="openai:gpt-4o-mini",
    tools=[get_weather],
    system_prompt="你是一个天气助手",
    middleware=[LoggingMiddleware()],
)

说明:

  • before_* 钩子按中间件列表顺序执行。
  • after_* 钩子按逆序执行。
  • wrap_* 钩子采用嵌套方式包裹执行。
  • 钩子返回的字典会合并进 Agent 状态,可用于跨阶段传值。

5. 小结

组件 核心任务 核心写法 / 类型
Tools 提供智能体可调用的外部能力 @tool 装饰器、BaseTool 基类
create_agent 创建并运行智能体 modeltoolssystem_promptmiddleware
Middleware 在执行流程中插入可插拔逻辑 PIIMiddlewareSummarizationMiddlewareHumanInTheLoopMiddleware、自定义 AgentMiddleware

create_agent 简化了智能体创建流程,Middleware 则提供了生产级智能体需要的控制力,两者配合是 LangChain v1.0 构建智能体的核心方式。