什么是 Function Calling 函数调用?
OpenAI API的函数调用(function calling)是一个强大的功能,使得AI模型能够与外部工具和系统进行交互。这个功能允许开发者定义特定的函数,并在用户提出问题时,模型可以智能地决定调用哪些函数以及所需的参数。这种能力大大扩展了AI的应用场景,尤其是在需要实时数据或执行特定操作的情况下。
函数调用的工作原理
在使用OpenAI API进行函数调用时,模型不会直接执行函数,而是生成一个包含函数调用及其参数的JSON对象。开发者可以使用这个JSON对象在他们的代码中执行相应的函数。具体步骤如下:
- 定义函数:开发者在请求中定义可用的函数及其参数。
- 用户查询:用户提出问题,API将该问题与已定义的函数进行匹配。
- 生成调用请求:模型生成一个JSON对象,描述需要调用的函数及其参数。
- 执行函数:开发者的代码解析这个JSON对象,并调用相应的函数。
- 返回结果:函数执行后,结果被发送回模型,模型可以基于这些结果生成最终的用户响应。
应用场景
函数调用的应用场景非常广泛,包括但不限于:
- 数据检索:从外部API获取实时数据,例如天气预报、股市信息等。
- 复杂操作:执行需要逻辑和计算的操作,例如预定航班、安排会议等。
- 集成外部系统:与其他系统和工具交互,例如发送电子邮件、执行数据库查询等。
- 构建结构化数据:将用户输入的信息转换为JSON格式的结构化数据,便于后续处理。
支持的 API 模型
并非所有OpenAI模型都支持函数调用。当前支持此功能的模型包括:
gpt-4o
gpt-4-turbo
gpt-3.5-turbo
这些模型经过训练,能够识别何时需要调用函数,并生成符合函数签名的参数。
使用函数调用的注意事项
在使用函数调用时,需要注意以下几点:
- 上下文限制:函数描述会计入模型的上下文限制,因此在定义函数时应尽量简洁。
- 用户确认:在执行可能影响用户的操作(如发送电子邮件或进行购买)之前,建议建立用户确认流程,以避免意外操作。
- 并行调用:某些模型支持并行函数调用,这意味着可以在一次请求中同时调用多个函数,减少API请求次数,提高效率。
通过函数调用,OpenAI API能够更有效地与外部数据源和系统交互,使得AI助手的功能更加丰富和灵活。
有哪些常见的函数调用示例可以在 OpenAI API 中使用?
在OpenAI API中,函数调用功能允许开发者定义和使用特定的函数,以便在用户与AI交互时,模型能够智能地决定何时调用这些函数。以下是一些常见的函数调用示例:
常见函数调用示例
- 发送电子邮件:
- 函数:
send_email(to: string, body: string)
- 示例:用户询问“请给Anya发邮件,问她下周五是否想喝咖啡”,模型可以生成调用该函数的请求。
- 函数:
- 获取当前天气:
- 函数:
get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')
- 示例:用户问“波士顿的天气怎么样?”模型可以调用此函数以获取实时天气数据。
- 函数:
- 获取客户信息:
- 函数:
get_customers(min_revenue: int, created_before: string, limit: int)
- 示例:用户询问“这个月我的前十名客户是谁?”模型可以生成相应的API调用来获取客户数据。
- 函数:
- 执行SQL查询:
- 函数:
sql_query(query: string)
- 示例:用户问“Acme公司上个月下了多少订单?”模型可以将此问题转换为SQL查询。
- 函数:
- 提取结构化数据:
- 函数:
extract_data(name: string, birthday: string)
- 示例:用户提供一段文本,模型可以调用此函数提取其中提到的人员信息。
- 函数:
这些示例展示了函数调用如何使AI模型能够与外部系统和工具进行交互,从而增强其功能和应用场景。通过这种方式,开发者能够创建更复杂和实用的AI助手,满足用户的多样化需求。
Claude API 也支持 函数调用吗?
Claude的API支持函数调用(function calling)。这一功能使得Claude能够与外部工具和函数进行交互,从而扩展其能力,执行更复杂的任务。
Claude API中的函数调用功能
- 工具使用:Claude能够与客户端工具进行互动,允许开发者为Claude提供自定义工具,从而执行更广泛的功能。例如,Claude可以调用天气获取函数、数据库查询等。
- 智能决策:在用户输入请求时,Claude可以智能地决定何时调用特定的函数,并生成所需的参数。例如,当用户询问“旧金山的天气如何?”时,Claude会识别出需要调用
get_weather
函数,并填充相应的参数。 - 多步调用:Claude支持按顺序调用多个工具,能够将一个工具的输出作为另一个工具的输入。例如,可以先获取用户位置,然后再查询该位置的天气。
- 模型支持:Claude的多个版本(如Claude 3 Opus和Claude 3 Sonnet)都支持函数调用,使得开发者可以根据需求选择合适的模型。
实际应用示例
- 获取天气信息:
- 函数:
get_weather(location: string, unit: 'celsius' | 'fahrenheit')
- 用法:用户询问某地的天气,Claude会调用该函数并返回结果。
- 函数:
- 执行数据库查询:
- 函数:
sql_query(query: string)
- 用法:用户提出特定问题,Claude将其转化为SQL查询并执行。
- 函数:
- 与外部API交互:
- 函数:
fetch_stock_price(ticker: string)
- 用法:用户询问某股票的当前价格,Claude会调用相应的API获取数据。
- 函数:
通过这些功能,Claude的API能够为开发者提供强大的工具,增强用户体验并扩展应用场景。
再附上 Claude API 的 Function Call 具体代码示例
这是采用 Claude 官网直连的 API 的示例
import anthropic
# 定义可用的函数
functions = [
{
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "The city and state, e.g. San Francisco, CA"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["location", "unit"]
}
}
]
# 用户查询
user_query = "What's the weather in Boston, MA?"
# 生成调用请求
client = anthropic.Anthropic()
user_messages = [
{"role": "user", "content": user_query}
]
output = client.messages.create(
model="claude-3-5-sonnet-20240620",
max_tokens=1000,
messages=user_messages,
tools=functions,
stop_sequences=[""]
)
# 检查是否需要调用函数
if output.stop_reason == "tool_use":
tool_name = output.content.name
tool_params = output.content.input
# 根据函数名称执行相应的操作
if tool_name == "get_current_weather":
weather_data = fetch_weather(tool_params["location"], tool_params["unit"])
# 将结果发送回Claude
result_message = {
"role": "user",
"content": {
"type": "tool_result",
"id": output.content.id,
"result": weather_data
}
}
final_output = client.messages.create(
model="claude-3-5-sonnet-20240620",
max_tokens=1000,
messages=[result_message]
)
print(final_output.content)
else:
print("Claude did not request a function call.")
上面这个示例展示了以下步骤:
- 定义可用的函数及其参数。
- 用户提出查询。
- 生成调用请求,包括函数定义和用户查询。
- 检查Claude是否需要调用函数。
- 根据函数名称执行相应的操作。
- 将结果发送回Claude。
- Claude使用结果生成最终响应。
这个示例使用了Anthropic提供的Python SDK。在实际应用中,你需要替换为真实的天气API调用。通过这种方式,你可以扩展Claude的功能,让它能够与外部工具和API进行交互。这大大增强了Claude的应用场景和用户体验。
而关于 OpenAI API 中转站的使用, 具体请看这篇《API 中转站使用 OpenAI Function Call 的示例代码》
还有其他问题?欢迎与我沟通。