AIAgent-langchain新版本中的钩子函数详解
·
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])
核心差异速览

更多推荐


所有评论(0)