Tool Calling

Tool calling (function calling) — механизм, которым LLM «действует»: модель возвращает JSON с именем функции и аргументами, а рантайм исполняет реальный вызов (API, shell, БД, web). Это «руки» агента из Agent Anatomy.

Суть

Модель не вызывает функцию сама — она выдаёт структурированный запрос на вызов (JSON), который выполняет код вокруг неё, и результат возвращается в контекст следующим шагом цикла ReAct.

Зачем это нужно

Без инструментов LLM только генерирует текст. Tool calling превращает рассуждение в действие в системах. Точность вызова (правильный инструмент + правильные аргументы) — одна из критичных способностей мозга-агента.

Как работает

  • Спецификация — JSON Schema: name, description, parameters. Хороший description инструмента решает больше, чем выбор модели.
  • Типы: API-вызовы, shell/bash, чтение/запись файлов, запросы к БД, вычисления, web-поиск.
  • Анти-паттерн: 50+ инструментов в одном агенте → падает accuracy. Дробите на subagents (узкий набор tools на агента).
  • Единый стандарт подключения внешних инструментов к любой модели — это MCP.
  • Tool = контракт и точка контроля: описывай что делает / какие входы / что возвращает / какие ограничения. Инструмент — точка контроля безопасности, стоимости и предсказуемости: find_customers(query, limit=5) лучше, чем database(query) (модель понимает, что можно). «Инструмент не прощает плохой подготовки — документация должна быть идеальная».
  • Детерминизм: хороший инструмент детерминирован; @tool-декоратор — лишь способ «научить» модель вызывать действие, а не сама логика.
  • Уточнение про надёжность: function/tool calling задаёт схему как hint — это уровень 2 (≈95–99%), модель может его нарушить. 100%-ю гарантию формата даёт только constrained decoding на уровне генерации (Native Structured Output) — см. Structured Output. То есть «нативный вызов надёжнее промпта» верно, но это ещё не жёсткий контракт.
  • В LangGraph: модель получает инструменты через model.bind_tools([...]) и возвращает tool_calls; их исполняет готовый узел ToolNode, результат возвращается в цикл (см. LangGraph ReAct Loop). Альтернатива «MCP-как-tool» — подключить инструмент как узел графа (LangGraph MCP as Node).

Пример

{ "name": "get_weather",
  "arguments": { "city": "Berlin", "units": "metric" } }

Связано с

  • Agent Anatomy — tool calling = компонент «руки»
  • ReAct — результат вызова = ground truth следующего шага
  • MCP — стандартизация инструментов под все модели
  • Structured Output — function calling = уровень 2; жёсткий контракт даёт constrained decoding
  • LangGraph ReAct Loop — bind_tools + ToolNode в графе LangGraph

Открытые вопросы

  • сколько инструментов на агента до падения accuracy
  • как писать description, чтобы модель не путала инструменты