LangChain 中间件系统(Middleware)

中间件系统(Middleware)

中间件是一种流程控制机制,用于在智能体执行过程中拦截、修改或增强请求与响应的处理逻辑,而无需修改核心Agent或工具的代码

中间件在每个步骤之前和之后都会暴露沟子(函数)

中间件的作用是对智能体的每一步工作进行控制和自定义的执行
作用场景:

  • 日志记录、分析、调试
  • 转换提示词、工具选择
  • 重试、备用、提前终止等逻辑控制
  • 安全防护、个人身份检测等

image

自定义中间件

@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|工具调用被拒绝,并在对话中国添加解释|驳回邮件草稿并解释如何修改|

posted @ 2026-03-12 11:25  风陵南  阅读(167)  评论(0)    收藏  举报