编程笔记

lifelong learning & practice makes perfect

AI|Function Call(1)

Function Call 是什么

大模型的 Function Call(函数调用) 属于一种使大语言模型(LLM)依据用户指令调用外部函数或工具的技术,借助模型的理解能力与外部工具的精确性相结合,达成更为繁杂、更具动态性的任务处置。其核心要点如下:

定义

Function Call可让大模型基于用户的自然语言输入,识别意图触发预先设定的外部函数或工具,把自然语言转化为结构化的参数传送给函数,最后整合函数返回的结果以生成用户能够理解的回应。

原理

  • 语义理解:模型解析用户输入,判定是否有调用函数的必要。
  • 函数匹配:从预先定义的函数库中选取适宜的工具(诸如天气查询、数学计算等)。
  • 参数生成:把用户描述转换为函数所需的参数格式(例如 {num:1.4})。
  • 执行整合:调用外部工具获取结果,进而生成自然语言的答复。

作用

突破大模型原生限制

  • 实时数据获取:例如查询天气、股票等动态信息(大模型自身知识库为静态的)。
  • 精准计算:处理像数学运算、数据分析这类需要高度准确性的任务(如计算平方、绝对值)。
  • 私域知识扩展:连接数据库、知识图谱等私有数据源,以解决特定领域的问题。

增强功能多样性

  • 支持复杂操作:像发送邮件、控制智能设备、自动化办公任务等。
  • 提升交互效率:用户无需学习特定的命令语法,使用自然语言就能触发复杂功能。

提升安全性与合规性

  • 敏感数据隔离:由外部工具处理隐私信息(如支付、身份验证),防止暴露给大模型。

使用方法

步骤一:定义外部函数

依据需求编写函数,例如:

1
2
3
# 示例:数学平方计算函数 
def calculator_square(num: float) -> float:
return num ** 2

步骤二:注册函数给大模型

向模型阐述函数的功能、参数以及使用场景(需符合模型要求的格式,如JSON Schema):

1
2
3
4
5
6
7
8
9
{
"name": "calculator_square",
"description": "计算一个数的平方",
"parameters": {
"type": "object",
"properties": {"num": {"type": "number"}},
"required": ["num"]
}
}

步骤三:用户提问触发函数调用

用户输入自然语言指令(如“计算1.4的平方”),模型判定需调用函数后,生成参数并返回:

1
2
3
4
5
6
{
"function_call": {
"name": "calculator_square",
"arguments": "{num: 1.4}"
}
}

步骤四:执行函数并返回结果

开发者解析参数,执行函数后将结果返回给模型,最终生成用户友好的回答:

1
1.4的平方是1.96。

案例

下面使用 OpenAI Python 客户端实现 Function Call,通过一个简单的场景来演示:查询某个城市的天气情况。假设我们有一个外部函数 get_current_weather,它会调用一个天气 API 并返回结果。

注意事项

  • 函数安全性:需要对参数进行严格校验,防止恶意输入(如SQL注入)。
  • 模型适配:不同模型(如GPT - 4、GLM - 4)的Function Call接口可能存在差异,需参照官方文档。
  • 错误处理:模型可能会误选函数或者生成错误参数,需要设计容错机制(如重试或者提示用户澄清)。

依赖

1
pip install openai

函数定义

先定义一个外部函数 get_current_weather,它将调用一个天气 API(例如 OpenWeatherMap API)来获取实时天气数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests

def get_current_weather(location: str, unit: str = "metric"):
"""
调用天气 API 获取当前天气
:param location: 城市名称
:param unit: 温度单位(metric 表示摄氏度,imperial 表示华氏度)
:return: 天气数据
"""
api_key = "YOUR_OPENWEATHERMAP_API_KEY"
url = f"http://api.openweathermap.org/data/2.5/weather?q={location}&units={unit}&appid={api_key}"
response = requests.get(url)
data = response.json()
return {
"temperature": data["main"]["temp"],
"description": data["weather"][0]["description"]
}

使用 OpenAI 的 Function Call

接下来,我们将使用 OpenAI 的 Python 客户端来实现 Function Call。假设我们已经有一个 OpenAI 的 API 密钥,并且启用了 Function Call 功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import openai

# 设置 OpenAI API 密钥
openai.api_key = "YOUR_OPENAI_API_KEY"

# 定义 Function Call 的函数
def get_current_weather(location: str, unit: str = "metric"):
"""
调用天气 API 获取当前天气
:param location: 城市名称
:param unit: 温度单位(metric 表示摄氏度,imperial 表示华氏度)
:return: 天气数据
"""
api_key = "YOUR_OPENWEATHERMAP_API_KEY"
url = f"http://api.openweathermap.org/data/2.5/weather?q={location}&units={unit}&appid={api_key}"
response = requests.get(url)
data = response.json()
return {
"temperature": data["main"]["temp"],
"description": data["weather"][0]["description"]
}

# 定义 Function Call 的参数
functions = [
{
"name": "get_current_weather",
"description": "获取指定城市的当前天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称"
},
"unit": {
"type": "string",
"description": "温度单位(metric 或 imperial)",
"default": "metric"
}
},
"required": ["location"]
}
}
]

# 用户输入
user_input = "北京今天的天气如何?"

# 调用 OpenAI API,启用 Function Call
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "user", "content": user_input}
],
functions=functions,
function_call="auto" # 自动决定是否调用函数
)

# 检查是否需要调用函数
if response.choices[0].finish_reason == "function_call":
function_args = response.choices[0].message.function_call.arguments
function_name = response.choices[0].message.function_call.name

# 调用外部函数
if function_name == "get_current_weather":
weather_result = get_current_weather(
location=function_args["location"],
unit=function_args.get("unit", "metric")
)

# 将结果返回给模型
second_response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "user", "content": user_input},
{"role": "assistant", "content": response.choices[0].message.content},
{"role": "function", "name": function_name, "arguments": function_args},
{"role": "function", "name": function_name, "content": weather_result}
]
)
print(second_response.choices[0].message.content)
else:
print(response.choices[0].message.content)

通过Function Call,大模型从“纯文本生成器”晋升为“智能调度中心”,极大地拓展了应用范围。开发者可借助开源框架(如LangChain)快速集成此功能。

欢迎关注我的其它发布渠道