avatar

命令行小屋

A text-focused Halo theme

  • Ai
  • Linux
  • 游戏
  • 数据库
  • Apache Hadoop
  • Windows
  • 手机
主页 Agent 中间件双雄实战:Tool Selector 与 To-do List 完全指南
文章

Agent 中间件双雄实战:Tool Selector 与 To-do List 完全指南

发表于 最近 更新于 最近
作者 KennethCheng
401~515 分钟 阅读

让 LLM 工具调用既精准又清晰——两个中间件,搞定 Agent 的两大痛点。


📖 写在前面

随着 LangChain Agent 越来越普及,开发者会很快撞上两堵"墙":

  • 工具太多:给 Agent 挂了 20 个工具,模型在调用时一脸懵。
  • 任务太长:跨多步的复杂任务跑下来,用户只看到一行最终回复,根本不知道推进到哪了。

这两堵墙,Tool Selector 中间件 和 To-do List 中间件 正好能分别拆掉。

本文会带你用 10 分钟彻底搞懂这两个中间件:

你会学到对应章节
Tool Selector 的概念与运行逻辑2
Tool Selector 的代码创建与参数2.5
To-do List 的概念与实战调用3
To-do List 的 write_todos 运行机制3.5
二者对比与组合实战4、5

一、问题背景:Agent 的两个典型痛点

工具太多
10+
任务太复杂
多步跨工具
后果
后果
Agent 上线
遇到什么问题?
模型选择困难
用户看不到进度
token 暴涨
调用准确率下降
长任务反馈黑盒
无法中断/调试
  • 痛点 ① 多工具 → 用 LLMToolSelectorMiddleware。
  • 痛点 ② 多步任务 → 用 TodoListMiddleware。
  • 两件事可以同时做,互不冲突。

二、Tool Selector 中间件

2.1 一句话概念

在调用主模型前,利用 LLM 智能筛选相关工具,把"大工具池"压缩成"当前任务够用的小工具集"。

2.2 架构与运行逻辑

任务
这么多工具
我都懵了 🤔
本次调用信息
选取恰当的工具
适合当前任务的
少量工具
👤 用户
🤖 模型
🧠 Tool Selector
(我来帮你筛选一下)
🧰 工具池
Tool Pool

6 步工作流:

  1. 用户提交任务
  2. 模型面对工具池选择困难
  3. 模型把"本次调用信息"发给 Tool Selector
  4. Tool Selector 从工具池筛工具
  5. 返回"少量相关工具"
  6. 模型基于筛选后的工具集继续推理

2.3 适用场景速查

#场景说明
1多工具工具数 ≥ 10,多数与查询无关
2高成本想通过过滤减少 token 消耗
3高精度想通过减少冗余工具提升聚焦度

触发决策树:

是
否
是
否
工具数量?
≥ 10?
✅ 启用 tool_selector
高成本/高精度?
❌ 不用启用

2.4 钩子类型与触发机制

tool_selector 是 before_model 类型的钩子,会在每次对模型调用前,基于当前消息列表触发筛选。

2.5 代码实战

from langchain.agents import create_agent
from langchain.agents.middleware import LLMToolSelectorMiddleware

agent = create_agent(
    model=model,
    tools=[tool_1, tool_2, tool_3, tool_4, ...],   # 完整工具池
    middleware=[
        LLMToolSelectorMiddleware(
            model=model,            # ① 负责选取工具的模型
            max_tools=2,            # ② 选取出来的工具数量
            always_include=["tool_4"],  # ③ 始终被选取的工具名称
        ),
    ],
)

参数说明

参数含义备注
model负责选工具的模型可与主模型相同,也可指定更轻量的模型以省 token
max_tools筛选后保留的工具上限控制最终下发给主模型的数量
always_include强制保留的工具名列表类型是 list[str],不是工具对象

⚠️ 易踩坑

  • tools=[...] 传的是工具对象(callable)。
  • always_include=[...] 传的是字符串名称。
  • 类型别混。

三、To-do List 中间件

3.1 一句话概念

为 Agent 配备"复杂多步骤任务"的规划与追踪能力。

适用场景:

  • ✅ 需要跨工具协同的复杂多步骤任务
  • ✅ 需要进度可见性的长期运行操作

3.2 创建 Agent

from langchain.agents import create_agent
from langchain.agents.middleware import TodoListMiddleware

agent = create_agent(
    model=model,
    tools=[internet_search, calculate],
    middleware=[TodoListMiddleware()],
)

3.3 调用与拿到 todos

res = agent.invoke({
    "messages": ["""你要一步一步的详细规划以下内容再进行回答。
请分析美国加利福尼亚中央谷地的杏仁种植业在未来 30 年面临的气候变化风险,
并估算其经济影响。
"""]
})

print(res["todos"])

3.4 todos 的结构

[
    {'content': 'Research the current climate trends affecting almond farming in California',
     'status':  'completed'},
    {'content': 'Analyze predictive models for climate change impacts up to 2050',
     'status':  'completed'},
    {'content': 'Estimate the percentage decrease in almond production by 2050',
     'status':  'completed'},
    {'content': 'Calculate the economic impact of reduced almond yields on California economy',
     'status':  'completed'},
    {'content': 'Search for the exchange rate for USD to Bitcoin as of November 2025',
     'status':  'completed'},
    {'content': 'Calculate how many Bitcoins could be purchased with the estimated USD loss',
     'status':  'completed'},
]

字段定义:

字段含义
content子任务的具体内容(自然语言)
status当前执行状态,取值为 pending / progress / completed

3.5 运行逻辑:自动注入 write_todos 工具

为 Agent 新增 write_todos 工具,让 Agent 能创建并管理结构化任务清单,跟踪进度、整理任务、为用户提供可视化状态。

