在介绍Function Calling之前我们先了解一个概念,接口。
接口
两种常见接口:
- 人机交互接口,User Interface,简称 UI
- 应用程序编程接口,Application Programming Interface,简称 API
接口能「通」的关键,是两边都要遵守约定。
- 人要按照 UI 的设计来操作。UI 的设计要符合人的习惯
- 程序要按照 API 的设计来调用。API 的设计要符合程序惯例
你是不是有很多调接口的痛苦经历?比如:
- 文档坑
- 大小写坑
- 参数顺序坑
- 参数类型坑
- ……
接口的进化
UI 进化的趋势是:越来越适应人的习惯,越来越自然
- 命令行,Command Line Interface,简称 CLI(DOS、Unix/Linux shell, Windows Power Shell)
- 图形界面,Graphical User Interface,简称 GUI(Windows、MacOS、iOS、Android)
- 语言界面,Conversational User Interface,简称 CUI,或 Natural-Language User Interface,简称 LUI ← 我们在这里
- 脑机接口,Brain–Computer Interface,简称 BCI
API:
- 从本地到远程,从同步到异步,媒介发生很多变化,但本质一直没变:程序员的约定
- 现在,开始进化到自然语言接口,Natural-Language Interface,简称 NLI
自然语言连接一切(Natural Language Interface)
NLI 是孙志岗在《以 ChatGPT 为代表的「大模型」会是多大的技术革命?》一文中提出的概念。
用户操作习惯的迁移,会逼所有软件,都得提供「自然语言界面(Natural Language Interface,简称 NLI)」。这是我生造的词,指的是以自然语言为输入的接口。
不仅用户界面要 NLI,API 也要 NLI 化。这是因为用户发出的宏观指令,往往不会是一个独立软件能解决的,它需要很多软件、设备的配合。
一种实现思路是,入口 AI(比如 Siri、小爱同学,机器人管家)非常强大,能充分了解所有软件和设备的能力,且能准确地把用户任务拆解和分发下去。这对入口 AI 的要求非常高。
另一种实现思路是,入口 AI 收到自然语言指令,把指令通过 NLI 广播出去(也可以基于某些规则做有选择的广播,保护用户隐私),由各个软件自主决策接不接这个指令,接了要怎么做,该和谁配合。
……
当 NLI 成为事实标准,那么互联网上软件、服务的互通性会大幅提升,不再受各种协议、接口的限制。
最自然的接口,就是自然语言接口:
以前因为计算机处理不对自然语言,所以有了那么多编程语言,那么多接口,那么多协议,那么多界面风格。而且,它们每一次进化,都是为了「更自然」。现在,终极的自然,到来了。我们终于可以把计算机当人看了!
OpenAI 是如何用自然语言连接一切的呢?
为什么要大模型连接外部世界?
- 并非知晓一切
- 训练数据不可能什么都有。垂直、非公开数据必有欠缺
- 不知道最新信息。大模型的训练周期很长,且更新一次耗资巨大,还有越训越傻的风险。所以 ta 不可能实时训练。
- GPT-3.5 知识截至 2021 年 9 月
- GPT-4-turbo 知识截至 2023 年 12 月
- GPT-4o-mini 知识截至 2023 年 10 月
- GPT-4o 知识截至 2023 年 10 月
- 没有「真逻辑」。它表现出的逻辑、推理,是训练文本的统计规律,而不是真正的逻辑,所以有幻觉。
所以:大模型需要连接真实世界,并对接真逻辑系统执行确定性任务。
比如算加法:
- 把 100 以内所有加法算式都训练给大模型,ta 就能回答 100 以内的加法算式,但仍有概率出错
- 如果问 ta 更大数字的加法,出错概率就会更大
- 因为 ta 并不懂「加法」,只是记住了 100 以内的加法算式的统计规律
- Ta 是用字面意义做数学
数学能力最强的软件系统是 Wolfram Alpha,推荐阅读这篇文章了解它和 ChatGPT 原理的不同:《Wolfram|Alpha as the Way to Bring Computational Knowledge Superpowers to ChatGPT》
PS. Wolfram 的书《这就是 ChatGPT!》是从神经网络层面解释大模型原理的最好读的书。英文版免费
ChatGPT 用 Actions 连接外部世界
第一次尝试:Plugins
- 2023 年 3 月 24 日发布 Plugins,模型可以调用外部 API
- 2024 年 4 月 9 日正式下线,宣告失败
第二次尝试:Actions
Actions,内置在 GPTs 中,解决了落地场景问题,但没能成功商业化。
小瓜 GPT 已经接入了高德地图 actions,可以试试问位置相关的问题:https://chat.openai.com/g/g-DxRsTzzep-xiao-gua
工作流程:
- 通过 Actions 的 schema,GPT 能读懂各个 API 能做什么、怎么调用(相当于人读 API 文档)
- 拿到 prompt,GPT 分析出是否要调用 API 才能解决问题(相当于人读需求)
- 如果要调用 API,生成调用参数(相当于人编写调用代码)
- ChatGPT(注意,不是 GPT)调用 API(相当于人运行程序)
- API 返回结果,GPT 读懂结果,整合到回答中(相当于人整理结果,输出结论)
把 AI 当人看!
上面这个五个步骤总结的精辟到极致。
这个过程中,GPT 已经是个 agent 了。
Actions 开发对接
Actions 官方文档:https://platform.openai.com/docs/actions
把 API 对接到 GPTs 里,只需要配置一段 API 描述信息:
openapi: 3.1.0
info:
title: 高德地图
description: 获取 POI 的相关信息
version: v1.0.0
servers:
- url: https://restapi.amap.com/v5/place
paths:
/text:
get:
description: 根据POI名称,获得POI的经纬度坐标
operationId: get_location_coordinate
parameters:
- name: keywords
in: query
description: POI名称,必须是中文
required: true
schema:
type: string
- name: region
in: query
description: POI所在的区域名,必须是中文
required: false
schema:
type: string
deprecated: false
/around:
get:
description: 搜索给定坐标附近的POI
operationId: search_nearby_pois
parameters:
- name: keywords
in: query
description: 目标POI的关键字
required: true
schema:
type: string
- name: location
in: query
description: 中心点的经度和纬度,用逗号分隔
required: false
schema:
type: string
deprecated: false
components:
schemas: {
}
还需要配置 API key 来满足权限要求。(高德地图 API KEY 点此免费申请)

