Инструменты (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, а выполняет инструмент ваш код. - Качество выбора зависит от докстринга; аргументы надо валидировать.