Перейти к основному содержанию

Обзор

Вызов функций (также известный как использование инструментов) позволяет моделям ИИ:
  • Вызывать внешние API - Получать данные в реальном времени
  • Выполнять функции - Производить вычисления или операции
  • Обращаться к базам данных - Запрашивать и извлекать информацию
  • Взаимодействовать с системами - Управлять внешними сервисами
  • Связывать операции - Создавать сложные многошаговые рабочие процессы
Параллельный вызов функций: MegaLLM поддерживает одновременное выполнение нескольких функций для улучшения производительности.

Как это работает

1

Определите инструменты

Укажите доступные функции с описаниями JSON Schema
2

ИИ принимает решение

Модель определяет когда и как использовать инструменты на основе контекста
3

Выполните функции

Ваше приложение выполняет запрошенные функции
4

Верните результаты

Отправьте результаты функций обратно в ИИ
5

ИИ отвечает

Модель включает результаты в финальный ответ

Формат определения инструментов

Формат OpenAI

{
  "type": "function",
  "function": {
    "name": "get_weather",
    "description": "Получить текущую погоду в заданном месте",
    "parameters": {
      "type": "object",
      "properties": {
        "location": {
          "type": "string",
          "description": "Город и штат, например Сан-Франциско, Калифорния"
        },
        "unit": {
          "type": "string",
          "enum": ["celsius", "fahrenheit"],
          "description": "Единица температуры"
        }
      },
      "required": ["location"]
    }
  }
}

Формат Anthropic

{
  "name": "get_weather",
  "description": "Получить текущую погоду в заданном месте",
  "input_schema": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string",
        "description": "Город и штат, например Сан-Франциско, Калифорния"
      }
    },
    "required": ["location"]
  }
}

Параметры запроса

Формат OpenAI

ПараметрТипОписание
toolsмассивМассив определений инструментов
tool_choiceстрока/объектУправляет использованием инструментов: auto, required, none, или конкретная функция

Опции выбора инструментов

# Пусть ИИ решает (по умолчанию)
tool_choice="auto"

# Заставить ИИ вызвать функцию
tool_choice="required"

# Запретить вызов функций
tool_choice="none"

# Заставить вызвать конкретную функцию
tool_choice={
    "type": "function",
    "function": {"name": "get_weather"}
}

Примеры

  • Python
  • JavaScript
  • TypeScript
from openai import OpenAI
import json

client = OpenAI(
    base_url="https://ai.megallm.io/v1",
    api_key="your-api-key"
)

# Определите вашу функцию
def get_weather(location: str, unit: str = "celsius"):
    """Получить текущую погоду (симуляция)"""
    return {
        "location": location,
        "temperature": 22,
        "unit": unit,
        "condition": "sunny"
    }

# Определите инструменты для ИИ
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Получить текущую погоду в месте",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "Город и штат, например Сан-Франциско, Калифорния"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"]
                    }
                },
                "required": ["location"]
            }
        }
    }
]

# Начальный запрос
response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {"role": "user", "content": "Какая погода в Лондоне?"}
    ],
    tools=tools,
    tool_choice="auto"
)

message = response.choices[0].message

# Проверьте, хочет ли ИИ вызвать функцию
if message.tool_calls:
    # Выполните функцию
    for tool_call in message.tool_calls:
        function_name = tool_call.function.name
        function_args = json.loads(tool_call.function.arguments)

        if function_name == "get_weather":
            result = get_weather(**function_args)

            # Отправьте результат обратно в ИИ
            follow_up = client.chat.completions.create(
                model="gpt-4",
                messages=[
                    {"role": "user", "content": "Какая погода в Лондоне?"},
                    message,
                    {
                        "role": "tool",
                        "tool_call_id": tool_call.id,
                        "content": json.dumps(result)
                    }
                ]
            )

            print(follow_up.choices[0].message.content)

Параллельный вызов функций

Выполняйте несколько функций одновременно:
# ИИ может вызывать несколько функций одновременно
response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {"role": "user", "content": "Сравни погоду в Лондоне, Париже и Токио"}
    ],
    tools=tools
)

# Обработка нескольких вызовов инструментов параллельно
if response.choices[0].message.tool_calls:
    import asyncio

    async def execute_tool(tool_call):
        function_name = tool_call.function.name
        function_args = json.loads(tool_call.function.arguments)

        result = await async_function_registry[function_name](**function_args)

        return {
            "role": "tool",
            "tool_call_id": tool_call.id,
            "content": json.dumps(result)
        }

    # Выполните все функции параллельно
    tool_results = await asyncio.gather(
        *[execute_tool(tc) for tc in response.choices[0].message.tool_calls]
    )

Продвинутые паттерны

Связывание функций

