Гайд · TNWS AI

Как дать DSPy ReAct только читающий инструмент для ответа по справке

5 мин—

Подключаем 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 — модель может выбрать инструмент не так, как вы ожидали.

Порядок действий

  1. Создайте ограниченный вымышленный словарь фактов и читающую функцию с понятной аннотацией.
  2. Назовите инструмент так, чтобы его действие было ясно модели; не передавайте ему ключи записи.
  3. Создайте dspy.ReAct с единственным tool и установленным max_iters.
  4. Запросите конкретный факт и просмотрите результат и trajectory.
  5. Проверьте отсутствие ответа в базе отдельным вопросом и не допускайте выдуманного правила.

Для сетевого запуска установите пакет командой 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 — вымышленная ссылка для примера. Для реальной поддержки используйте идентификатор документа и его редакцию, сверяйте ответ с фактическим текстом, а не с памятью модели. Если инструмент возвращает слишком длинный частный документ, он попадёт в контекст и, возможно, в трассы; очищайте чувствительные поля до передачи. При инъекциях внутри хранимых документов модель не должна повышать права текста инструмента до системных инструкций. Контроль доступа и проверка действия остаются задачей вызывающей программы.

Критерии приёмки

  1. Агенту передан только читающий инструмент.
  2. По возврату ответ соответствует R-17 и trajectory показывает фактические шаги.
  3. При НЕТ_ДАННЫХ нет придуманного бизнес-условия.

Если критерий не выполнен, сначала разделите четыре причины: доступ к модели, контракт полей, поведение самого модуля и правильность предметного ответа. Один успешно выполненный Python-вызов подтверждает только часть этих условий. Сохраняйте минимальный безопасный пример и сравнивайте версии по одинаковым вопросам; не используйте реальные имена клиентов, токены или закрытые документы для отладки в общих журналах. Когда сценарий требует инференса, точные формулировки ответов и затраты зависят от выбранной модели, поэтому в статье заданы проверяемые свойства, а не выдуманные гарантии.

Типичные ошибки и чего не делать

  • Не рассчитывайте, что max_iters заставит вызвать инструмент.
  • Не добавляйте функции записи при задаче чтения.
  • Не считайте текст из базы привилегированной инструкцией.

Частые вопросы

Что хранит trajectory?

Шаги, вызовы инструментов и наблюдения.

Всегда ли ReAct вызывает инструмент?

Нет, решение принимает модель.

Делает ли max_iters инструмент безопасным?

Нет, безопасность зависит от доступных функций и проверок.

Официальные источники

Частые вопросы

Что хранит trajectory?

Шаги, вызовы инструментов и наблюдения.

Всегда ли ReAct вызывает инструмент?

Нет, решение принимает модель.

Делает ли max_iters инструмент безопасным?

Нет, безопасность зависит от доступных функций и проверок.

Читайте также

Комментарии

Пока тихо. Скажите первое слово