我的博客 写的不对的地方,还望大佬指正,共同学习,共同进步。
什么是智能体
智能体是指具有自主性和智能的实体,能够通过感知、规划、决策并执行相关任务,以达成预设目标。
用通俗的话来讲,可以把大模型看作人的大脑,但是光有大脑什么事都干不了,只能口嗨。比如DeepSeek这种问答式的ChatModel。而智能体就是给大模型装上手脚(Function Calling和MCP),让它能够使用工具,完成更高级的任务。并且它能够自主行动,自己判断要用什么工具,如果失败了,还会自己纠错。比如Claude,Cursor等。
但是市面上很多产品滥用智能体的概念,把只是加了个系统提示词的ChatModel和集成了大模型的工作流也称为智能体。
Function Calling
大模型想要使用工具,首先要解决的问题,就是可识别和结构化输出。Function Calling出现之前,需要通过不断调整提示词,才能得到想要的输出。 Function Calling解决了这个问题,主要做了两件事:
- 模型层面,识别出何时需要调用函数来对输出格式化
- 函数方面,设定具体的格式化逻辑来让我们更好使用
Function Calling并不是直接调用工具,它只是返回调用工具所需要的结构化参数,真正调用工具的是我们自己的应用程序。执行后再把结果告诉大模型,让它继续工作。
以询问天气为例子:
第一步,定义工具包
就是告诉大模型,有哪些工具可以使用,以及在什么时候用。相当于把工具的使用说明书给到大模型。
javascript
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "获取指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名,例如:北京"
}
},
"required": ["location"]
}
}
}
]
第二步,模型决策 - "我需要调用函数"
当用户提问"北京今天天气怎么样?"时,模型会结合当前的对话上下文(messages)和刚刚提供的"工具包"(tools)进行推理。
-
意图识别:模型理解用户想查询天气。
-
工具匹配:模型在"工具包"中寻找最相关的工具。它发现 get_current_weather 函数的描述("获取指定城市的当前天气")与用户意图高度匹配。
-
生成调用指令:模型不会直接执行代码,而是生成一个结构化的 JSON 对象作为响应。这个 JSON 对象表明它"想"调用某个函数,并提供了所需的参数。 模型的响应如下:
json
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": null, // 注意:此时不生成自然语言回答
"tool_calls": [{ // 关键字段:工具调用数组
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_current_weather", // 要调用的函数名
"arguments": "{\"location\": \"北京\"}" // 函数参数(JSON字符串格式)
}
}]
},
"finish_reason": "tool_calls" // 完成原因:因为需要调用工具而停止
}]
}
第三步:应用程序执行
当应用程序发现大模型返回"finish_reason": "tool_calls"时,就说明需要调用函数了
-
解析:从 tool_calls[0].function 中提取出函数名 get_current_weather 和参数 {"location": "北京"}。
-
映射与执行:在你的代码中,你早已定义好了一个同名的真实函数 get_current_weather(location)。这个函数内部可能会去调用一个真实的天气 API(如和风天气)。
-
获取结果:函数执行后返回真实数据,例如:{"temperature": 28, "condition": "晴"}。
第四步,整合信息并回答
现在,应用程序需要把函数执行的结果"喂"回给模型,让它来完成最终的回答。
javascript
messages.append(response.choices[0].message) # 上一步模型说"要调用函数"的消息
messages.append({
"role": "tool",
"tool_call_id": "call_abc123", // 对应之前的调用ID
"content": str(function_result) // 函数返回的结果,如 "温度28度,晴"
})
生成最终答案 "北京今天天气很好,是晴天,气温在28度左右,非常适合户外活动。"
MCP
Function Calling只能调用自己系统内部的工具,那如果大模型想要调用第三方的工具该怎么办呢,这时候就需要MCP了。 MCP(Model Context Protocol,模型上下文协议)。它本身只是一种协议,类似http协议,它定义了调用第三方工具的规范。
MCP 核心架构:
MCP 主机(MCP Hosts):发起请求的 LLM 应用程序(例如 Claude Desktop、IDE 或 AI 工具)。
MCP 客户端(MCP Clients):在主机程序内部,与 MCP server 保持 1:1 的连接。
MCP 服务器(MCP Servers):为 MCP client 提供上下文、工具和 prompt 信息。
本地资源(Local Resources):本地计算机中可供 MCP server 安全访问的资源(例如文件、数据库)。
远程资源(Remote Resources):MCP server 可以连接到的远程资源(例如通过 API)。
总结
Function Calling是AI模型调用函数的机制,MCP是一个标准协议,使大模型与API无缝交互,而AI Agent是一个自主运行的智能系统,利用Function Calling和MCP来分析和执行任务,实现特定目标。