day11-functionCalling和MCP
今日内容
1 functionCalling和MCP
1.1 Agent智能体开发
# 1 Agent(智能体)开发 是当前人工智能领域最前沿、最具实用价值的方向之一。它让 AI 从“被动问答”升级为“主动思考 + 工具调用 + 自主决策”的智能系统
-Agent(智能体)是一个能感知环境、自主规划、调用工具、执行任务并反思结果的 AI 系统
-股票小白--》不知道买哪只股票赚钱
-自动从众多股票中--查询市盈率,公司新闻(工具调用)--》大模型LLM主动思考--》自主决策--》自动购买
# 2 大模型AI--》要能实现对外部工具的调用
-大模型LLM 不具备这种能力
-使用技术实现,大模型具备这种能力
-functionCalling 方式
-MCP 方式
# 3 智能体就是 大语言模型[LLM] + 工具调用能力

1.2 functionCalling
大模型,如何调用工具?
# 1 functionCalling(函数调用) 是OpenAI,2023年6月首次提出的技术概念,解决大模型本身无法直接跟外部工具直接通信的问题
-大模型是通过海量数据训练得到---》时效性问题:今天的天气?茅台今天的股票价格?---》调用外部工具
-目前市面上所有大模型,都支持functionCalling 调用外部工具的能力
# 2 大模型在面对实时性问题、数学计算等问题时可能效果不佳。Function Calling 通过引入外部工具,让大模型可以回答原本无法解决的问题。
# 3 AI大模型相当于一个聪明的,但手无缚鸡之力的人
1 雇了一个聪明的顾问(GPT,千问)
-读过世界上所有的书
-会写代码,会调试bug,懂很多很多知识
2 比如我想让这个顾问--》帮我创建一个文件夹,打开浏览器,查询当天天气,发送邮件
-给它配一些工具:创建文件夹函数,打开浏览器函数,查询某只股票价格函数
3 让聪明的顾问(大模型)---》调用这些工具--》完成更高级的操作
4 举个例子: 大模型调用外部工具的流程
5 关键点:使用Function Calling 调用外部工具---》大模型和工具直接的桥梁
-工具是有我们开发者开发的
-但是每个工具,都需要手动注册给模型,格式严格【我们写好并且告诉ai了--》说明书tools】
-MCP统一规范后--》工具无论如何写【效率高,效率低,官方写,第三方写】---》我们调用的时候是统一的
7 MCP 是Function Calling 的进阶:解决了Agent 开发中调用外部工具的技术门槛过高的问题,不统一的问题,理解为:functionCalling的升级统一
### 注意:functionCalling对我们来讲,无法直接使用,开发Codex,Coze的工程师才会直接使用
我们会使用MCP
1.3 MCP
# 1 MCP,全称是Model Context Protocol,模型上下文协议,由Claude母公司Anthropic于2024年11月正式提出。
MCP 是一套标准协议,让任何工具都能被任何 AI 系统自动发现和调用,就像 USB 接口一样通用
MCP(Model Context Protocol)—— 给 AI 调用工具制定"通用插座标准"
举例:之前手机充电:
-type c
-light
-大口 c
mcp统一后:大家都用type c,只要生产 type c ,就能给所有手机充电
-只要按标准写完工具,所有大模型都可以调用
12306写了工具
高德地图写了工具
天气公司写了个工具
大模型在调用时,是一样的,统一了调用方式
### MCP 统一了 大模型 与 工具之间,调用的协议
# 2 MCP 解决的问题:Agent 开发中调用外部工具的技术门槛过高的问题,过于复杂,不统一,理解为:functionCalling的升级统一
统一大模型语言(LLM)与外界数据源和工具之间的通信协议
# 3 比喻
# 使用functionCalling,千问大模型,DeepSeek大模型要使用查询天气工具,都要单独写,很麻烦
# 使用mcp,只需要写好一次,发布成mcp-server,任意客户端【千问大模型,DeepSeek大模型】,都可以直接使用
1.4 总结
# 1 都是为了解决 开发中AI调用外部工具的问题,functionCalling比较麻烦不统一,mcp简洁统一
# 2 MCP的出现,不是取代了functionCalling,是对functionCalling的统一和升级
-他俩都存在
-MCP出现后,functionCalling不需要了---严重错误
-如果没有functionCalling--》MCP用不了
2 functionCalling案例之肯德基门店【了解】
大模型无法获得上海所有肯德基门店的
使用大模型---》借助于functionCalling---》调用百度地图方法
实时获取某个城市肯德基门店