Создавайте сложные рабочие процессы:
tools = [
    {
        "type": "function",
        "function": {
            "name": "search_products",
            "description": "Поиск товаров",
            "parameters": {
                "type": "object",
                "properties": {
                    "query": {"type": "string"}
                },
                "required": ["query"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "check_inventory",
            "description": "Проверить наличие товара",
            "parameters": {
                "type": "object",
                "properties": {
                    "product_id": {"type": "string"}
                },
                "required": ["product_id"]
            }
        }
    },
    {
        "type": "function",
        "function": {
            "name": "place_order",
            "description": "Оформить заказ",
            "parameters": {
                "type": "object",
                "properties": {
                    "product_id": {"type": "string"},
                    "quantity": {"type": "integer"}
                },
                "required": ["product_id", "quantity"]
            }
        }
    }
]

# ИИ свяжет функции для выполнения сложных задач
# Пример: "Найди синие футболки и закажи 2 штуки, если есть в наличии"
# 1. search_products(query="синяя футболка")
# 2. check_inventory(product_id="...")
# 3. place_order(product_id="...", quantity=2)

Обработка ошибок

def safe_function_call(function_name, arguments):
    try:
        result = function_registry[function_name](**arguments)
        return {"success": True, "result": result}
    except Exception as e:
        return {
            "success": False,
            "error": str(e),
            "error_type": type(e).__name__
        }

# В ответе инструмента
for tool_call in message.tool_calls:
    function_name = tool_call.function.name
    function_args = json.loads(tool_call.function.arguments)

    result = safe_function_call(function_name, function_args)

    messages.append({
        "role": "tool",
        "tool_call_id": tool_call.id,
        "content": json.dumps(result)
    })

Потоковая передача с функциями

stream = client.chat.completions.create(
    model="gpt-4",
    messages=messages,
    tools=tools,
    stream=True
)

function_call = None

for chunk in stream:
    delta = chunk.choices[0].delta

    if delta.tool_calls:
        if function_call is None:
            function_call = {"id": "", "name": "", "arguments": ""}

        tool_call = delta.tool_calls[0]
        if tool_call.id:
            function_call["id"] = tool_call.id
        if tool_call.function.name:
            function_call["name"] = tool_call.function.name
        if tool_call.function.arguments:
            function_call["arguments"] += tool_call.function.arguments

    if chunk.choices[0].finish_reason == "tool_calls":
        # Выполните функцию
        result = execute_function(function_call)

Реальные варианты использования

Помощник по запросам к базе данных

{
  "type": "function",
  "function": {
    "name": "execute_sql",
    "description": "Выполнить SQL-запрос",
    "parameters": {
      "type": "object",
      "properties": {
        "query": {"type": "string"},
        "database": {
          "type": "string",
          "enum": ["users", "products", "orders"]
        }
      },
      "required": ["query", "database"]
    }
  }
}

Агент интеграции API

{
  "type": "function",
  "function": {
    "name": "call_api",
    "description": "Выполнить HTTP API вызов",
    "parameters": {
      "type": "object",
      "properties": {
        "method": {
          "type": "string",
          "enum": ["GET", "POST", "PUT", "DELETE"]
        },
        "url": {"type": "string"},
        "headers": {"type": "object"},
        "body": {"type": "object"}
      },
      "required": ["method", "url"]
    }
  }
}

Операции с файловой системой

{
  "type": "function",
  "function": {
    "name": "read_file",
    "description": "Прочитать содержимое файла",
    "parameters": {
      "type": "object",
      "properties": {
        "path": {"type": "string"}
      },
      "required": ["path"]
    }
  }
}

Лучшие практики

Пишите четкие, подробные описания функций. ИИ использует их для принятия решения когда и как вызывать функции.
  1. Четкие описания - Будьте конкретны в описании того, что делает каждая функция
  2. Валидация входных данных - Всегда проверяйте аргументы функций перед выполнением
  3. Корректная обработка ошибок - Возвращайте информацию об ошибках в ИИ
  4. Используйте подсказки типов - Используйте типы TypeScript/Python для безопасности
  5. Ограничение частоты - Реализуйте ограничение частоты для вызовов внешних API
  6. Безопасность - Валидируйте и очищайте все входные данные функций
  7. Асинхронное выполнение - Используйте async/await для лучшей производительности

Формат ответа

Объект вызова инструмента (OpenAI)

{
  "id": "call_abc123",
  "type": "function",
  "function": {
    "name": "get_weather",
    "arguments": "{\"location\": \"Лондон\", \"unit\": \"celsius\"}"
  }
}

Формат ответа инструмента

{
  "role": "tool",
  "tool_call_id": "call_abc123",
  "content": "{\"temperature\": 22, \"condition\": \"солнечно\"}"
}

Поддержка моделей

Вызов функций поддерживается следующими моделями:
  • OpenAI: gpt-4, gpt-4-turbo, gpt-3.5-turbo
  • Anthropic: claude-3.5-sonnet, claude-opus-4, claude-sonnet-4
  • Другие: Проверьте страницу моделей для полного списка

Связанное