智能体创建
智能体创建
一、Tools,create_agent,Middleware
一句话总结:Tools 是智能体可以调用的外部能力,
create_agent是 LangChain v1.0 创建智能体的标准 API,Middleware 则是在智能体执行过程中插入业务逻辑的可插拔钩子系统。
1. 组件总览
| 组件 | 定位 | 核心内容 |
|---|---|---|
| Tools | 智能体可以调用的外部能力 | @tool 装饰器、BaseTool 基类 |
| create_agent | v1.0 创建智能体的标准 API | model、tools、prompt、middleware |
| Middleware | 智能体执行过程中的可插拔钩子系统 | PIIMiddleware、SummarizationMiddleware、HumanInTheLoopMiddleware |
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 | 创建并运行智能体 | model、tools、system_prompt、middleware |
| Middleware | 在执行流程中插入可插拔逻辑 | PIIMiddleware、SummarizationMiddleware、HumanInTheLoopMiddleware、自定义 AgentMiddleware |
create_agent 简化了智能体创建流程,Middleware 则提供了生产级智能体需要的控制力,两者配合是 LangChain v1.0 构建智能体的核心方式。