Azure Databricks 上的函数调用

本文介绍了函数调用以及如何将其用作生成式 AI 应用程序工作流的一部分。 Databricks 函数调用与 OpenAI 兼容,仅在模型服务期间作为基础模型 API 的一部分提供,并提供为外部模型提供服务的终结点。

什么是函数调用?

函数调用提供了一种控制 LLM 输出的方法,使它们可以更可靠地生成结构化响应。 使用函数调用时,可以通过使用 JSON 架构描述函数参数来描述 API 调用中的函数。 LLM 本身不会调用这些函数,而是会创建一个 JSON 对象,用户可以使用该对象在其代码中调用这些函数。

对于 Databricks 上的函数调用,基本步骤顺序如下:

  1. 使用提交的查询和 tools 参数中定义的一组函数调用模型。
  2. 模型决定是否调用定义的函数。 调用函数时,内容是遵循自定义架构的字符串的 JSON 对象。
  3. 在代码中将字符串解析为 JSON,并使用提供的参数(如果存在)调用函数。
  4. 通过将结构化响应作为新消息附加,再次调用模型。 响应的结构由之前在 tools 中提供的函数定义。 此时,模型将总结结果并将该摘要发送给用户。

何时使用函数调用

下面是函数调用的示例用例:

  • 创建可以通过调用其他 API 来回答问题的助手。 例如,可以定义 send_email(to: string, body: string)current_weather(___location: string, unit: 'celsius' | 'fahrenheit') 等函数。
  • 根据自然语言定义和使用 API 调用。 例如,将“谁是我的主要客户?” 将其制作为名为 get_customers(min_revenue: int, created_before: string, limit: int) 的 API 调用,并调用该 API。

对于批处理推理或数据处理任务,例如将非结构化数据转换为结构化数据。 Databricks 建议使用 结构化输出

支持的模型

下表列出了支持的模型,以及哪些模型服务功能使每个模型都可用。 请参阅适用于这些模型的 模型开发人员许可证和条款

重要

从 2024 年 12 月 11 日起,Meta-Llama-3.3-70B-Instruct 将在 Foundation Model APIs 的按令牌付费终结点中替代对 Meta-Llama-3.1-70B-Instruct 的支持。

型号 使用模型服务功能来提供 备注
Claude-3.7-Sonnet 基础模型 API 支持按令牌付费终结点。
Meta-Llama-3.3-70B-Instruct 基础模型 API 在按令牌付费和预配吞吐量工作负载上受支持。
Meta-Llama-3.1-405B-Instruct 基础模型 API 在按令牌付费和预配吞吐量工作负载上受支持。
Meta-Llama-3.1-8B-Instruct 基础模型 API 在按令牌付费和预配吞吐量工作负载上受支持。
gpt-4o 外部模型
gpt-4o-2024-08-06 外部模型
gpt-4o-2024-05-13 外部模型
gpt-4o-mini 外部模型
claude-3-5-sonnet-latest 外部模型 Anthropic 模型提供者
claude-3-5-haiku-latest 外部模型 Anthropic 模型提供者
claude-3-5-opus-latest 外部模型 Anthropic 模型提供者
claude-3-5-sonnet-20241022 外部模型 Anthropic 模型提供者。 此模型支持使用 计算机使用(beta)进行工具调用。
claude-3-5-haiku-20241022 外部模型 Anthropic 模型提供者
claude-3-5-sonnet-20240620 外部模型 Anthropic 模型提供者
claude-3-haiku-20240307 外部模型 Anthropic 模型提供者
claude-3-opus-20240229 外部模型 人类学模型提供商
claude-3-sonnet-20240229 外部模型 Anthropic 模型提供者
claude-3-5-sonnet-20241022-v2:0 外部模型 Bedrock Anthropic 模型提供者。 此模型支持使用 计算机使用(beta)进行工具调用。
claude-3-5-haiku-20241022-v1:0 外部模型 Bedrock Anthropic 模型提供者
claude-3-5-sonnet-20240620-v1:0 外部模型 Bedrock Anthropic 模型提供者
claude-3-sonnet-20240229-v1:0 外部模型 Bedrock Anthropic 模型提供者
claude-3-opus-20240229-v1:0 外部模型 Bedrock Anthropic 模型提供者

