Гайд · TNWS AI
Как дать DSPy ReAct только читающий инструмент для ответа по справке
Подключаем read-only функцию словаря к ReAct, ограничиваем число итераций и проверяем источник ответа.
Задача и применимость
Актуальный поисковый вопрос: «как добавить безопасный tool в dspy ReAct для поиска ответа в справке». Позволить агенту находить факт в разрешённой базе без доступа к удалению или изменению данных. Материал основан на текущем официальном руководстве DSPy, проверенном 20 сентября 2026 года, и предназначен для Python 3.10+ с совместимым установленным dspy. У разных провайдеров разные доступные модели, лимиты и права: укажите собственный реально работающий provider/model в переменных окружения. Фиксируйте установленную версию пакета при повторении опыта, поскольку API может меняться.
Как устроено решение
Руководство DSPy говорит, что tool для ReAct — обычная Python-функция; имя, docstring и параметры входят в инструкции модели. Это делает выбор функций решением об уровне полномочий: read-only lookup_rule допускает чтение учебной записи и ничего не меняет. Даже если модель ошибочно вызовет инструмент с неизвестной темой, результатом будет предсказуемый маркер отсутствия. Не выдавайте агенту функции отправки email, оплаты или удаления ради простого FAQ — модель может выбрать инструмент не так, как вы ожидали.
Порядок действий
- Создайте ограниченный вымышленный словарь фактов и читающую функцию с понятной аннотацией.
- Назовите инструмент так, чтобы его действие было ясно модели; не передавайте ему ключи записи.
- Создайте dspy.ReAct с единственным tool и установленным max_iters.
- Запросите конкретный факт и просмотрите результат и trajectory.
- Проверьте отсутствие ответа в базе отдельным вопросом и не допускайте выдуманного правила.
Для сетевого запуска установите пакет командой pip install dspy, подготовьте свой доступ к модели и задайте DSPY_MODEL в форме provider/model и DSPY_API_KEY в окружении. Исключение — код, который только проверяет локальные настройки без сетевого вызова. Шаблон ниже содержит вымышленные входные данные и не включает секретов; перед запуском сверьте, что выбранная вами модель подходит для задачи и разрешена правилами провайдера.
Готовый пример программы
import os
import dspy
dspy.configure(lm=dspy.LM(os.environ["DSPY_MODEL"], api_key=os.environ["DSPY_API_KEY"]))
KB = {"возврат": "Для возврата нужна заявка R-17."}
def lookup_rule(topic: str) -> str:
"""Прочитать учебное правило по точной теме, без изменения данных."""
return KB.get(topic.lower().strip(), "НЕТ_ДАННЫХ")
agent = dspy.ReAct("question -> answer", tools=[lookup_rule], max_iters=3)
result = agent(question="Что требуется для возврата?")
print(result.answer)
print(result.trajectory)
Вход и ожидаемый результат
Вход — вопрос «Что требуется для возврата?» и локальная запись «Для возврата нужна заявка R-17.». Ожидаемый по фактам ответ упоминает заявку R-17, если агент обратился к справке. Для темы «доставка» инструмент должен вернуть НЕТ_ДАННЫХ; результат модели при таком вопросе проверяйте на отсутствие придуманных сроков.
Проверка качества, а не только запуска
max_iters задаёт ограничение шагов агентного цикла, но не гарантирует, что инструмент вообще будет вызван: официальная документация отмечает случаи, когда агент сразу завершал задачу. Поэтому наличие верного ответа и наличие следа lookup_rule — разные критерии. Посмотрите trajectory для каждого теста: увидите запрос инструмента и его наблюдение, либо отсутствие такого вызова. Если агент ответил правильно без инструмента на общеизвестный факт, это не доказательство, что при изменении частной политики он будет пользоваться свежей базой.
У ReAct граница доверия проходит не по названию агента, а по фактическим возможностям переданной функции. Если функция лишь читает фиксированный словарь, даже ошибочный выбор инструмента не меняет состояние системы. Проверьте отдельно известный ключ, неизвестный ключ и запрос, который пытается заставить инструмент записать данные: последний не должен иметь технического способа это выполнить. Логи инструмента должны фиксировать безопасный ключ и результат поиска, но не ключ API модели и не полный приватный запрос. При переходе на сетевой источник добавьте независимые ограничения доступа, таймауты и разрешённый список адресов на стороне приложения. Текст инструкции агенту не является эквивалентом таких ограничений.
Особые случаи и границы
Строка R-17 — вымышленная ссылка для примера. Для реальной поддержки используйте идентификатор документа и его редакцию, сверяйте ответ с фактическим текстом, а не с памятью модели. Если инструмент возвращает слишком длинный частный документ, он попадёт в контекст и, возможно, в трассы; очищайте чувствительные поля до передачи. При инъекциях внутри хранимых документов модель не должна повышать права текста инструмента до системных инструкций. Контроль доступа и проверка действия остаются задачей вызывающей программы.
Критерии приёмки
- Агенту передан только читающий инструмент.
- По возврату ответ соответствует R-17 и trajectory показывает фактические шаги.
- При НЕТ_ДАННЫХ нет придуманного бизнес-условия.
Если критерий не выполнен, сначала разделите четыре причины: доступ к модели, контракт полей, поведение самого модуля и правильность предметного ответа. Один успешно выполненный Python-вызов подтверждает только часть этих условий. Сохраняйте минимальный безопасный пример и сравнивайте версии по одинаковым вопросам; не используйте реальные имена клиентов, токены или закрытые документы для отладки в общих журналах. Когда сценарий требует инференса, точные формулировки ответов и затраты зависят от выбранной модели, поэтому в статье заданы проверяемые свойства, а не выдуманные гарантии.
Типичные ошибки и чего не делать
- Не рассчитывайте, что max_iters заставит вызвать инструмент.
- Не добавляйте функции записи при задаче чтения.
- Не считайте текст из базы привилегированной инструкцией.
Частые вопросы
Что хранит trajectory?
Шаги, вызовы инструментов и наблюдения.
Всегда ли ReAct вызывает инструмент?
Нет, решение принимает модель.
Делает ли max_iters инструмент безопасным?
Нет, безопасность зависит от доступных функций и проверок.
Официальные источники
Частые вопросы
Что хранит trajectory?
Шаги, вызовы инструментов и наблюдения.
Всегда ли ReAct вызывает инструмент?
Нет, решение принимает модель.
Делает ли max_iters инструмент безопасным?
Нет, безопасность зависит от доступных функций и проверок.
Читайте также
Как задать простой русскоязычный вопрос через DSPy Predict и Signature
Пишем сигнатуру question -> answer и проверяем поля Prediction на безопасном тесте справочного ответа.
Как оптимизировать инструкции DSPy через GEPA без утечки тестового набора
Разделяем примеры, метрику и reflection LM перед компиляцией GEPA; оцениваем итог на отдельном отложенном наборе.
Как подключить языковую модель к DSPy и проверить первый вызов
Подключаем DSPy к доступной модели через переменные окружения и отделяем ошибку соединения от ошибки сигнатуры.
Комментарии
Пока тихо. Скажите первое слово