Function Call与MCP:给AI插上连接现实的翅膀

Function Call与MCP:给AI插上连接现实的翅膀

想象一下,如果AI只能依靠训练时学到的知识,就像一个与世隔绝的学者,知识再渊博也无法了解外面的世界正在发生什么。这就是早期大模型的困境------直到Function Call和MCP的出现。

从"知道一切"到"能获取一切"

当我们问AI"今天北京天气怎么样?"时,我们希望得到的是此时此刻的真实天气,而不是模型训练时学到的历史数据。这就是传统大模型的局限性:

  • 🤖 LLM是提前训练好的,不了解新知识或新服务
  • 🔒 缺乏足够的上下文时容易"胡说八道"(hallucination)
  • ⏰ 无法获取实时信息,如天气、新闻、股票等

Function CallMCP就是为了解决这些问题而生的技术,它们让AI能够突破自身限制,与外部世界连接。

Function Call:AI的"第一次触网"

什么是Function Call?

Function Call是一种让大语言模型能够调用外部函数或API的技术。它就像是给AI装上了一双可以操作外部世界的手:

graph LR A[用户提问] --> B[LLM分析需求] B --> C{需要外部工具?} C -->|是| D[生成函数调用请求] C -->|否| E[直接回答] D --> F[执行外部函数] F --> G[获取结果] G --> H[LLM整合结果生成最终回答] H --> I[返回用户]

为什么AI需要Function Call?

  1. 获取实时信息:查询天气、新闻、股票等最新数据
  2. 执行精确计算:进行复杂数学计算或数据分析
  3. 与外部系统交互:操作数据库、发送邮件、控制设备等
  4. 增强可靠性:减少模型"编造"信息的可能性

Function Call实战:查询天气

让我们通过一个具体例子看看Function Call是如何工作的:

javascript 复制代码
import OpenAI from 'openai'; // 导入OpenAI库

const client = new OpenAI({
  apiKey: 'sk-5kq7', // API密钥
  baseURL: 'https://api.302.ai/v1' // API基础地址
})

// 定义获取天气的函数
const getWeather = async (city) => {
  // 实际项目中这里会调用真实天气API
  return {
    city,
    temp: '28',
    condition: 'Sunny'
  }
}

async function main() {
  // 第一步:AI分析是否需要调用函数
  const resp = await client.chat.completions.create({
    model: "gpt-4o",
    messages: [
      {
        role: "user",
        content: "今天北京天气怎么样?"
      }
    ],
    // 告诉AI可用的工具列表
    tools: [
      {
        type: 'function',
        function: {
          name: "getWeather", // 函数名
          description: "获取某个城市的天气", // 函数描述
          parameters: { // 参数定义
            type: "object",
            properties: {
              city: {
                type: "string"
              }
            },
            required: ["city"] // 必需参数
          }
        }
      }
    ]
  });

  // 检查AI是否想调用函数
  const toolCall = resp.choices[0].message.tool_calls?.[0];
  
  if (toolCall?.function.name === "getWeather") {
    // 解析AI生成的参数
    const args = JSON.parse(toolCall.function.arguments);
    
    // 实际执行函数获取天气数据
    const weather = await getWeather(args.city);
    
    // 第二步:将结果返回给AI继续处理
    const secondResp = await client.chat.completions.create({
      model: 'gpt-4o',
      messages: [
        {
          role: 'user',
          content: '北京天气'
        },
        resp.choices[0].message, // AI的函数调用请求
        {
          role: 'tool', // 工具执行结果
          tool_call_id: toolCall.id, // 调用ID
          content: JSON.stringify(weather) // 天气数据
        }
      ]
    })
    
    // 最终AI生成的回答
    console.log(secondResp.choices[0].message.content)
  }
}

main();

代码详解:

  1. 初始化客户端:创建OpenAI客户端实例,配置API密钥和地址
  2. 定义工具函数:实现具体的业务逻辑(如获取天气)
  3. 第一次API调用:AI分析用户问题,决定是否需要调用函数
  4. 解析AI响应:检查AI是否生成了函数调用请求
  5. 执行函数:运行实际函数获取结果
  6. 第二次API调用:将函数结果返回给AI生成最终回答
  7. 输出结果:展示AI生成的最终响应

这个过程就像是一个聪明的助手:你先告诉它有什么工具可用,它自己决定什么时候使用这些工具,使用后再向你汇报结果。

MCP:Function Call的"升级版"

为什么需要MCP?

随着Function Call的广泛应用,一些问题逐渐浮现:

  • 🔧 每个项目都需要自定义函数调用逻辑
  • 🤝 不同系统间的集成成本高
  • 🛡️ 安全性和权限控制复杂
  • 🔌 缺乏统一的标准和协议

这就引出了MCP(Model Context Protocol)------一个标准化LLM与外部资源交互的协议。

MCP是什么?

MCP是一个开放协议,定义了LLM如何与外部工具、数据源和服务进行交互。可以把它想象成AI世界的USB协议

就像USB为各种外设提供了统一连接标准一样,MCP为AI和各种外部资源提供了标准化交互方式。

MCP的核心组件

  1. MCP Server:提供特定功能的服务端(如天气服务、数据库查询等)
  2. MCP Client:与LLM交互的客户端(如Cursor、Claude等AI应用)
  3. Transport:服务器与客户端之间的通信层
  4. LLM:大语言模型本身

MCP实战:创建时间服务

让我们创建一个简单的MCP服务器,提供时间查询功能:

