一、核心定位
LangChain 内置中间件是Agent 的通用增强插件 ,不用改核心逻辑,就能给智能体加上下文管理、安全管控、容错重试、成本限制、人工审核等能力,适配所有 LLM ,开箱即用。
二、高频中间件速览(通俗版)
| 中间件 | 一句话作用 | 核心场景 |
|---|---|---|
| Summarization | 快超 token 时自动压缩历史 | 长对话、多轮交互 |
| Human-in-the-loop | 工具调用前要人审批 | 金融、写库、发邮件等高风险操作 |
| Model Call Limit | 限制模型调用次数 | 防死循环、控成本 |
| Tool Call Limit | 限制工具调用次数 | 防高频调用外部 API |
| Model Fallback | 主模型挂了自动切备用 | 提升服务稳定性 |
| PII Detection | 识别并脱敏隐私信息 | 合规、日志清洗 |
| Model Retry | 模型调用失败自动重试 | 网络波动、限流场景 |
| Tool Retry | 工具调用失败自动重试 | 第三方接口不稳定 |
| LLM Tool Selector | 先选有用工具再跑主模型 | 工具多、省 token、提精度 |
| Context Editing | 清理旧工具结果保最新 | 长对话控上下文大小 |
三、核心中间件 + 优化代码(直接复制用)
1. 上下文压缩:SummarizationMiddleware
-
作用:快超 token 自动总结旧消息,保最近对话
-
优化点:用轻量模型做摘要,触发阈值合理,保留最近消息
from langchain.agents import create_agent
from langchain.agents.middleware import SummarizationMiddlewareagent = create_agent(
model="gpt-4.1",
tools=[],
middleware=[
SummarizationMiddleware(
model="gpt-4.1-mini", # 轻量模型降本
trigger=("tokens", 3500), # 触达阈值
keep=("messages", 15), # 保留最新15条
trim_tokens_to_summarize=3500,
)
],
)
2. 人工审核:HumanInTheLoopMiddleware
-
作用:敏感工具必须人同意 / 编辑 / 拒绝
-
优化点:只对高危工具开启,配检查点存状态
from langchain.agents import create_agent
from langchain.agents.middleware import HumanInTheLoopMiddleware
from langgraph.checkpoint.memory import InMemorySaver模拟发邮件工具(高危)
def send_email(recipient: str, subject: str, body: str) -> str:
return f"发送给 {recipient} 的邮件已发出"agent = create_agent(
model="gpt-4.1",
tools=[send_email],
checkpointer=InMemorySaver(), # 必须存状态
middleware=[
HumanInTheLoopMiddleware(
interrupt_on={
"send_email": {"allowed_decisions": ["approve", "edit", "reject"]}
}
)
],
)
3. 调用次数限制:ModelCallLimitMiddleware
-
作用:防无限循环、控 API 成本
-
优化点:单轮 + 会话双限制,超量优雅结束
from langchain.agents import create_agent
from langchain.agents.middleware import ModelCallLimitMiddleware
from langgraph.checkpoint.memory import InMemorySaveragent = create_agent(
model="gpt-4.1",
checkpointer=InMemorySaver(),
middleware=[
ModelCallLimitMiddleware(
thread_limit=15, # 整个会话最大调用
run_limit=5, # 单次请求最大调用
exit_behavior="end", # 超量优雅终止
)
],
)
4. 模型容错:ModelFallbackMiddleware
-
作用:主模型不可用自动切备用
-
优化点:按优先级排序,主→轻量→其他厂商
from langchain.agents import create_agent
from langchain.agents.middleware import ModelFallbackMiddlewareagent = create_agent(
model="gpt-4.1",
middleware=[
ModelFallbackMiddleware(
"gpt-4.1-mini", # 第一备用
"claude-3-5-sonnet-20241022", # 第二备用
)
],
)
5. 隐私脱敏:PIIMiddleware
-
作用:自动识别邮箱、身份证、银行卡等并脱敏
-
优化点:支持自定义正则,输入输出双检测
from langchain.agents import create_agent
from langchain.agents.middleware import PIIMiddleware
import reagent = create_agent(
model="gpt-4.1",
middleware=[
# 内置类型:邮箱脱敏
PIIMiddleware("email", strategy="redact", apply_to_input=True),
# 自定义:API Key 拦截
PIIMiddleware(
"api_key",
detector=r"sk-[a-zA-Z0-9]{32}",
strategy="block",
),
],
)
6. 失败重试:ModelRetryMiddleware
-
作用:模型调用失败指数退避重试
-
优化点:只重试网络 / 限流异常,防雪崩
from langchain.agents import create_agent
from langchain.agents.middleware import ModelRetryMiddlewareagent = create_agent(
model="gpt-4.1",
middleware=[
ModelRetryMiddleware(
max_retries=3,
backoff_factor=2,
initial_delay=1,
max_delay=30,
jitter=True, # 随机抖动防扎堆
)
],
)
7. 工具筛选:LLMToolSelectorMiddleware
-
作用:工具多时先筛有用的,降 token、提准确率
-
优化点:限定最大工具数,必选工具固定
from langchain.agents import create_agent
from langchain.agents.middleware import LLMToolSelectorMiddlewareagent = create_agent(
model="gpt-4.1",
tools=["search", "calc", "weather", "email", "db"],
middleware=[
LLMToolSelectorMiddleware(
model="gpt-4.1-mini",
max_tools=3, # 最多选3个
always_include=["search"], # 必带搜索
)
],
)
四、生产最佳实践
- 组合使用:上下文压缩 + 次数限制 + 重试 + 脱敏,一套稳如狗
- 分层防护:普通工具不审核,高危工具强制人审
- 成本控制:摘要 / 工具筛选用轻量模型,主模型用强模型
- 异常兜底:模型回退 + 重试双重保障,不崩服务
五、快速集成模板(万能组合)
from langchain.agents import create_agent
from langchain.agents.middleware import (
SummarizationMiddleware,
ModelCallLimitMiddleware,
ModelRetryMiddleware,
PIIMiddleware,
)
from langgraph.checkpoint.memory import InMemorySaver
# 生产级 Agent 中间件套餐
agent = create_agent(
model="gpt-4.1",
tools=[],
checkpointer=InMemorySaver(),
middleware=[
# 1. 隐私脱敏
PIIMiddleware("email", strategy="redact"),
# 2. 上下文压缩
SummarizationMiddleware(model="gpt-4.1-mini", trigger=("tokens", 3500), keep=("messages", 15)),
# 3. 调用次数限制
ModelCallLimitMiddleware(thread_limit=15, run_limit=5),
# 4. 模型重试
ModelRetryMiddleware(max_retries=3),
],
)