使用函数调用

若要将函数调用与生成式 AI 应用程序一起使用,必须提供 parametersdescription

tool_choice 的默认行为是 "auto"。 这使模型可以决定要调用哪些函数以及是否调用它们。

可以根据用例自定义默认行为。 以下是你的选项:

  • 设置 tool_choice: "required"。 在此方案中,模型始终调用一个或多个函数。 模型选择要调用的一个或多个函数。
  • 设置 tool_choice: {"type": "function", "function": {"name": "my_function"}}。 在此方案中,模型仅调用特定函数。
  • tool_choice: "none" 设置为禁用函数调用,并让模型仅生成面向用户的消息。

以下是使用 OpenAI SDK 及其 tools 参数的单轮次示例。 有关其他语法详细信息,请参阅聊天任务

重要

在公开预览期间,Databricks 上的函数调用针对单轮次函数调用进行了优化。

import os
import json
from openai import OpenAI

DATABRICKS_TOKEN = os.environ.get('YOUR_DATABRICKS_TOKEN')
DATABRICKS_BASE_URL = os.environ.get('YOUR_DATABRICKS_BASE_URL')

client = OpenAI(
  api_key=DATABRICKS_TOKEN,
  base_url=DATABRICKS_BASE_URL
  )

tools = [
  {
    "type": "function",
    "function": {
      "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"
            ]
          }
        }
      }
    }
  }
]

messages = [{"role": "user", "content": "What is the current temperature of Chicago?"}]

response = client.chat.completions.create(
    model="databricks-meta-llama-3-3-70b-instruct",
    messages=messages,
    tools=tools,
    tool_choice="auto",
)

print(json.dumps(response.choices[0].message.model_dump()['tool_calls'], indent=2))

此参数还支持 Claude 模型的计算机使用(beta)

JSON 架构

基础模型 API 广泛支持 OpenAI 接受的函数定义。 但是,使用更简单的 JSON 架构进行函数调用定义可生成更高质量的函数调用 JSON。 为了提高生成质量,基础模型 API 仅支持 JSON 架构规范的子集。

不支持以下函数调用定义键:

  • 使用 pattern 的正则表达式。
  • 使用以下方法进行复杂的嵌套或架构组合和验证:anyOfoneOfallOfprefixItems$ref
  • 类型列表,但 [type, “null”] 的特殊情况除外,其中列表中的一种类型是有效的 JSON 类型,另一种类型是 "null"

此外,还存在以下限制:

  • JSON 架构中指定的最大键数为 16
  • 基础模型 API 不强制执行对象和数组的长度或大小约束。
    • 这包括 maxPropertiesminPropertiesmaxLength 等关键字。
  • 大量嵌套的 JSON 架构会导致质量较低的生成。 如果可能,请尝试平展 JSON 架构以获得更好的结果。

令牌使用情况

使用提示注入和其他技术来提高工具调用的质量。 这样做会影响模型消耗的输入和输出令牌数量,进而导致计费问题。 使用的工具越多,输入令牌就越多。

限制

以下是公共预览期间函数调用的限制:

  • 当前函数调用解决方案针对单轮函数调用进行了优化。 预览期间支持多轮函数调用,但其开发仍在进行中。
  • 不支持并行函数调用。
  • 最多可以在 tools 中定义 32 个函数。
  • 对于预配的吞吐量支持,函数调用仅在新的终结点上受支持。 不能向以前创建的终结点添加函数调用。

笔记本示例

有关详细的函数调用示例,请参阅以下笔记本

函数调用示例笔记本

获取笔记本