指南

函数调用

将 xAI 模型连接到外部工具和系统,以构建 AI 助手和各种集成。

通过流式响应,函数调用将以一个完整的块返回,而不是分块流式传输。

简介

函数调用使语言模型能够使用外部工具,从而将模型与数字和物理世界紧密连接。

这是一项强大的功能,可用于实现各种用例。

  • 调用公共 API,进行从查询足球比赛结果到获取实时卫星定位数据等操作
  • 分析内部数据库
  • 浏览网页
  • 执行代码
  • 与物理世界交互(例如预订机票、打开特斯拉车门、控制机器人手臂)

演练

函数调用的请求/响应流程可通过以下插图演示。

Function call request/response flow example

您可以将其视为 LLM 发起 RPC(远程过程调用) 到用户系统。从 LLM 的角度来看,“2. 响应”是 LLM 到用户系统的 RPC 请求,“3. 请求”是包含 LLM 所需信息的 RPC 响应。

一个简单的本地计算机/服务器示例,其中计算机/服务器确定 Grok 的响应是否包含 tool_call,并调用本地定义的函数来执行用户定义的动作

Local computer/server setup for function calling

整个过程的伪代码如下所示

我们将在以下 Python 脚本中演示函数调用。首先,我们创建一个 API 客户端


准备 - 定义工具函数和函数映射

将工具函数定义为回调函数,以便在模型响应中请求它们时调用。

通常,这些函数会从数据库检索数据,或调用另一个 API 端点,或执行一些操作。出于演示目的,我们硬编码返回 59° 华氏度/15° 摄氏度的温度和 15,000 英尺的云层高度。

参数定义将在初始请求中发送给 Grok,因此 Grok 知道有哪些工具和参数可供调用。

为了减少人为错误,您可以使用 Pydantic 部分定义工具。

使用 Pydantic 定义函数

使用原始字典定义函数

创建字符串 -> 函数映射,以便在模型发送其名称时我们可以调用该函数。例如:


1. 发送初始消息

定义好所有函数后,是时候向 Grok 发送我们的 API 请求了!

现在,在我们发送之前,让我们看看新任务的通用请求体是什么样子的。

这里我们假设之前已经调用过工具。请注意,工具调用被引用了三次

  • 通过“消息历史”助手的第一次响应中的 idname
  • 通过“消息历史”工具内容中的 tool_call_id
  • 在请求体的 tools 字段中
Function call new request body

现在我们编写请求体中的请求消息并将其发送到 Grok。Grok 应该返回一个要求我们进行工具调用的响应。


2. 如果 Grok 要求进行工具调用,则运行工具函数并将函数返回值添加到消息中

我们检索 Grok 想要调用的工具函数名称和参数,运行这些函数,并将结果添加到消息中。

此时,您可以选择 仅使用结果响应工具调用添加新的用户消息请求

tool 消息将包含以下内容

我们尝试组装并发送回 Grok 的请求体。请注意,它与新任务请求体略有不同

Request body after processing tool call

添加消息的相应代码


3. 将工具函数返回值发送回模型以获取响应


4.(可选)继续对话

您可以按照步骤 2 继续对话。否则您可以终止。


函数调用模式

默认情况下,模型将根据 tool_choice: "auto" 设置,自动决定是否需要函数调用并选择要调用的函数。

我们提供三种自定义默认行为的方法

  1. 要强制模型始终调用一个或多个函数,您可以设置 tool_choice: "required"。模型将始终调用函数。请注意,这可能会强制模型产生幻觉参数。
  2. 要强制模型调用特定函数,您可以设置 tool_choice: {"type": "function", "function": {"name": "my_function"}}
  3. 要禁用函数调用并强制模型仅生成面向用户的消息,您可以不提供任何工具,或设置 tool_choice: "none"

并行函数调用

默认情况下,并行函数调用是启用的,因此您可以在一个请求/响应周期中处理多个函数调用。当需要两个或多个工具调用时,所有工具调用请求将包含在响应体中。您可以通过设置 parallel_function_calling : "false" 来禁用它。