立即体验函数调用与结构化输出

立即体验函数调用与结构化输出

现代 AI 模型正在超越简单的文本生成。借助 函数调用 ** 与 ** 结构化输出 ** 等特性,开发者可以构建更智能、更可靠的应用程序。现在,在 Novita AI, 您可以在控制台中 ** 快速查看 模型是否支持这些能力——让集成更快速、更高效。

什么是函数调用?

函数调用是 AI(尤其是大型语言模型,LLM)的一项能力,它使模型能够与外部函数、工具或 API 交互,执行超出文本生成的特定任务。模型不仅仅是生成文本,而是根据用户的提示识别何时需要调用某个函数,确定要调用的正确函数,并指定该函数所需的参数。函数的实际执行由外部系统或应用程序处理,而不是由模型本身执行。

https://www.youtube.com/watch?v=aqdWSYWC\_LI

函数调用如何工作?

函数调用允许 AI 模型在对话过程中与外部工具、API 或内部函数交互。模型不仅仅是生成文本,而是可以 **识别何时需要函数 生成带有结构化参数的函数调用 ,并 ** 执行函数以获取结果。这弥合了自然语言理解与现实世界行动之间的鸿沟,使模型能够自动执行获取实时数据、管理工作流或触发系统操作等任务。

函数调用的好处有哪些?

  • 现实世界交互:模型可以触发行动,而不仅仅是提供信息。
  • 自动化:简化数据检索、预订、表单提交等流程。
  • 结构化理解:模型不再只依赖文本生成,而是将输出组织成预定义格式,减少错误。
  • 增强用例:构建更可靠、更高效的动态应用、助手和系统。
  • 开发者效率:提前了解模型支持函数调用,可以更快规划集成,无需大量修改。

什么是结构化输出?

结构化输出是指大型语言模型(LLM)能够生成符合预定义特定格式的响应,而非自由文本。这些输出通常是机器可读的格式,如 JSON、XML、填写好的模板或表格数据,使其更容易被解析、验证并集成到软件系统或工作流中。

https://youtu.be/NGEZsqEUpC0

结构化输出如何生成

  • 提示词技巧:通过精心设计的提示词引导模型生成所需格式的输出。
  • 函数调用 API:更健壮地,可以使用函数调用接口生成结构化输出,模型返回严格符合函数模式的参数,通常通过设置类似 strict: true 的参数来强制执行。
  • 有限状态机(FSM)引导:在内部,生成过程可以被约束,使得每个生成的 token 都遵守输出格式的规则,减少结构错误。

用例与优势

  • 从非结构化文本中提取结构化数据,例如事件详情、用户信息或查询参数。
  • 使用模型生成的精确参数触发外部 API 或函数。
  • 构建依赖一致且经过验证的数据交换的复杂多步骤工作流。
  • 通过减少模型输出的歧义,提高聊天机器人、数据提取和自动化系统等应用的可靠性。

函数调用与结构化输出

方面 🛠️ 函数调用 🗂️ 结构化输出
目的 触发外部函数 返回结构化信息
导向 动作导向 信息导向
输出 函数名称 + 参数 预定义的结构化数据(例如 JSON)
示例 调用天气 API 获取预报 以 JSON 格式返回天气预报
使用场景 需要模型执行某个动作时 需要干净、可解析的数据但无需动作时

如何在 Novita AI 上检查函数调用和结构化输出?

1: 登录 Novita AI

进入 Novita AI 主页后,点击右上角的 “Log In”“Get Started” 按钮。您可以使用 GoogleGitHubHugging FaceEmail 轻松登录——任您选择!

log in

NOVITA AI LOG IN

立即试用 Novita AI!

在控制台中点击 “Model API”

登录后,您将进入 Novita 控制台仪表盘。从顶部点击 “Model API”。此部分提供了可用模型的完整列表,以及关于它们能力的详细信息——包括是否支持 ** 函数调用 ** 和 ** 结构化输出**。

Step2: Click "Model API" in Console

选择您的模型并检查!

找到您感兴趣的模型,点击它,右侧会弹出一个面板。在 “Supported Capabilities” 下,您将立即看到 ** 函数调用 ** 和 ** 结构化输出** 是否受支持。

Step3: Choose your Model and Check it!

function calling on novita ai

如何在 Novita AI 上使用函数调用?

1. 初始化客户端

首先,使用您的 Novita API 密钥初始化客户端。

from openai import OpenAI
import json

client = OpenAI(
    base_url="https://api.novita.ai/v3/openai",
    # 从以下地址获取 Novita AI API 密钥:https://novita.ai/settings/key-management.
    api_key="<YOUR Novita AI API Key>",
)

model = "meta-llama/llama-4-maverick-17b-128e-instruct-fp8"
  • 定义要调用的函数

接下来,定义模型可以调用的 Python 函数。在此示例中,它是一个获取天气信息的函数。

# 模拟获取天气数据的示例函数。
def get_weather(location):
    """检索给定位置的当前天气。"""
    print("正在调用 get_weather 函数,位置:", location)
    # 在实际应用中,您会在这里调用外部天气 API。
    # 这是一个返回硬编码数据的简化示例。
    return json.dumps({"location": location, "temperature": "60 degrees Fahrenheit"})

2. 构造包含工具和用户消息的 API 请求

现在,向 Novita 端点创建 API 请求。此请求包含 tools 参数,定义了模型可以使用的函数,以及用户的消息。

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取某个位置的天气,用户需要先提供位置",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "城市和州,例如 San Francisco, CA",
                    }
                },
                "required": ["location"]
            },
        }
    },
]

