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仓库
相关推荐
长存祈月心9 分钟前
Rust 迭代器适配器
java·服务器·前端
先树立一个小目标15 分钟前
puppeteer生成PDF实践
前端·javascript·pdf
冲刺逆向17 分钟前
【js逆向案例二】瑞数6 深圳大学某医院
前端·javascript·vue.js
啃火龙果的兔子18 分钟前
Promise.all和Promise.race的区别
前端
马达加斯加D21 分钟前
Web身份认证 --- OAuth授权机制
前端
2401_8370885022 分钟前
Error:Failed to load resource: the server responded with a status of 401 ()
开发语言·前端·javascript
全栈师22 分钟前
LigerUI下frm与grid的交互
java·前端·数据库
叫我詹躲躲22 分钟前
被前端存储坑到崩溃?IndexedDB 高效用法帮你少走 90% 弯路
前端·indexeddb
无尽夏_23 分钟前
CSS3(前端基础)
前端·css·1024程序员节
温宇飞24 分钟前
Next.js 简述 - React 全栈框架
前端