🎯 课程主题
LLMToolEmulator 用于在工具尚未开发完成时模拟工具的执行结果,方便提前测试 Agent 的工具调用流程。
📝 核心知识点
1. LLMToolEmulator 概念
- 概念说明:当工具函数体尚未实现(仅有函数签名和 docstring),LLMToolEmulator 使用一个内部模型根据工具的描述和参数来模拟生成该工具的返回结果,从而验证整个调用链路。
- 关键细节:
- 类名中没有
Middleware后缀,但它本质上是一个中间件。 - 参数
model:用于模拟工具执行的内部模型。 - 工作流程:外部主模型识别需要调用哪个工具 → 内部模型模拟该工具的执行结果 → 外部主模型基于模拟结果生成最终回答。
- 类名中没有
2. 适用场景
- 概念说明:适用场景包括工具尚在开发中、依赖的 API 密钥未就绪、或只想验证工具选型逻辑是否正确。
- 关键细节:
- 工具只需有函数名 + 类型注解 + docstring即可参与模拟。
- 内部模型会根据 docstring 推断工具的预期行为并生成合理的模拟数据。
🏗️ 架构与工作流
用户问题 → Agent(model_out)
↓
识别需调用 get_weather
↓
LLMToolEmulator(model_in)介入
↓
内部模型根据 docstring 模拟工具执行
(生成包含温度、天气状况等的模拟结果)
↓
模拟结果返回给外层模型
↓
外层模型整合输出最终回答
💻 代码实战
from langchain.agents import create_agent
from langchain.agents.middleware import LLMToolEmulator
from langchain.chat_models import init_chat_model
# 外层主模型 + 内层模拟模型
model_out = init_chat_model("deepseek-v4-pro") # Agent 主模型
model_in = init_chat_model("deepseek-v4-mini") # 工具模拟模型
# 工具:仅有函数签名和 docstring,函数体未实现
def get_weather(city: str) -> str:
"""
查询指定城市的实时天气信息,包括温度、湿度、天气状况和风力等级。
Args:
city: 城市名称
Returns:
str: 包含温度、湿度、天气状况、风力等级的天气描述
"""
# 尚未实现的具体逻辑...
pass
# 创建 LLMToolEmulator 中间件
tool_emulator = LLMToolEmulator(model=model_in)
agent = create_agent(
model=model_out,
tools=[get_weather],
middleware=[tool_emulator]
)
result = agent.invoke({"messages": [{"role": "user", "content": "北京天气如何?"}]})
print(result["messages"][-1].content)
# 输出(示例):
# 北京当前天气:晴转多云,温度 22°C,湿度 45%,风力 3 级,适合户外活动。
# 注意:模拟结果由内部模型生成,并非真实数据
⚠️ 常见问题与避坑指南
- 模拟结果完全由大模型"编造",不具备真实性,仅用于流程验证,不可用于生产环境。
- 工具函数的 docstring 质量直接影响模拟效果,描述越详细,模拟结果越合理。
- 内部模型建议使用轻量模型以降低成本,因为模拟本身不需要高精度。
💡 个人总结与延伸
LLMToolEmulator 是典型的"声明式开发 + 模拟测试"模式在 AI Agent 领域的应用。类比前端开发中的 Mock Service Worker(MSW),它让开发者能在工具依赖未就绪时完成端到端流程测试,大幅提升开发效率。配合 LLMToolSelectorMiddleware 使用,还能提前验证工具筛选逻辑的正确性。