2.1 主文件
import requests
import json
#### 第一步:定义函数--》外部工具--》查询肯德基门店的函数--》传入城市返回这个城市的肯德基门店
def get_KFC(location):
# 百度地图API--》输入要搜索的城市和建筑--》输入上海和肯德基--》搜索上海的所有肯德基门店-->返回json格式
url = f"https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion={location}&query=肯德基&output=json"
response = requests.get(url)
data = response.json()
return json.dumps(data)
#### 第二步:外部工具的使用说明书--》格式严格--》tools
## 2.1 定义字典
get_KFC_function = {
'name': 'get_KFC', # 函数名
'description': '查询肯德基门店,根据输入的城市名称,查询对应城市的肯德基门店', # 如何使用这个函数
'parameters': { # 参数
'type': 'object', # json对象类型
'properties': { # 参数成员描述
'location': {
'description': "城市名称,直接输入中国城市的中文名,如'北京','上海'",
'type': 'string'
},
}, # 对参数描述,有几个就写几个
'required': ['location'] # 必填参数
}
}
## 2.2 使用说明书 tools
tools = [
{
"type": "function", # 是个函数
"function": get_KFC_function # 上面定义的那个字典
},
]
messages = [
{'role': 'user', 'content': '请帮我查询上海地区的肯德基门店?'}
]
#### 第三步:调用大模型-》传入"函数使用说明书"
from openai import OpenAI
from dotenv import load_dotenv
import os
load_dotenv('.env01')
client = OpenAI(
api_key=os.getenv("API_KEY"),
base_url=os.getenv("BASE_URL"),
)
completion = client.chat.completions.create(
model=os.getenv("MODEL_NAME"),
messages=messages,
tools=tools # 重点:把说明书传入
)
response_message = completion.choices[0].message
#### 第四步:大模型返回数据---》大模型让我们去调用哪个函数:返回函数id,函数名,函数参数
print('大模型第一次返回:',response_message)
###### 第五步:自己调用函数---》需要拿到函数名,参数
# 我们自己调用函数需要 :
# 拿到大模型给我们的函数名[字符串],和入参[列表]
# 根据字符串对应到 具体函数上 function_to_call = available_functions[function_name]--》get_KFC
# 有了真正函数,我们调用,传入参数 get_KFC(上海)
function_name = response_message.tool_calls[0].function.name # 拿到函数名:固定写法
print('大模型判断后,要调用的函数名:',function_name)
function_args = json.loads(response_message.tool_calls[0].function.arguments) # 拿到参数,固定写法,是列表
print('大模型理解后,解析的参数:',function_args)
# 调用我们的函数--》大模型返回的是函数名的字符串
# 把函数名字符串 跟 真正的函数对应
available_functions = {
"get_KFC": get_KFC,
}
# 根据大模型返回的字符串名字,拿到真正的 函数 get_KFC
function_to_call = available_functions[function_name]
# 调用函数,传入参数---》**function_args 把参数打散了传入
function_response = function_to_call(**function_args) # 本质get_KFC(上海)
print('调用我们函数,执行的结果是:',function_response)
##### 第五步结束--》调用函数---》不是get_KFC()直接调用--》是通过反射调用的####
####### 第六步:带着我们调用函数返回结果--》给大模型
# 6.1 response_message 大模型返回给我们的数据--》转成json格式,好处理
response_message.model_dump()
# 6.2 向messages追加第一次模型返回结果消息
'''
messages = [
{'role': 'user', 'content': '请帮我查询上海地区的肯德基门店?只要名字和,地址和电话'},
大模型返回的数据,
{"role": "tool",content:我们调用函数结果,tool_call_id:第一次大模型返回的id}
]
'''
messages.append(response_message.model_dump())
# 6.3 追加function返回消息
messages.append({
"role": "tool",
"content": function_response, # 我们调用拿到的结果
"tool_call_id": response_message.tool_calls[0].id # 大模型返回的工具id号
})
# 6.4 发送第二次请求
second_response = client.chat.completions.create(
model=os.getenv('MODEL_NAME'),
messages=messages
)
###### 第七步:大模型返回分析后返回
print('最终大模型给的答案:',second_response.choices[0].message.content)
2.2 .env01
MODEL_NAME=deepseek-v4-flash
API_KEY=你们自己的
BASE_URL=https://api.deepseek.com
3 functionCalling案例之AI股票小助手【了解】
大模型【Deepseek,千问,GPT】----》无法实时获取到 某个公司股票价格和涨跌幅信息的
需要调用工具--——》实现实时获取股票信息

