Sunday 的面试指南

LangChain Middleware 原理:Hook、请求拦截与结果校验

《Agent 大模型 0 到 1 系统课》 · 程序员 Sunday

你正在阅读本节的免费试读。完整课程 ¥499,可在文末添加作者微信购买。

上一小节,咱们通过 Runtime Context 把当前用户和 tenantId 传进了 Agent。

Tool 查询任务时,只会读取当前租户的数据。

这解决的是:Agent 应该以谁的身份查询数据。

但是,Agent 真正运行起来以后,执行过程还得有监管才可以。

比如,普通开发者能不能调用包含敏感信息的 Tool?Tool 返回的数据不完整,还能不能继续交给模型?模型反复调用 Tool 时,最多允许执行多少次?

这些事情不能只写进 Prompt,必须由应用程序中的代码真正执行。

可这些控制代码应该写在哪里呢??

这就得用到这一小节要讲的东西了~~

LangChain 提供了一个专门的扩展机制:Middleware,也就是 中间件。

LangChain Middleware 原理:Hook、请求拦截与结果校验 配图 1

咱们可以先把 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 系统课》,
继续阅读本节剩余内容与后续课程。

扫码添加作者微信,备注「Agent 课程」

添加作者微信 · 购买完整课程

解锁完整课程 ¥499

《Agent 大模型 0 到 1 系统课》
扫码添加微信,备注「Agent 课程」,购买后由 Sunday 提供完整内容的学习方式。

扫码添加作者微信 LGD_Sunday,购买 499 元 Agent 课程

微信昵称:LGD_Sunday
手机上可长按保存二维码,再用微信扫一扫识别。

保存微信二维码