8.3 工具调用与编排生态
📖 本章目标
- 了解 2026 年工具调用生态的全景
- 掌握 LiteLLM 等关键工具的使用
- 学会构建企业级工具编排系统
工具调用生态概览
第 3.2 章已学习了基础的
@tool装饰器和bind_tools(),本章将这些技能放到更大的生态中。
工具调用生态分层:
┌─────────────────────────────────────────────────────────┐
│ 应用层 │
│ LangChain Tools / Toolkit / OpenFunction │
├─────────────────────────────────────────────────────────┤
│ 编排层 │
│ LangGraph (条件路由) / DeerFlow (事件驱动) │
├─────────────────────────────────────────────────────────┤
│ 调用层 │
│ Functionary (精度优化) / ToolFormer (自动发现) │
├─────────────────────────────────────────────────────────┤
│ 接入层 │
│ LiteLLM (多模型统一) / LangChain LLM (单模型) │
├─────────────────────────────────────────────────────────┤
│ 模型层 │
│ OpenAI / Anthropic / Google / Ollama / vLLM │
└─────────────────────────────────────────────────────────┘
核心工具项目
1. LangChain Tools — 700+ 开箱即用工具
你已在 3.2 章使用过,这里是生态全貌。
内置工具类别:
| 类别 | 示例工具 | 数量 |
|---|---|---|
| 🔍 搜索 | DuckDuckGoSearch, TavilySearch, GoogleSearch | 20+ |
| 📊 数据 | PythonREPL, SQLDatabase, CSVLoader | 30+ |
| 🌐 网络 | RequestsGet, URLs, WebBrowser | 15+ |
| 📝 文档 | DocLoader, PDFParser, TextSplitter | 25+ |
| 📧 办公 | Gmail, Slack, Notion, Jira | 40+ |
| 🧮 计算 | Calculator, WolframAlpha | 10+ |
| 🖼️ 图像 | DALL-E, StableDiffusion, ImageCaption | 15+ |
| 🎵 媒体 | YouTube, Spotify, TTS, STT | 20+ |
# 组合使用多个工具
from langchain_community.tools import DuckDuckGoSearchRun, YouTubeSearchTool
from langchain_core.tools import tool
@tool
def combined_search(query: str) -> str:
"""同时搜索网页和视频"""
web = DuckDuckGoSearchRun().run(query)
video = YouTubeSearchTool().run(query)
return f"网页结果:{web}\n视频结果:{video}"
2. LiteLLM — 多模型统一接入
解决的问题: 不同模型提供商的 API 格式不同,切换模型需要改代码。
核心能力:
- 25+ 模型支持:OpenAI、Anthropic、Google、Ollama、vLLM 等
- 统一接口:所有模型用同一套 API
- 负载均衡:自动在多个模型间分发请求
- 成本追踪:自动记录 Token 消耗
- 零供应商锁定:随时切换模型提供商
# LiteLLM 统一接口
from litellm import completion
# 使用 OpenAI
response = completion(model="gpt-4o", messages=[{"role": "user", "content": "Hello"}])
# 切换到 Claude - 只需改 model 名
response = completion(model="claude-3-5-sonnet-20241022", messages=[{"role": "user", "content": "Hello"}])
# 切换到本地模型
response = completion(model="ollama/llama3.2", messages=[{"role": "user", "content": "Hello"}])
# 负载均衡
response = completion(
model="gpt-4o",
messages=[...],
fallbacks=["claude-3-5-sonnet", "gemini-1.5-pro"],
)
在 LangChain 中使用 LiteLLM:
from langchain_community.chat_models import ChatLiteLLM
llm = ChatLiteLLM(model="gpt-4o", temperature=0.7)
# 之后的用法和 ChatOpenAI 完全一样
3. Functionary — 函数调用精度优化
专注解决 Agent 调用工具时的精度问题(选错工具、参数错误)。
核心特性:
- 参数验证:自动检查参数类型和合法性
- 自动补全:智能填充缺失参数
- 工具选择优化:减少工具误选率
from functionary import Functionary
agent = Functionary(model="gpt-4o", tools=[search, calculator, ...])
# Functionary 自动处理:
# 1. 工具选择准确性校验
# 2. 参数格式验证
# 3. 错误自动重试
result = agent.run("查询2025年GDP并计算增长率")
4. OpenFunction — 开源工具市场
社区驱动的工具发现和共享平台。
核心能力:
- 工具市场:上传、发现、评分工具
- 版本管理:工具版本追踪
- 兼容性检查:自动检查工具与模型的兼容性
工具编排模式
模式一:顺序编排
工具A → 工具B → 工具C → 输出
最简单的模式,前一个工具的输出是后一个工具的输入。适合数据处理流水线。
模式二:条件路由(你已在 LangGraph 中学过)
┌── 条件成立 ──▶ 工具B
工具A ──┤
└── 条件不成立 ─▶ 工具C
Agent 根据当前状态动态选择下一步调用的工具。这是 LangGraph 的核心能力。
模式三:并行编排
┌── 工具A ──┐
输入 ──▶ ──┼── 工具B ──┼── ▶ 汇总 ──▶ 输出
└── 工具C ──┘
多个工具同时执行,结果汇总。适合需要多源信息的任务。
模式四:事件驱动(DeerFlow 模式)
事件 → 触发规则 → 匹配工具 → 执行 → 产生新事件 → ...
工具通过事件自动触发,形成响应式系统。适合监控、告警等场景。
企业级工具治理
| 需求 | 解决方案 |
|---|---|
| 团队协作 | Toolkit:多用户共享工具包 |
| 权限控制 | Toolkit:角色/工具级别权限 |
| 版本管理 | Toolkit:工具版本回溯 |
| 审计日志 | Toolkit:完整调用记录 |
| 成本控制 | LiteLLM:Token 追踪 + 预算限制 |
| 高可用 | LiteLLM:自动故障转移 |
# 企业级工具治理示例
from toolkit import ToolkitManager
from litellm import cost_tracking
@cost_tracking
def enterprise_tool_call(tool_name: str, args: dict):
"""企业级工具调用(含审计和成本追踪)"""
toolkit = ToolkitManager(team_id="engineering")
# 权限检查
if not toolkit.check_permission(user="dev_1", tool=tool_name):
return "权限不足"
# 调用并记录
result = toolkit.invoke(tool_name, args)
toolkit.log_call(user="dev_1", tool=tool_name, args=args, result=result)
return result
本章小结
| 要点 | 说明 |
|---|---|
| 🛠️ | LangChain Tools 700+ 工具是最丰富的生态 |
| 🔌 | LiteLLM 解决多模型接入的碎片化问题 |
| 🎯 | Functionary 提升工具调用精度 |
| 📦 | OpenFunction 提供工具发现与共享 |
| 🏢 | 企业级使用需要 Toolkit 治理 |
📝 课后练习
- 实践题:用 LiteLLM 替换项目中的 ChatOpenAI,测试切换模型
- 集成题:搜索 OpenFunction 市场,找到 3 个有用的工具并集成到项目中
- 设计题:为一个电商客服场景设计工具调用流程(顺序/条件/并行混合)