Azure Databricks 上的函数调用
重要
此功能以公共预览版提供,在基础模型 API 按令牌付费或预配的吞吐量终结点上都受支持。
本文介绍了函数调用以及如何将其用作生成式 AI 应用程序工作流的一部分。 Databricks 函数调用与 OpenAI 兼容,仅在模型服务期间作为基础模型 API 的一部分提供。
什么是函数调用
函数调用提供了一种控制 LLM 输出的方法,使它们可以更可靠地生成结构化响应。 使用函数调用时,可以通过使用 JSON 架构描述函数参数来描述 API 调用中的函数。 LLM 本身不会调用这些函数,而是会创建一个 JSON 对象,用户可以使用该对象在其代码中调用这些函数。
对于 Databricks 上的函数调用,基本步骤顺序如下:
- 使用提交的查询和
tools
参数中定义的一组函数调用模型。 - 模型决定是否调用定义的函数。 调用函数时,内容是遵循自定义架构的字符串的 JSON 对象。
- 在代码中将字符串解析为 JSON,并使用提供的参数(如果存在)调用函数。
- 通过将结构化响应作为新消息附加,再次调用模型。 响应的结构由之前在
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 建议使用 结构化输出。
支持的模型
下表列出了支持的模型,以及哪些模型服务功能使每个模型都可用。
- 有关基础模型 API 提供的模型,请参阅 基础模型 API 限制 ,了解区域可用性。
- 有关外部模型提供的模型,请参阅 区域可用性的区域可用性 。
重要
Meta Llama 3.1 根据 LLAMA 3.1 社区许可授权,版权所有 © Meta Platforms, Inc.保留所有权利。 客户需负责确保遵守适用的模型许可条款。
型号 | 使用模型服务功能提供 | 备注 |
---|---|---|
Meta-Llama-3.1-405B-Instruct | 基础模型 API | 支持按令牌付费和预配的吞吐量工作负荷。 |
Meta-Llama-3.1-70B-Instruct | 基础模型 API | 支持按令牌付费和预配的吞吐量工作负荷。 |
Meta-Llama-3.1-8B-Instruct | 基础模型 API | 仅在预配的吞吐量工作负荷上受支持。 |
gpt-4o | 外部模型 | |
gpt-4o-2024-08-06 | 外部模型 | |
gpt-4o-2024-05-13 | 外部模型 | |
gpt-4o-mini | 外部模型 |
使用函数调用
若要将函数调用与生成式 AI 应用程序一起使用,必须提供 parameters
和 description
。
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-1-70b-instruct",
messages=messages,
tools=tools,
tool_choice="auto",
)
print(json.dumps(response.choices[0].message.model_dump()['tool_calls'], indent=2))
JSON 架构
基础模型 API 广泛支持 OpenAI 接受的函数定义。 但是,使用更简单的 JSON 架构进行函数调用定义可生成更高质量的函数调用 JSON。 为了提高生成质量,基础模型 API 仅支持 JSON 架构规范的子集。
不支持以下函数调用定义键:
- 使用
pattern
的正则表达式。 - 使用以下方法进行复杂的嵌套或架构组合和验证:
anyOf
、oneOf
、allOf
、prefixItems
或$ref
。 - 类型列表,但
[type, “null”]
的特殊情况除外,其中列表中的一种类型是有效的 JSON 类型,另一种类型是"null"
此外,还存在以下限制:
- JSON 架构中指定的最大键数为
16
。 - 基础模型 API 不强制执行对象和数组的长度或大小约束。
- 这包括
maxProperties
、minProperties
和maxLength
等关键字。
- 这包括
- 嵌套过多的 JSON 架构将会降低生成质量。 如果可能,请尝试平展 JSON 架构以获得更好的结果。
令牌使用情况
使用提示注入和其他技术来提高工具调用的质量。 这样做会影响模型消耗的输入和输出令牌数量,进而导致计费问题。 使用的工具越多,输入令牌就越多。
限制
以下是公共预览期间函数调用的限制:
- 当前函数调用解决方案针对单轮函数调用进行了优化。 预览期间支持多轮函数调用,但正式版本正在开发中。
- 不支持并行函数调用。
- 最多可以在
tools
中定义 32 个函数。 - 对于预配的吞吐量支持,函数调用仅在新的终结点上受支持。 不能向以前创建的终结点添加函数调用。
笔记本示例
有关详细的函数调用示例,请参阅以下笔记本