codex用的deepseek大脑跟直接用deepseek的区别是什么?
Codex 软件---》有很多功能【插件:创建文件夹,创建PPT】-底层就是基于functionCalling写的---》没有大脑
-可以对接deepseek大脑
-可以对接GPT大脑
Codex/ChatGPT 和 codex++有什么区别
codex++:能让Codex对接国产模型
如果不用它,只能对接GPT---》需要FQ,需要注册
codex和其他国产接国内模型有什么区别吗
Codex 接国产模型:我们无法直接使用GPT模型---》官方订阅能用,肯定用官方--》贵
Claude code、Coze、workbuddy,openclaw,爱马仕。。。---》本质都一样---》他们都是通用智能体,不同公司出的
Code是最强的:大脑强,工具全
DeepSeek v4 flash--->刚发布--》据说很强---》性能比肩DeepSeek v4 pro
我们国产模型,更新的很快--》跟国外模型 差 3--6个月的智商
3.1 同学运行老师的代码【有兴趣的同学可以研究一下】
# 1 替换你自己DeepSeek的api key
.env 中
# 2 使用Pycharm打开老师给的项目,安装依赖
pip install -r requirements.txt
# 3 在 flask_run.py 上 ,右键运行
# 4 浏览器中打开:http://127.0.0.1:5000/
# 5 就可以聊天了
Python ---》运行python代码的--》python解释器
Pycharm--》集成开发环境--》在这里面写python代码--》高级点的记事本
没有Pycharm也能写python代码,并运行
4 MCP详解
4.1 MCP结构和通信模式
# 1 MCP 架构:CS架构 【百度网盘就是cs架构】
C:client 缩写--》客户端 # 桌面装的百度网盘
S:server缩写---》服务端 # 在百度服务器上
# 2 我们在Codex中使用 MCP
-C是:Codex-----》装在我们电脑上了
-S是:某个厂商的MCP服务--——》麦当劳在麦当劳的服务器上;天眼查在天眼查的服务器上
# 3 我们C端配置[Codex中]---》就可以连接到S端:麦当劳,天眼查
-我们就能在Codex中,下单麦当劳,查你的积分,优惠券
-我们就能在Codex中,查公司信息
-如果不对了麦当劳mcp服务---》能不能在codex直接下单麦当劳?
# 4 C S 架构---》要通信,客户端和服务端互传信息--》3种通信模型
-Streamable HTTP(HTTP 流式请求) —— 官方推荐 · 现代标准--》最强烈推荐,绝大部分第三方mcp服务都是使用这种
- Stdio(Standard Input/Output) —— 本地开发首选 · 极简高效--》不通过网络,速度快
- SSE(Server-Sent Events)—— 官方弃用 · 不再推荐
# 5 本地跑,也可以用http,没有任何问题
# 6 下面演示的三个案例,都是使用http通信模型

4.2 第三方MCP服务
# 1 自从MCP协议被推出后--》各大厂商,都在开发自己的MCP服务端
-支付宝:支付功能,查账功能
案例:ai购物-->看好了商品:原来自己付款--》现在让大模型决定付款--》调用阿里的mcp的支付功能--》直接完成付款
-高德地图:景点信息mcp服务
案例:ai旅行助手:我要去北海玩---》查出景点拥堵情况,景点门票,好玩的,附近好吃的
-12306:查票,买票mcp服务
案例:ai旅行助手:2月10号去北京玩
-查看2月10日天气是否适合出行
-自动购买2月10日去北京的火车票
-调用了12306mcp服务
-推荐景点
-调用了高德mcp
自动美团订票
-调用了美团mcp服务
12306候补:所有抢票方案,都不如候补
。。。。。
# 3 MCP服务有哪些?放在哪?非常的,老师推荐几个
厂商开发出来--》绝大多数代码都开源:数据不开源--》隐私,重要是数据
# 开源的如下:
## 3.1 ModelContextProtocol https://github.com/modelcontextprotocol/servers
-https://registry.modelcontextprotocol.io/
## 3.2 魔塔MCP广场【国内的】 https://www.modelscope.cn/mcp
## 3.3 MCP.so https://mcp.so/zh
## 3.4 MCP Market https://mcpmarket.com/zh
## 3.5 百炼MCP广场【阿里自家产品多】 https://bailian.console.aliyun.com/cn-beijing/?tab=app#/mcp-market

