“用LangChain开发Agent明明不需要人工编排,为什么还要折腾MCP?”这是我在2025年最大的技术误判。 历经3个月、为12个项目接入MCP后,我想用真实的经历,回答开发者最尖锐的三个问题:
- 为什么Function Call的“动态规划”是伪命题?
- LangChain的“零编排”幻觉从何而来?
- 不改一行旧代码,如何让MCP工具在本地生产环境跑起来?
一、撕开Function Call的“动态规划”假象
1.1 动态?不,你只是预定义了所有可能性
经典场景:用户问“帮我订机票并安排接机”,看似模型动态调用了“机票预订”和“租车”工具,实际开发流程如下:
# 开发者必须预定义所有可能被调用的工具
functions = [
{
"name": "book_flight",
"description": "预订机票,需用户提供日期、城市",
"parameters": {...}
},
{
"name": "rent_car",
"description": "预订接机车辆,需用户提供时间和地点",
"parameters": {...}
}
]
# 模型只能从这两个工具中选
response = openai.ChatCompletion.create(..., functions=functions)
真相:模型的选择范围被开发者硬编码限制,真正的动态发现新工具?不存在的。
1.2 性能灾难:工具数量与响应延迟的正相关
压测数据(GPT-4-32K,工具数量 vs 平均响应时间):
工具数量 | 10 | 50 | 200 |
---|---|---|---|
延迟(ms) | 1200 | 3400 | 9800 |
结论:当工具超过50个,Function Call因需要将全部描述塞入上下文,导致延迟飙升。
MCP的解法:协议层工具发现(按需查询):
# MCP动态工具发现(伪代码)
def handle_query(user_input):
# 第一步:模型决定需要什么工具类型
intent = model.detect_intent(user_input)
… 阅读全文