本文介绍了函数调用以及如何将其用作生成式 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 限制 ,了解区域可用性。
- 有关外部模型提供的模型,请参阅区域可用性了解区域可用性。
重要
从 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 应用程序一起使用,必须提供 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-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
的正则表达式。 - 使用以下方法进行复杂的嵌套或架构组合和验证:
anyOf
、oneOf
、allOf
、prefixItems
或$ref
。 - 类型列表,但
[type, “null”]
的特殊情况除外,其中列表中的一种类型是有效的 JSON 类型,另一种类型是"null"
此外,还存在以下限制:
- JSON 架构中指定的最大键数为
16
。 - 基础模型 API 不强制执行对象和数组的长度或大小约束。
- 这包括
maxProperties
、minProperties
和maxLength
等关键字。
- 这包括
- 大量嵌套的 JSON 架构会导致质量较低的生成。 如果可能,请尝试平展 JSON 架构以获得更好的结果。
令牌使用情况
使用提示注入和其他技术来提高工具调用的质量。 这样做会影响模型消耗的输入和输出令牌数量,进而导致计费问题。 使用的工具越多,输入令牌就越多。
限制
以下是公共预览期间函数调用的限制:
- 当前函数调用解决方案针对单轮函数调用进行了优化。 预览期间支持多轮函数调用,但其开发仍在进行中。
- 不支持并行函数调用。
- 最多可以在
tools
中定义 32 个函数。 - 对于预配的吞吐量支持,函数调用仅在新的终结点上受支持。 不能向以前创建的终结点添加函数调用。
笔记本示例
有关详细的函数调用示例,请参阅以下笔记本