标签归档:MCP

MCP与Function Call的共生手册

“用LangChain开发Agent明明不需要人工编排,为什么还要折腾MCP?”这是我在2025年最大的技术误判。 历经3个月、为12个项目接入MCP后,我想用真实的经历,回答开发者最尖锐的三个问题:

  1. 为什么Function Call的“动态规划”是伪命题?
  2. LangChain的“零编排”幻觉从何而来?
  3. 不改一行旧代码,如何让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 平均响应时间):

工具数量1050200
延迟(ms)120034009800

结论:当工具超过50个,Function Call因需要将全部描述塞入上下文,导致延迟飙升。

MCP的解法:协议层工具发现(按需查询):

# MCP动态工具发现(伪代码)
def handle_query(user_input):
    # 第一步:模型决定需要什么工具类型
    intent = model.detect_intent(user_input)
阅读全文