javascript 复制代码
// mcp-server.js
// 导入MCP服务端核心类,用于创建和管理MCP服务器
// MCP服务器统一管理工具调用与上下文,实现大模型与外部工具间标准化、高效、安全的交互。
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
// 导入基于标准输入输出的传输层,实现进程间通信
// 大模型运行的主进程(如AI应用)与通过StdioServerTransport启动的MCP工具服务器进程之间的通信。
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
// 导入调用工具请求和响应的数据结构类型定义,确保通信数据格式规范
import {
  CallToolRequestSchema,
  CallToolResultSchema,
} from "@modelcontextprotocol/sdk/types.js";

// 1. 创建 MCP Server
const server = new Server(
  {
    name: "demo-mcp-server", // 服务器名称,用于标识当前MCP服务
    version: "1.0.0",// 服务器版本,便于版本管理和兼容性控制
  },
  {
    capabilities: {
      tools: {}, // 可以动态注册工具
    },
  }
);

// 2. 注册一个工具(比如:获取当前时间)
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "getTime") {
    return {
      content: [
        {
          type: "text",
          text: `当前时间是: ${new Date().toISOString()}`,
        },
      ],
    };
  }
  throw new Error("未知工具: " + request.params.name);
});

// 3. 启动 MCP Server
// StdioServerTransport 是通信桥梁(运输层)
const transport = new StdioServerTransport();
// server.connect(transport) 是将 MCP 服务器连接到该桥梁
server.connect(transport);

代码详解:

  1. 导入必要模块:引入MCP SDK提供的服务器、传输层和类型定义
  2. 创建服务器实例:配置服务器名称和版本信息
  3. 注册工具处理器:定义服务器提供的工具和对应的处理逻辑
  4. 启动服务器:建立通信传输层并启动服务

这个MCP服务器提供了一个getTime工具,当AI需要获取当前时间时,就会调用这个工具。

配置MCP客户端

创建好MCP服务器后,需要在AI客户端中配置连接。以Cursor编辑器为例,需要修改设置文件:

json 复制代码
{
  "mcpServers": {
    "time-mcp": {
      "autoApprove": [],
      "disabled": false,
      "timeout": 60,
      "type": "stdio",
      "command": "node",
      "args": [
        "C:/Users/hh/Desktop/lesson_si/interview/ai/mcp/demo/index.mjs"//本地MCP服务器的路径
      ],
      "env": {}
    },
    "amap-maps": {
      "disabled": false,
      "timeout": 60,
      "type": "stdio",
      "command": "npx.cmd",
      "args": [
        "-y",
        "@amap/amap-maps-mcp-server"
      ],
      "env": {
        "AMAP_MAPS_API_KEY": "你自己的密钥"
      }
    }
  }
}

配置详解:

  • time-mcp:自定义时间服务配置
  • amap-maps:高德地图服务配置(需要API密钥)
  • stdio传输:使用标准输入输出进行进程间通信
  • 超时设置:配置请求超时时间防止无限等待

配置完成后,AI就可以使用这些外部工具了。比如用户可以问:"帮我规划从公司到机场的路线",AI就会通过高德地图MCP获取实时路径规划。

Function Call vs MCP:如何选择?

特性 Function Call MCP
协议标准 厂商特定(如OpenAI) 开放标准
集成复杂度 相对简单 需要设置服务器
可复用性 项目特定 跨项目通用
安全性 依赖实现 内置权限控制
适用场景 简单定制需求 复杂企业应用

选择建议:

  • 🚀 初学者或简单项目:从Function Call开始
  • 🏢 企业级复杂应用:选择MCP更合适
  • 🔄 需要跨平台复用工具:MCP是更好选择
  • ⚡ 快速原型开发:Function Call更轻量

总结:AI的未来是连接的世界

Function Call和MCP代表了AI发展的重要方向:从孤立的知识系统转变为能够与真实世界交互的智能代理。它们解决了大模型的根本限制:

  1. 实时性:获取最新信息,不再受训练数据时间戳限制
  2. 精确性:通过专业工具执行准确计算和操作
  3. 安全性:可控地访问外部系统,减少幻觉现象
  4. 扩展性:不断集成新工具和能力,避免模型重新训练

随着这些技术的发展,我们正在走向一个AI真正成为"万能助手"的时代------它不再只是回答问题,而是能够帮我们实际做事:订机票、查天气、分析数据、控制智能家居...

这就像是给AI装上了连接现实世界的翅膀,让它从知识的图书馆飞向了无限可能的天空。

现在,当你再次问AI"今天天气怎么样?"时,背后可能正发生着一场精彩的技术舞蹈:AI分析你的需求→调用天气MCP服务→获取实时数据→生成友好回答。这一切在几秒内完成,你却只看到了最终的那一句:"今天北京晴,28°C,适合出行哦!" 🌞


参考资料:

  1. OpenAI Function Calling文档
  2. Model Context Protocol官方文档
  3. MCP GitHub仓库
相关推荐
奶昔不会射手3 分钟前
css3之flex布局
前端·css3·flex
跟橙姐学代码9 分钟前
Python 装饰器超详细讲解:从“看不懂”到“会使用”,一篇吃透
前端·python·ipython
安思派Anspire11 分钟前
以正确方式构建AI Agents:Agentic AI的设计原则
aigc·openai·agent
得帆云低代码26 分钟前
2025平台进化趋势:AI与低代码重塑企业应用构建引擎(下)
aigc·ai编程
pany27 分钟前
体验一款编程友好的显示器
前端·后端·程序员
Zuckjet32 分钟前
从零到百万:Notion如何用CRDT征服离线协作的终极挑战?
前端
ikonan37 分钟前
译:Chrome DevTools 实用技巧和窍门清单
前端·javascript
Juchecar38 分钟前
Vue3 v-if、v-show、v-for 详解及示例
前端·vue.js
ccc101841 分钟前
通过学长的分享,我学到了
前端
编辑胜编程42 分钟前
记录MCP开发表单
前端