Гайд · TNWS AI
Как проверить RAG-шаблон LlamaIndex RichPromptTemplate до вызова модели
Jinja-переменные context_str и query_str, предпросмотр format и отдельная проверка поведения генератора.
Задача и применимость
Поисковый запрос: «как форматировать RichPromptTemplate LlamaIndex context_str query_str». Факты и синтаксис сверены с официальной документацией LlamaIndex Framework для Python 19 сентября 2026 года. Пример предназначен для актуального Python-пакета llama-index и указанных в коде интеграций; доступность конкретной модели и конфигурация её провайдера зависят от среды запуска. Если код обращается к embeddings или LLM, ключ задаётся через серверное окружение и здесь не приводится. Точный релиз локально не установлен, поэтому перед рабочим запуском фиксируйте номер установленной версии и повторите тест на ней.
В руководстве LlamaIndex RichPromptTemplate описан как актуальный шаблонизатор с Jinja-подобным синтаксисом. format(context_str=..., query_str=...) возвращает строковый prompt для completion API, format_messages формирует сообщения для chat API. PromptTemplate и ChatPromptTemplate названы более старыми простыми вариантами. Формирование текста шаблона само по себе не является запуском LLM.
Нумерованный порядок работы
- Определите входы context_str и query_str и отдельно зафиксируйте разрешённый источник контекста.
- Запишите шаблон с явным правилом отвечать лишь по предоставленному тексту и сообщать об отсутствии факта.
- Выполните format на одном положительном тесте, затем на пустом контексте; посмотрите полученные строки.
- Для chat API проверьте format_messages и структуру ролей перед сетевым вызовом.
- В отдельно размеченном тесте LLM проверьте ответы на факт, отсутствующий факт и вредоносную инструкцию внутри источника.
Готовый шаблон Python
from llama_index.core.prompts import RichPromptTemplate
template = RichPromptTemplate("""Контекст документа:
{{ context_str }}
Вопрос пользователя: {{ query_str }}
Отвечай только по контексту; если факта нет, напиши «Нет данных».
Ответ с проверяемым фрагментом: """)
prompt = template.format(
context_str="Политика R7: срок возврата 14 дней.",
query_str="Каков срок возврата?",
)
print(prompt)
print(template.format_messages(context_str="", query_str="Адрес офиса?"))
Код ниже в статье предназначен для тестовых источников без персональных сведений. Вызовы SDK не выполнялись в данном окружении с реальной моделью; синтаксис Python проверен отдельно. Не переносите вывод демонстрационного эксперимента на любой корпус и любого провайдера без повторной проверки.
Пример входа и ожидаемого результата
Вход: контекст «срок возврата 14 дней» и вопрос о сроке. Ожидаемая сформированная строка содержит вопрос, факт и инструкцию о запрете догадок. Во втором примере пустой контекст и вопрос об адресе: рендеринг допустим, но ожидаемый ответ «Нет данных» сможет подтвердить только последующий тест модели.
Сохраните входные файлы, идентификаторы документов и ожидаемое утверждение в отдельном проверочном наборе. При неуспехе выделяйте слой ошибки: чтение источника, преобразование в nodes, получение embedding, поиск, синтез ответа или UI. Правильная форма ответа ещё не гарантирует правильного происхождения сведений.
Диагностика и границы решения
У шаблона две разные проверки. Первая — детерминированный рендеринг: подставились ли переменные, сохранилась ли кириллица, не исчезло ли отрицание. Вторая — поведение генератора: следует ли он ограничению «только по контексту». Успех первой не гарантирует второй. Если пользователь может управлять context_str, он может поместить туда инструкцию «игнорируй правила»; обрабатывайте источник как недоверенные данные и отдельно проверяйте изоляцию ролей. Шаблон не узнаёт самостоятельно, какой из двух противоречащих документов действует сейчас; актуальность и полномочия решаются до подачи контекста. Не подменяйте query_str содержимым другого пользователя при кешировании. При длинном context_str измеряйте фактическое число токенов модели, иначе нужный факт может быть обрезан. Из примера нельзя выводить названия настроек графического интерфейса: здесь только Python API.
Дополнительный проверочный сценарий
Сделайте набор из четырёх кейсов: найденный срок 14 дней, отсутствующий адрес, текст с двумя редакциями сроков и контекст с инструкцией-вредителем. На этапе format проверяйте точное включение только разрешённых данных; на этапе LLM сравнивайте фактические ответы с ручной разметкой. Для конфликтных редакций промпт должен получать от приложения только актуальный источник либо явно помеченные версии, иначе модель выберет случайное правило. Если вам требуется структурированный вывод, не считайте добавление слова «JSON» в текст гарантией валидной схемы: нужна отдельная проверка результата. При редактуре шаблона сохраняйте тестовые снимки строк, чтобы видеть, не поменялся ли порядок и роль контекста. Для воспроизводимости фиксируйте версию LlamaIndex и настройки используемой модели.
Критерии проверки
- Обе переменные присутствуют в рендере.
- Пустой контекст не маскируется вымышленным источником.
- Ответ модели проверен отдельно от format.
Помимо положительного теста проводите отрицательный: отсутствующий факт, чужой документ, старая редакция либо несовместимая модель — в зависимости от задачи. Если одна проверка не проходит, не объявляйте настройку готовой. При работе с чужими источниками доступ к исходнику и цитате должен проверяться отдельно от поисковой релевантности.
Типичные ошибки и что не делать
- Не считать форматирование тестом истинности LLM.
- Не доверять инструкциям внутри контекста.
- Не смешивать версии правил в одном неразмеченном фрагменте.
Не передавайте ключи, личные документы и приватные пути в опубликованный пример или сторонний trace без оценки прав доступа. Не исправляйте отсутствие нужного текста одним только промптом: генератор не восстановит источник, который не загрузили или не нашли. При смене модели либо backend повторяйте тест на зафиксированном наборе вопросов.
FAQ
Что возвращает format?
Текстовый prompt.
Для чего format_messages?
Для подготовки сообщений chat API.
Гарантирует ли шаблон отказ без данных?
Нет, это отдельное поведение модели для проверки.
Официальные источники
Частые вопросы
Что возвращает format?
Текстовый prompt.
Для чего format_messages?
Для подготовки сообщений chat API.
Гарантирует ли шаблон отказ без данных?
Нет, это отдельное поведение модели для проверки.
Читайте также
Как измерить hit rate и MRR поиска в LlamaIndex RetrieverEvaluator
Размеченный вопрос, expected_ids и оценка позиции релевантного узла до тестирования ответов генератора.
Как ограничить размер пакета при индексации в LlamaIndex VectorStoreIndex
insert_batch_size при from_documents: контролируем память и задержки загрузки, не путая пакет с размером чанка.
Как обновить одну редакцию документа в LlamaIndex без смешивания версий
Стабильный id_, update_ref_doc и контроль старого и нового правила в поисковой выдаче.
Комментарии
Пока тихо. Скажите первое слово