Урок 4. Инструменты
Чтобы LLM мог позвать инструмент, нужен контракт: имя, описание и параметры. Модель читает список инструментов в промпте и отвечает JSON-вызовом, а Harness из урока 3 исполняет его.
Что прочитать
- Вызов инструментов — как модель превращает решение в вызов
- Пять категорий инструментов — какие вообще бывают инструменты
- Протокол MCP — стандарт подключения инструментов (в нашем курсе — простые локальные функции; MCP — тема отдельного гайда)
В коде
Спека инструментов для системного промпта:
TOOLS_SPEC = """
- calc(expr: строка) — считает арифметическое выражение, напр. "123*45"
- time() — текущие время и дата
"""
Сами инструменты:
import datetime
def calc(expr):
# без __builtins__ внутри eval нельзя импортировать — первое ограждение
return eval(expr, {"__builtins__": {}}, {})
def time():
return datetime.datetime.now().strftime("%H:%M %d.%m.%Y")
const TOOLS = {
calc: (args) => Function('"use strict"; return (' + args.expr + ')'),
time: () => new Date().toLocaleString("ru-RU"),
};
JSON-вызов, который мы ждём от модели (ровно его парсит parse_tool из урока 2):
{"tool": "calc", "args": {"expr": "123*45"}}
Попробуй calc("abs(-3)") — упадёт с ошибкой, потому что abs недоступна. Это не баг, а ограждение: инструмент умеет ровно то, что ему разрешили.
Практика
Добавь третий инструмент для своего агента — например, dice(граней) или flip(). Запиши его спеку (что делает, какие параметры) и реализацию на Python и JS. Проверь руками вызов и JSON-ответ.
Связано: Урок 3. Harness и ограждения, Урок 5. Сборка CLI-агента