什么是 Function Calling 函数调用?

OpenAI API的函数调用(function calling)是一个强大的功能,使得AI模型能够与外部工具和系统进行交互。这个功能允许开发者定义特定的函数,并在用户提出问题时,模型可以智能地决定调用哪些函数以及所需的参数。这种能力大大扩展了AI的应用场景,尤其是在需要实时数据或执行特定操作的情况下。

函数调用的工作原理

在使用OpenAI API进行函数调用时,模型不会直接执行函数,而是生成一个包含函数调用及其参数的JSON对象。开发者可以使用这个JSON对象在他们的代码中执行相应的函数。具体步骤如下:

  1. 定义函数:开发者在请求中定义可用的函数及其参数。
  2. 用户查询:用户提出问题,API将该问题与已定义的函数进行匹配。
  3. 生成调用请求:模型生成一个JSON对象,描述需要调用的函数及其参数。
  4. 执行函数:开发者的代码解析这个JSON对象,并调用相应的函数。
  5. 返回结果:函数执行后,结果被发送回模型,模型可以基于这些结果生成最终的用户响应。

请看这篇《API 中转站使用 OpenAI Function Call 的示例代码》

应用场景

函数调用的应用场景非常广泛,包括但不限于:

  • 数据检索:从外部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)都支持函数调用,使得开发者可以根据需求选择合适的模型。

实际应用示例

  1. 获取天气信息
    • 函数:get_weather(location: string, unit: 'celsius' | 'fahrenheit')
    • 用法:用户询问某地的天气,Claude会调用该函数并返回结果。
  2. 执行数据库查询
    • 函数:sql_query(query: string)
    • 用法:用户提出特定问题,Claude将其转化为SQL查询并执行。
  3. 与外部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.")

上面这个示例展示了以下步骤:

  1. 定义可用的函数及其参数。
  2. 用户提出查询。
  3. 生成调用请求,包括函数定义和用户查询。
  4. 检查Claude是否需要调用函数。
  5. 根据函数名称执行相应的操作。
  6. 将结果发送回Claude。
  7. Claude使用结果生成最终响应。

这个示例使用了Anthropic提供的Python SDK。在实际应用中,你需要替换为真实的天气API调用。通过这种方式,你可以扩展Claude的功能,让它能够与外部工具和API进行交互。这大大增强了Claude的应用场景和用户体验。

 

而关于 OpenAI API 中转站的使用, 具体请看这篇《API 中转站使用 OpenAI Function Call 的示例代码》

 

还有其他问题?欢迎与我沟通。

类似文章