LangChain Middleware 原理:Hook、请求拦截与结果校验
《Agent 大模型 0 到 1 系统课》 · 程序员 Sunday
你正在阅读本节的免费试读。完整课程 ¥499,可在文末添加作者微信购买。
上一小节,咱们通过 Runtime Context 把当前用户和 tenantId 传进了 Agent。
Tool 查询任务时,只会读取当前租户的数据。
这解决的是:Agent 应该以谁的身份查询数据。
但是,Agent 真正运行起来以后,执行过程还得有监管才可以。
比如,普通开发者能不能调用包含敏感信息的 Tool?Tool 返回的数据不完整,还能不能继续交给模型?模型反复调用 Tool 时,最多允许执行多少次?
这些事情不能只写进 Prompt,必须由应用程序中的代码真正执行。
可这些控制代码应该写在哪里呢??
这就得用到这一小节要讲的东西了~~
LangChain 提供了一个专门的扩展机制:Middleware,也就是 中间件。
咱们可以先把 Middleware 理解成 Agent 执行过程中的 “中间的检查站”,比如说:
- 模型调用前,检查调用预算
- Tool 调用前,检查当前用户的权限
- Tool 返回后,校验结果是否有效
- 调用临时失败后,决定是否自动重试
咱们不用修改 createAgent() 内部的 Agent Loop,只需要把对应的 Middleware 挂到 Agent 上,就可以在这些关键位置加入控制逻辑。
这一小节,咱们就继续改造上一节的研发任务风险分析 Agent,为它加入权限、预算、结果校验和失败恢复。
Middleware 到底加在了哪里
本节代码在 /Code/Node/第五章/06-langchain-middleware。
项目安装和运行过程就不重复说了,说了好多次了,别忘了 .env 文件。
然后,咱们先从 Agent 的创建入口开始看。
打开 middleware-agent.js,找到 createRiskAgent():
/**
* 创建研发任务交付风险分析 Agent。
*/
function createRiskAgent({ modelRunLimit = 5, toolRunLimit = 4 } = {}) {
return createAgent({
...
middleware: [
/**
* 根据当前 Runtime Context 对 Tool 权限进行过滤或控制。
*
* 例如不同用户、角色或租户可能只能看到部分 Tool,
* Agent 只能调用当前实际可见的能力。
*/
permissionMiddleware,
/**
* 限制单次 Agent Run 中模型调用次数。
*
* 超过 modelRunLimit 后直接抛出错误,
* 防止 Agent 因反复推理而无限消耗模型调用次数。
*/
modelCallLimitMiddleware({
runLimit: modelRunLimit,
exitBehavior: 'error'
}),
/**
* 限制单次 Agent Run 中 Tool 调用次数。
*
* 超过 toolRunLimit 后直接终止,
* 防止 Agent 出现工具调用死循环或无效重复调用。
*/
toolCallLimitMiddleware({
runLimit: toolRunLimit,
exitBehavior: 'error'
}),
/**
* 为指定 Tool 增加失败重试能力。
*
* Retry 必须包在 Validation 外层。
* Validation 抛出的可重试错误,才能回到 Retry 再执行一次 Tool。
*/
toolRetryMiddleware({
// 这里只对测试报告查询 Tool 启用重试。
tools: ['get_latest_test_report'],
// 首次调用失败后最多额外重试 1 次。
maxRetries: 1,
// 当前示例为了方便演示,不等待直接重试。
initialDelayMs: 0,
// 不使用指数退避。
backoffFactor: 0,
// 不增加随机抖动时间。
jitter: false,本节试读已结束
继续学习,解锁完整课程
购买《Agent 大模型 0 到 1 系统课》,
继续阅读本节剩余内容与后续课程。
