LangChain 中间件系统(Middleware)
中间件系统(Middleware)
中间件是一种流程控制机制,用于在智能体执行过程中拦截、修改或增强请求与响应的处理逻辑,而无需修改核心Agent或工具的代码
中间件在每个步骤之前和之后都会暴露沟子(函数)
中间件的作用是对智能体的每一步工作进行控制和自定义的执行
作用场景:
- 日志记录、分析、调试
- 转换提示词、工具选择
- 重试、备用、提前终止等逻辑控制
- 安全防护、个人身份检测等

自定义中间件
@wrap_tool_call
将要调用工具时触发,增强工具调用过程,它提供了完整的执行跟踪、异常处理和上下文注入功能。
@wrap_tool_call
def monitor_tool(
# 请求的数据封装
request: ToolCallRequest,
# 执行的函数本身
handler: Callable[[ToolCallRequest], ToolMessage | Command],
) -> ToolMessage | Command:
"""
完成工具执行的监控
:return:
"""
logger.info(f"[tool monitor]执行工具:{request.tool_call['name']}")
logger.info(f"[tool monitor]传入参数:{request.tool_call['args']}")
try:
result = handler(request)
logger.info(f"[tool monitor]工具{request.tool_call['name']}调用成功")
# 注入字段值
if request.tool_call['name'] == "fill_context_for_report":
request.runtime.context["report"] = True
return result
except Exception as e:
logger.error(f"[tool monitor]工具{request.tool_call['name']}调用失败,原因:{str(e)}")
raise e
@before_model
模型调用前触发
如有模型替换等需求,可以在这里执行
@before_model
def log_before_model(
# 整个Agent智能体中的状态记录
state: AgentState,
# 记录了整个执行过程中的上下文信息
runtime: Runtime,
):
"""
在模型执行前输出日志
:return:
"""
logger.info(f"[log_before_model]即将调用模型,带有{len(state['messages'])}条消息")
logger.debug(f"[log_before_model]{type(state['messages'][-1]).__name__} | {state['messages'][-1].content}")
return None
@dynamic_prompt
提示词生成前触发
@dynamic_prompt # 每次在生成提示词之前,调用此函数
def report_prompt_switch(
request: ModelRequest
):
"""
动态切换提示词
:return:
"""
is_report = request.runtime.context.get("report", False)
# 是报告生成场景, 返回报告生成提示词
if is_report:
return load_report_prompt()
return load_system_prompt()
LangChain内置中间件
SummarizationMiddleware 总结摘要中间件
当会会次数上限时,自动汇总对话历史记录
适合以下情况:
- 持续时间过长的对话超出了上下文窗口
- 多轮对话,历史悠久
- 在需要保留完整对话上下文的应用中
from langchain.agents import middleware, create_agent
from langchain.agents.middleware import SummarizationMiddleware
from langchain_community.chat_models import ChatTongyi
model = ChatTongyi(model="qwen3-max")
agent = create_agent(
model=model,
tools=[],
middleware=[
SummarizationMiddleware(
model=model,
# 4000个Token会触发摘要总结
trigger=('tokens', 4000),
keep=('messages_v1', 20),
summary_prompt="自定义摘要提示词" # 可选
)
]
)
人机交互中间件 Human In The Loop
允许在代理工具调用中添加人工监督。 当模型提出可能需要审核的操作(例如,写入文件或执行SQL等)时,中间件可以暂停执行并等待决策。
它通过检查每个工具调用是否符合可配置的策略来实现这一点,如果需要干预,中间件会发出中断以暂停执行
|决策类型|描述|示例用例|
|---|---|---|1
|approve|该行动按原样批准并执行,未作任何更改|请按原样发送电子邮件草稿|
|edit|工具调用经过修改后执行|发送电子邮件前请更改收件人|
|regect|工具调用被拒绝,并在对话中国添加解释|驳回邮件草稿并解释如何修改|

浙公网安备 33010602011771号