Langchain新版本(V1.0)

钩子函数分为两个体系:
Callback(回调): 用于纯粹的观察与日志
Middleware(中间件): 用于深度的控制与修改

体系一:Callbacks(回调) - 面向观测

这是新版本中保留并延续的经典机制,继承自 BaseCallbackHandler,采用事件驱动和只读监听模式,无法修改请求或响应,非常适合用于日志记录、指标监控、Token统计和流式输出

常用钩子:

模型调用:

  • on_llm_start:
  • on_llm_end:
  • on_llm_error:
  • on_llm_new_token(流式):

链/智能体:

  • on_chain_start:
  • on_agent_action:
  • on_agent_finish:

工具调用:

  • on_tool_start:
  • on_tool_end:

代码示例:

from langchain_core.callbacks import BaseCallbackHandler

class MyLoggingHandler(BaseCallbackHandler):
	async def on_llm_start(self, serialized, prompts, **kwargs):
		print(f"模型调用开始,提示词: {prompts}")
	async def on_llm_end(self, response, **kwargs):
		print(f"模型调用结束,生成内容:{response.generations[0][0].text}")

体系二:Middleware(中间件) - 面向控制

这是LangChain 1.0 引入的全新核心功能,通过包装(wrap)模型或工具调用,可以修改请求、改变行为、控制流程,甚至实现动态模型路由、重试、限流等生产级特性。

常用钩子:

模型相关:

  • before_model:
  • modify_model_request:
  • after_model:
  • wrap_model_call:

工具相关:

  • wrap_tool_call

预置中间件:

框架提供了一系列开箱即用的中间件,可直接用于生产环境:

  • SummarizationMiddleware:在上下文窗口过大时自动摘要对话历史。

  • HumanInTheLoopMiddleware:在高风险工具调用(如发送邮件、数据库写入)前请求人工审批。

  • ModelFallbackMiddleware:当主模型失败时自动切换到备用模型。

  • ToolCallLimitMiddleware:限制特定工具或所有工具的调用次数,防止失控。

  • PIIMiddleware:检测并脱敏个人身份信息。

代码示例(动态切换模型):

from langchain.agents.middleware import wrap_model_call

@wrap_model_call
def dynamic_model_router(request, handler):
    # 检查用户消息中是否包含图片
    if any(msg.type == "image_url" for msg in request.messages):
        request.model = vl_model  # 切换至视觉模型
    else:
        request.model = chat_model # 使用普通对话模型
    return handler(request)

agent = create_agent(model=chat_model, tools=[...], middleware=[dynamic_model_router])

核心差异速览

在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