Гайд · TNWS AI
Как проверить финальный ответ smolagents через final_answer_checks
Финальная проверка ответа smolagents на обязательную ссылку на код: сигнатура callback, точный пример, пределы булевой проверки и ошибки.
Задача и применимость
Актуальный поисковый запрос: «как валидировать финальный ответ smolagents final_answer_checks». Не принимать финальный ответ, если он не содержит код записи, который пользователь должен сверить. Официальная справка описывает final_answer_checks как список функций, каждая получает финальный ответ, память и сам агент и возвращает boolean. Это последняя проверка формы, а не доказательство истинности всех фактов. Материал сверён 26 сентября 2026 года с официальной документацией Hugging Face smolagents. Документация прямо помечает API экспериментальным, поэтому перед производственным использованием закрепите версию пакета и повторите тесты. Примеры рассчитаны на Python 3.10+; доступ к конкретной модели и провайдеру проверяется в вашем аккаунте, а не предполагается этой инструкцией.
Пошаговая настройка
- Сформулируйте одно детерминированное правило, которое можно проверить без модели.
- Создайте callback с тремя аргументами и булевым результатом.
- Передайте список через
final_answer_checksи ограничьте число шагов. - Протестируйте функцию отдельно на принятом и отклонённом тексте, затем проведите интеграционный прогон.
До сетевого запуска установите smolagents, настройте HF_TOKEN или другой документированный способ аутентификации и вынесите идентификатор модели в HF_MODEL_ID. Не вставляйте действующий токен в код, prompt, скриншот или статью. Сначала выполните детерминированную часть примера без модели, затем интеграционный run. Так ошибка схемы или бизнес-логики не смешивается с изменчивым поведением LLM.
Готовый шаблон
import os
from smolagents import InferenceClientModel, ToolCallingAgent
def contains_record_code(final_answer, memory, agent) -> bool:
return "R-7" in str(final_answer)
assert contains_record_code("Статус R-7: готово", None, None)
assert not contains_record_code("Статус: готово", None, None)
model = InferenceClientModel(model_id=os.environ.get("HF_MODEL_ID", "Qwen/Qwen3-Next-80B-A3B-Thinking"), token=os.getenv("HF_TOKEN"))
agent = ToolCallingAgent(tools=[], model=model, max_steps=3,
final_answer_checks=[contains_record_code])
print(agent.run("Повтори только учебный код R-7."))
Конкретный вход и ожидаемые данные
Строка «Статус R-7: готово» проходит проверку наличия R-7; строка «Статус: готово» — нет. Но первая строка может содержать неверный статус, поэтому практический валидатор должен сверять статус с доверенным результатом tool, а не только искать подстроку. Здесь цель узкая: не потерять идентификатор в финальном представлении.
Почему схема работает
Callback видит память и агента, поэтому возможна более содержательная проверка, однако нельзя без ограничений запускать из него ещё одну модель или побочную запись. Булев отказ даёт агенту возможность продолжить в пределах бюджета, но не гарантирует исправление. Проверяйте чистую функцию модульно. Для структурных требований лучше возвращать структурированные данные там, где это поддерживается, вместо набора хрупких регулярных выражений по прозе.
Фактическая проверка и пограничный случай
Добавьте проверки на r-7, R‑7 с другим символом дефиса и на ложное совпадение R-70. Если требуется точный идентификатор, используйте строгий разбор, а не выражение in. Храните ожидаемый код в доверенном контексте запроса, а не извлекайте его повторно из ответа модели. При исчерпании шагов возвращайте пользователю явную ошибку проверки и не публикуйте отвергнутый текст как окончательный.
Протокол воспроизводимости
Для каждого прогона запишите четыре независимых артефакта: точный обезличенный вход, ожидаемое действие, фактическое действие и предметно правильный результат. Не ограничивайтесь снимком финального ответа: он не показывает, был ли вызван нужный инструмент. Повторите опыт не менее трёх раз на одной модели с одинаковыми настройками, затем отдельно после смены версии. В отчёте различайте ошибку маршрутизации, неверный аргумент, сбой Python-кода и неподтверждённую генерацию. Если результат нестабилен, не выбирайте удачный прогон вручную: укажите долю успеха на фиксированном наборе. Настройки температуры и провайдера фиксируйте только если они действительно переданы вашему model-клиенту. Такой протокол позволяет повторить вывод и не превращает единичный удачный ответ в обещание качества.
Синтаксис Python проверяется до публикации через ast.parse. Выполнение с реальной моделью здесь не заявляется: без учётных данных нельзя честно подтвердить доступность конкретного inference provider и поведение модели. Проверяемая часть примера выполняется локально там, где она не требует LLM. Для сетевой части заранее запишите модель, версию smolagents, вход, ожидаемый tool call и предметный эталон, затем сохраните обезличенную трассу.
Критерии приёмки
- Положительный и отрицательный прямые тесты дают True и False соответственно.
- Интеграционный ответ содержит ожидаемый код без замены символов.
- Отказ валидатора не вызывает неограниченное число новых шагов.
Успешное завершение Python-процесса не равно правильному ответу агента. Сверяйте три слоя отдельно: корректность аргументов tool, фактическое наблюдение из доверенного кода и соответствие финальной фразы этому наблюдению. Если хотя бы один слой не прошёл, результат не должен автоматически попадать в CRM, базу знаний или действие с побочным эффектом.
Типичные ошибки и чего не делать
- Не считайте наличие кода доказательством правильности статуса.
- Не делайте callback с необратимыми побочными эффектами.
- Не обращайтесь к полям памяти, не проверив их контракт в закреплённой версии.
Не увеличивайте число шагов и повторов как универсальное лечение. Сначала найдите первый неверный вызов. Не обещайте одинаковое поведение другой модели или будущей версии библиотеки. Все коды и статусы в примерах вымышлены; заменяя их реальными, соблюдайте авторизацию, минимизацию данных и правила хранения журналов.
FAQ
Что возвращает check?
Булево значение: принимать финальный ответ или нет.
Какие аргументы получает функция?
Финальный ответ, память агента и сам агент.
Можно ли иметь несколько checks?
Да, параметр принимает список функций.
Официальные источники
Частые вопросы
Что возвращает check?
Булево значение: принимать финальный ответ или нет.
Какие аргументы получает функция?
Финальный ответ, память агента и сам агент.
Можно ли иметь несколько checks?
Да, параметр принимает список функций.
Читайте также
Как ограничить число шагов агента smolagents через max_steps
Настройка max_steps в smolagents на читающем инструменте: что именно ограничивается, тест успешного запроса, исчерпание бюджета и критерии.
Как разобрать ошибку агента smolagents через replay и память
Диагностика smolagents через replay, memory.steps и get_full_steps: что смотреть, как обезличить данные и почему трасса не доказывает качество.
Как сбросить память smolagents между пользователями
Сброс memory в smolagents через run(reset=True): два пользователя, тест на отсутствие старого маркера, продолжение reset=False и правила изоляции.
Комментарии
Пока тихо. Скажите первое слово