状态机

模型开始执行子任务
子任务完成
重新规划
pending
progress
completed

架构图

原任务
调用
调用
生成
子任务
原任务最终回复
👤 用户
🤖 模型
🛠️ 原有工具
📝 write_todos
(自动注入)
📋 子任务清单
① ② ③ ④ ...

5 个关键洞察:

  1. write_todos 由 TodoListMiddleware 自动注入,用户无需手写。
  2. 它与"原有工具"并存,模型可同时调用。
  3. write_todos 内部生成结构化子任务清单。
  4. 子任务回流到模型,作为下一轮推理输入。
  5. 每个子任务带状态,对外可视化。

四、对比速查表

4.1 维度对照

维度LLMToolSelectorMiddlewareTodoListMiddleware
核心目标筛选相关工具规划与追踪多步任务
解决痛点工具太多选花眼长任务一团乱麻
改动方式拦截调用、过滤工具注入新工具 write_todos
钩子时机before_model围绕任务执行过程
典型场景工具 ≥ 10 / 高 token / 高精度跨工具多步 / 长期运行
结果可见性透明res["todos"]
输出 schema工具名+描述[{content, status}, ...]

4.2 一句话差异

透明
可见
Tool Selector
拦截 + 过滤
模型看到的工具变少
Todo List
注入 write_todos
模型多了一个工具可调

🔑 Tool Selector 让模型"看得更少",Todo List 让模型"做得更清晰"。


五、二者组合实战(推荐)

from langchain.agents import create_agent
from langchain.agents.middleware import (
    LLMToolSelectorMiddleware,
    TodoListMiddleware,
)

agent = create_agent(
    model=model,
    tools=[search, calc, db, mail, doc, ...],  # 大量工具
    middleware=[
        LLMToolSelectorMiddleware(   # ① 先按 query 筛工具
            model=model,
            max_tools=3,
            always_include=["search"],
        ),
        TodoListMiddleware(),        # ② 再做多步规划与追踪
    ],
)

组合后的请求流

🤖 模型📝 Todo List🧠 Tool Selector🤖 Agent👤 用户🤖 模型📝 Todo List🧠 Tool Selector🤖 Agent👤 用户loop[每一步]提交复杂多步任务1. 触发工具筛选2. 注入少量相关工具3. 调用 write_todos4. 注入子任务清单按 todos 推进5. 返回最终回复 + todos 状态

六、一页思维导图(复习专用)

Agent 中间件 两大杀器Tool Selector概念调用主模型前智能筛工具钩子before_model 类型关键参数modelmax_toolsalways_include适用场景多工具高成本高精度Todo List概念复杂多步任务的规划与追踪创建方式TodoListMiddleware调用结果res 的 todoscontent 加 status运行逻辑注入 write_todospending progresscompleted

七、写在最后

如果你正在搭建生产级 LangChain Agent,强烈建议把这两个中间件默认打开:

  • 🧠 Tool Selector 让你不惧工具膨胀。
  • 📋 Todo List 让你不惧长任务。

一句话总结全文:

Tool Selector 让 Agent 选得准,Todo List 让 Agent 想得清。两者组合,攻守兼备。


📌 附录 · 一行速记表

关注点Tool SelectorTodo List
干嘛用筛选工具规划任务
怎么实现拦截调用注入工具
看得见吗透明看 res["todos"]
啥时候用工具 ≥ 10任务 ≥ 3 步

如果觉得本文有帮助,欢迎 点赞 + 收藏 + 关注,我们下期再见 👋

Ai, LangChain
LangChain Ai Python
许可协议:  CC BY 4.0
分享

相关文章

8月 1, 2026

Agent 中间件双雄实战:Tool Selector 与 To-do List 完全指南

让 LLM 工具调用既精准又清晰——两个中间件,搞定 Agent 的两大痛点。 📖 写在前面 随着 LangChain Agent 越来越普及,开发者会很快撞上两堵"墙": 工具太多:给 Agent 挂了 20 个工具,模型在调用时一脸懵。 任务太长:跨多步的复杂任务跑下来,用户只看到一行最终回复

8月 1, 2026

AI Agent 的「记忆压缩术」:LangChain Summarization 中间件完全指南

当 Agent 对话越来越长,模型开始"记不住"早先聊过什么——这时候,Summarization 中间件就是你的救命稻草。 本文将带你从概念、创建、触发流程、规则制定到参数调优,彻底掌握 LangChain Summarization 中间件。 📑 目录 什么是 Summarization 中间

7月 31, 2026

Human-in-the-Loop 实战指南:在 LangChain 中为 Agent 装上"决策刹车"

随着 LLM Agent 越来越"敢动手",我们开始需要一种机制 —— 让 AI 在做关键动作前停下来,让人看一眼,再由人来决定放行、修改还是拒绝。 这就是 Human-in-the-Loop (HITL):AI 不再是"自动执行",而是"提建议 → 被审核 → 必要时修正"。 本文带你从概念到 L

下一篇

上一篇

AI Agent 的「记忆压缩术」:LangChain Summarization 中间件完全指南

最近更新

  • Agent 中间件双雄实战:Tool Selector 与 To-do List 完全指南
  • AI Agent 的「记忆压缩术」:LangChain Summarization 中间件完全指南
  • Human-in-the-Loop 实战指南:在 LangChain 中为 Agent 装上"决策刹车"
  • LangChain Agent 中间件完全指南:从拦截器设计到自定义钩子实战
  • 一文搞懂 LangChain Message:从 4 种消息类型到 Agent 状态流转

热门标签

samsung WireGuard Chevereto docker 破解 llama LangChain Ai Python Gemma

目录

©2026 命令行小屋. 保留部分权利。

使用 Halo 主题 Chirpy