messages = [
    {
        "role": "user",
        "content": "What is the weather in San Francisco?"
    }
]

# 发送请求并打印响应。
response = client.chat.completions.create(
    model=model,
    messages=messages,
    tools=tools,
)

# 请在生产环境中检查响应是否包含工具调用。
tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.model_dump())

3. 输出

{'id': '0', 'function': {'arguments': '{"location": "San Francisco, CA"}', 'name': 'get_weather'}, 'type': 'function'}

4. 以函数调用结果进行回复并获取最终答案

下一步是处理函数调用,执行 get_weather 函数,并将结果发送回模型,以生成对用户的最终回复。

# 确保 tool_call 是从上一步定义的
if tool_call:
    # 扩展对话历史,添加上助手的工具调用消息
    messages.append(response.choices[0].message)

    function_name = tool_call.function.name
    if function_name == "get_weather":
        function_args = json.loads(tool_call.function.arguments)
        # 执行函数并获取响应
        function_response = get_weather(
            location=function_args.get("location"))
        # 将函数响应追加到消息中
        messages.append(
            {
                "tool_call_id": tool_call.id,
                "role": "tool",
                "content": function_response,
            }
        )

    # 从模型获取最终响应,此时已包含函数结果
    answer_response = client.chat.completions.create(
        model=model,
        messages=messages,
        # 注意:此处不要包含 tools 参数。
    )
    print(answer_response.choices[0].message)

5. 输出

{'id': '0', 'function': {'arguments': '{"location": "San Francisco, CA"}', 'name': 'get_weather'}, 'type': 'function'}

如何在 Novita AI 上使用结构化输出?

1. 初始化客户端

首先,使用您的 Novita API 密钥初始化客户端。

from openai import OpenAI

client = OpenAI(
    base_url="https://api.novita.ai/v3/openai",
    # 从以下地址获取 Novita AI API 密钥:https://novita.ai/settings/key-management.
    api_key="<YOUR Novita AI API Key>",
)

# 前往 [Models](https://novita.ai/models) 页面查看支持 `Structured Outputs` 的模型。
model = "mistralai/mistral-7b-instruct"

2. 定义 JSON schema

此示例创建了一个 schema,用于从用户输入中提取费用信息。

# 定义费用追踪的系统提示。
system_prompt = """You are an expense tracking assistant. 
Extract expense information from the user's input and format it according to the provided schema."""

# 定义结构化响应的 JSON schema。
response_format = {
    "type": "json_schema",
    "json_schema": {
        "name": "expense_tracking_schema",
        "schema": {
            "type": "object",
            "properties": {
                "expenses": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "description": {
                                "type": "string",
                                "description": "费用描述"
                            },
                            "amount": {
                                "type": "number",
                                "description": "花费金额(美元)"
                            },
                            "date": {
                                "type": "string",
                                "description": "费用发生日期"
                            },
                            "category": {
                                "type": "string",
                                "description": "费用类别(例如 food、office、travel)"
                            }
                        },
                        "required": [
                            "description",
                            "amount"
                        ]
                    }
                },
                "total": {
                    "type": "number",
                    "description": "所有费用的总金额"
                }
            },
            "required": [
                "expenses",
                "total"
            ],
        },
    },
}

3. 请求聊天补全 API

现在,向 Novita 端点发起聊天补全请求。此请求包含 response_format 参数,定义了上一步中定义的 JSON schema。

chat_completion = client.chat.completions.create(
    model=model,
    messages=[
        {
            "role": "system",
            "content": system_prompt,
        },
        {
            "role": "user",
            "content": """I spent $120 on dinner at an Italian restaurant last Friday with my colleagues.
Also bought office supplies for $45 on Monday.""",
        },
    ],
    max_tokens=1024,
    temperature=0.8,
    stream=False,
    response_format=response_format,
)

response_content = chat_completion.choices[0].message.content

# 解析并美化 JSON
try:
    json_response = json.loads(response_content)
    prettified_json = json.dumps(json_response, indent=2)
    print(prettified_json)
except json.JSONDecodeError:
    print("无法将响应解析为 JSON。原始响应:")
    print(response_content)

4. 输出:

{
  "expenses": [
    {
      "date": "2023-03-17",
      "description": "Dinner at Italian restaurant",
      "amount": 120,
      "category": "Food & Dining"
    },
    {
      "date": "2023-03-13",
      "description": "Office supplies",
      "amount": 45,
      "category": "Office Supplies"
    }
  ],
  "total": 165
}

函数调用和结构化输出极大地扩展了 AI 模型的能力。无论您是希望自动化工作流、获取实时数据,还是提取结构化信息,Novita AI 都能让您轻松找到满足需求的模型。立即前往 Novita 控制台 探索模型,开始构建更智能的应用程序吧!

常见问题

AI 模型中的函数调用是什么?

它允许模型通过基于用户提示生成结构化函数调用来触发外部工具或 API。

什么是结构化输出?

结构化输出是指模型以严格的、机器可读的格式(如 JSON)返回响应,非常适合轻松集成。

函数调用和结构化输出有何不同?

函数调用以动作为导向(例如获取天气),而结构化输出侧重于返回干净、格式化的数据。

Novita AI 是一个一站式云平台,助力您的 AI 雄心。集成 API、无服务器、GPU 实例——您所需的经济高效工具。免去基础设施烦恼,从免费开始,让您的 AI 愿景成为现实。

推荐阅读