03 langchain 笔记

3.1 AgentMiddleware中间件

LangChain的控制逻辑,优点类似一个洋葱模型,用户可以根据需要包装添加需要的逻辑层; 在create的时候传入middlewares就相当于为代码添加了钩子(其逻辑和fastapi的Middleware中间件优点类似); LangChain 的 AgentMiddleware 提供了两大类钩子,用于在 Agent 执行流中进行拦截和干预。

3.1.1 Node-style Hooks (节点级钩子)

按顺序在执行点触发,适合日志、校验和状态更新。

  • before_agent: Agent 开始执行前触发(每次调用执行一次)。

  • before_model: 每次调用 LLM 前触发。

  • after_model: 每次 LLM 返回响应后触发。

  • after_agent: Agent 完成所有执行后触发(每次调用执行一次)。

3.1.2. Wrap-style Hooks (包裹级钩子)

围绕特定调用执行,拥有对流程的完全控制权(如重试、短路、转换)。

  • wrap_model_call: 围绕 LLM 模型调用。

  • wrap_tool_call: 围绕工具调用(Tool Call)。

备注

状态更新机制对比 Node-style Hooks: 直接返回一个 dict,更新会自动合并到 Agent 状态中。 Wrap-style Hooks: Model Call: 返回 ExtendedModelResponse(包含 Command)来同步更新状态。 Tool Call: 直接返回 Command 来更新状态。 使用建议 简单场景: 使用装饰器(如 @before_model)实现单钩子中间件。 复杂场景: 继承 AgentMiddleware 类,在一个类中组合多个钩子,或定义同步/异步实现。