Codex 装好了:C端
S端:麦当劳,天眼查---》部署好了:部署在他们自己的服务器上了----有个地址--》通过这地址,连接上--》codex就可以用了
S端的代码,需要我们写吗?不需要,我们只用别人写好的
如果同学们去了 高德公司/麦当劳---》MCP服务开发---》Python--》FastMCP框架
懂开发【使用Codex开发】: 开发智能体--》使用大模型+MCP调用---》实现出一款产品
Codex就是一款产品
5 Codex使用麦当劳MCP服务
# 1 信息:https://www.modelscope.cn/mcp/servers/MChina/mcd_mcp_server
# 2 接入介绍:https://open.mcd.cn/mcp / https://open.mcd.cn/mcp/doc
-手机号登录--》麦当劳app--》账号
-拿到API-key:2RXXfAmjg5qpXZ1CWFAO29sDdiTxJQXS
# 2 url地址:https://mcp.mcd.cn
# 3 API_KEY :独属于你,所有使用Codex下单的账号,就是这个账号
2RXXfAmjg5qpXZ1CWFAO29sDdiTxJQXS
# 方式一:自己配
# 方式二:直接让Codex配
# 4 直接让codex给配置
帮我设置麦当劳的mcp服务:
{
"mcpServers": {
"mcd-mcp": {
"type": "streamablehttp",
"url": "https://mcp.mcd.cn",
"headers": {
"Authorization": "Bearer 替换成你们的API key"
}
}
}
}
帮我设置麦当劳的mcp服务:
{
"mcpServers": {
"mcd-mcp": {
"type": "streamablehttp",
"url": "https://mcp.mcd.cn",
"headers": {
"Authorization": "Bearer 2RXXfAmjg5qpXZ1CWFAO29sDdiTxJQXS"
}
}
}
}
# 使用:
-查询我的积分
-查询我的优惠券
-查询餐厅
-下单等




6 Codex使用天眼查MCP
查公司,法人,官司。。。。
# 0 参考:https://www.tianyancha.com/ai/developer-docs#mcp-tips
# 1 信息:https://www.tianyancha.com/ai/profile # 登录你的账号
# 2 url地址:https://mcp.tianyancha.com/v1
# 3 API_KEY :https://www.tianyancha.com/ai/profile?tab=usage
mcpk2_7JCr9KQGI2DPsl7HoJnSEKaZX
# 4 请使用 tyc-mcp 查询乐视网信息技术(北京)股份有限公司的基本工商信息。


7 Codex使用独立部署12306 MCP
# 1 12306 第三方写的,没部署,代码放在github上,我们自己部署
-同学们不需要会,我已经部署好了--》买了个云服务器部署了
-相当于:第三方已经给我们部署好了
-这个第三方如何写的? 使用爬虫技术--》爬取了12306的数据--》可能不稳定
-12306可能有反爬--》之前是没问题的,今天测的时候,有的服务不能用,有的能用
# 2 配置,只需要地址即可:http://121.43.104.179:8080/sse


# 1 functionCalling和MCP
## 1.1 Agent智能体开发
## 1.2 functionCalling
## 1.3 MCP
## 1.4 总结
# 2 functionCalling案例之肯德基门店
# 3 functionCalling案例之AI股票小助手
# 4 MCP详解
## 4.1 MCP结构和通信模式
## 4.2 第三方MCP服务
# 5 Codex使用麦当劳MCP服务
# 6 Codex使用天眼查MCP
# 7 Codex使用独立部署12306 MCP

浙公网安备 33010602011771号