Инструменты (tools) и tool calling

Урок про то, как дать модели функции, которые она может вызывать.

Tool (инструмент) — функция с описанием и схемой аргументов, которую модель может попросить вызвать, чтобы получить данные или выполнить действие.

Зачем модели инструменты

LLM не знает сегодняшнюю погоду, не считает большие числа надёжно и не ходит в вашу базу. Инструменты дают ей «руки»: вы описываете функцию (поиск, калькулятор, запрос к API), а модель по ходу диалога сама решает, когда её вызвать и с какими аргументами. Это превращает модель из «болтуна» в исполнителя.

Объявление инструмента

В LangChain функцию превращают в инструмент декоратором @tool; имя, докстринг и аннотации типов становятся описанием, по которому модель понимает назначение и параметры.

from langchain_core.tools import tool

@tool
def multiply(a: int, b: int) -> int:
    """Перемножает два целых числа."""
    return a * b

model_with_tools = model.bind_tools([multiply])
resp = model_with_tools.invoke("Сколько будет 23 умножить на 17?")
print(resp.tool_calls)   # модель просит вызвать multiply(a=23, b=17)

Сама функция — обычный Python, её можно проверить отдельно:

def multiply(a, b):
    """Перемножает два целых числа."""
    return a * b

print(multiply(23, 17))

Вывод:

391

Как работает под капотом

bind_tools передаёт модели описания инструментов (имя, назначение, схему аргументов). Модель в ответ не вызывает функцию сама — она возвращает tool_calls: имя инструмента и аргументы, которые сочла нужными. Дальше уже ваш код выполняет функцию и при необходимости отправляет результат обратно модели, чтобы та сформулировала финальный ответ. То есть решение «что вызвать» принимает модель, а исполнение — ваш код; это разделение и есть основа безопасности.

Частые ошибки

  • Плохой докстринг. Модель выбирает инструмент по описанию; невнятное описание — неверный выбор.
  • Доверять аргументам модели вслепую. Их нужно валидировать перед выполнением, особенно если инструмент что-то меняет.
  • Считать, что модель сама всё выполнила. Она лишь просит вызов; исполняете вы.

Итог

  • Инструмент — функция с описанием и схемой, которую модель может попросить вызвать.
  • @tool и bind_tools подключают функции к модели.
  • Модель возвращает tool_calls, а выполняет инструмент ваш код.
  • Качество выбора зависит от докстринга; аргументы надо валидировать.
Проверьте себя
1. Что возвращает модель, когда решает воспользоваться инструментом?
AГотовый результат выполнения функции
Btool_calls: имя инструмента и аргументы для вызова
CЭмбеддинг запроса
DОшибку
2. По чему модель понимает, какой инструмент выбрать?
AПо длине имени функции
BПо описанию (докстринг) и схеме аргументов инструмента
CПо температуре
DПо порядку добавления инструментов