这里的所有 name
、description
都是 prompt,决定了 GPT 会不会调用你的 API,调用得是否正确。
还需要配置 API key 来满足权限要求。(高德地图 API KEY 点此免费申请)
这里的所有 name
、description
都是 prompt,决定了 GPT 会不会调用你的 API,调用得是否正确。
GPTs 与它的平替们
OpenAI GPTs
- 无需编程,就能定制个性对话机器人的平台
- 可以放入自己的知识库,实现 RAG(后面会讲)
- 可以通过 actions 对接专有数据和功能
- 内置 DALL·E 3 文生图和 Code Interpreter 能力
- 只有 ChatGPT Plus 会员可以使用
推荐两款平替:
字节跳动 Coze(扣子)中国版 国际版
- 中国版发展势头很猛,支持豆包、Moonshot 等国产大模型
- 功能很强大,支持工作流、API
- 但是……
Dify
- 开源,中国公司开发
- 功能最丰富
- 可以本地部署,支持几乎所有大模型
- 有 GUI,也有 API
有这类无需开发的工具,为什么还要学大模型开发技术呢?
- 并不是所有事情都适合用对话解决
- 它们都无法针对业务需求做极致调优
一个常见的研发场景:先在扣子/Dify 验证原型可行性,再编程落地实现。
Function Calling 技术可以把大模型和业务系统连接,实现更丰富的功能。
Function Calling 的机制
原理和 Actions 一样,只是使用方式有区别。
Function Calling 完整的官方接口文档:https://platform.openai.com/docs/guides/function-calling
值得一提:接口里的 tools
,最初版本叫 functions
。这是一个很有趣的指向
示例 1:调用本地函数
需求:实现一个回答问题的 AI。题目中如果有加法,必须能精确计算。
# 初始化
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
import json
_ = load_dotenv(find_dotenv())
client = OpenAI()
def print_json(data):
"""
打印参数。如果参数是有结构的(如字典或列表),则以格式化的 JSON 形式打印;
否则,直接打印该值。
"""
if hasattr(data, 'model_dump_json'):
data = json.loads(data.model_dump_json())
if (isinstance(data, (list))):
for item in data:
print_json(item)
elif (isinstance(data, (dict))):
print(json.dumps(
data,
indent=4,
ensure_ascii=False
))
else:
print(data)
def get_completion(messages, model="gpt-4o-mini"):
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0.7,
tools=[{
# 用 JSON 描述函数。可以定义多个。由大模型决定调用谁。也可能都不调用
"type": "function",
"function": {
"name": "sum",
"description": "加法器,计算一组数的和"