Гайд · TNWS AI
Как принять изображение и текст в Gradio Multimodal ChatInterface для vision-модели
Разбираем message с text и files, проверяем путь и объясняем, как не выдать текстовый чат за анализ изображения.
Задача и применимость
Русскоязычный вопрос: «как передать картинку и текст в gradio multimodal chatbot». Интерфейс применим к документированному ChatInterface(multimodal=True). Чтобы реально анализировать изображение, дополнительно нужна мультимодальная модель и её документированный формат image-input; ниже сначала тестируется только приём файла, не притворяясь выполненным vision-инференсом. Документация проверена 20 сентября 2026 года.
Что подтверждено производителем
При multimodal=True первый аргумент fn становится словарём с ключами text и files вместо обычной строки. Интерфейс использует MultimodalTextbox и позволяет загружать медиа. Полученный путь файла нужно отдельно безопасно обработать и закодировать в формат, требуемый конкретным vision API; Gradio не делает анализ изображения самостоятельно.
Порядок действий
- Активируйте multimodal=True и напишите обработчик словаря вместо обработчика строки.
- Проверьте, что есть ровно один допустимый файл и непустой вопрос.
- Выведите диагностический размер файла без печати полного пути в пользовательский ответ.
- При подключении vision-модели замените диагностическую строку документированным мультимодальным запросом.
- Протестируйте отказ на отсутствующем изображении и неподдерживаемом содержимом.
Готовый шаблон
Сохраните пример в отдельном файле Python. В коде нет реального секрета или скрытого вызова модели: если подключён внешний API, его адрес и параметры указаны явно. Установите gradio в отдельном окружении; дополнительные пакеты требуются только там, где они импортированы в примере.
from pathlib import Path
import gradio as gr
def inspect(message, history):
question = (message.get("text") or "").strip()
files = message.get("files") or []
if not question or len(files) != 1:
return "Добавьте вопрос и одно изображение."
item = files[0]
path = Path(item if isinstance(item, str) else item.get("path", ""))
if path.suffix.lower() not in {".png", ".jpg", ".jpeg"}:
return "Нужен PNG или JPEG."
if not path.is_file() or path.stat().st_size > 5_000_000:
return "Файл недоступен или больше 5 МБ."
return f"Файл принят; размер {path.stat().st_size} байт. Вопрос: {question}"
gr.ChatInterface(inspect, multimodal=True,
title="Проверка загрузки").launch(server_name="127.0.0.1")
Вход и ожидаемый результат
Вход: PNG с надписью AB-17 и сообщение «Какой артикул на фото?» Учебный код вернёт только размер и исходный вопрос, а не AB-17: распознавание начинается лишь после подключения модели. После интеграции ожидаем AB-17 только при успешном чтении изображения; эталон написан человеком и сверяется с реальными пикселями.
Проверка контракта
Расширение файла не доказывает его фактический формат. Этот минимальный фильтр нужен для демонстрации входного контракта, а в реальном сервисе определяйте формат по данным безопасной библиотекой, ограничивайте размер, количество пикселей и длительность обработки. Временный путь выдаётся серверной стороне; не публикуйте его в ответе пользователю и не подставляйте в командную строку. Отдельно продумайте удаление файлов и политика хранения изображений, на которых могут оказаться лица, номера заказов или документы.
Работа с данными пользователя
История multimodal-чата содержит не только строки. Нельзя вслепую сложить содержимое history с новым вопросом и отправить в текстовый endpoint. Для выбранного vision-провайдера составьте явный адаптер: текстовая часть и изображение в поддерживаемом представлении. Проверьте на одном файле, что upstream получил те же байты, ориентация читаема, а ответ ссылается на видимый объект. При отсутствии поддержки картинок у модели UI всё равно будет принимать файл — это не доказательство, что модель его видела.
Что проверить перед развёртыванием
Vision-модели могут ошибаться на мелком тексте, отражённых изображениях и похожих артикулах. Соберите эталонную выборку с несколькими шрифтами, пометками «неразборчиво» и фотографиями без артикула. В ответе с низкой уверенностью лучше попросить более чёткий кадр; не превращайте угадывание в автоматическое изменение складской карточки. При проверке учтите, что передача файла в браузере и доступ к нему внутри модельного процесса — разные стадии, и сбой между ними требует отдельного сообщения пользователю.
Рабочий шаблон вопроса для vision API: «Назови только артикул, если он отчётливо виден. Если изображение нечитаемо или артикула нет, напиши НЕВИДНО. Не добавляй предположений». После ответа обязательно сверяйте полученный код с каталогом допустимых артикулов. Граница в 5 МБ — локальное правило данного демонстрационного приложения, а не заявленный лимит Gradio либо выбранной модели.
Если на фотографии одновременно есть ценник и артикул, фиксируйте заранее, какое поле нужно извлечь. Для приёмки используйте таблицу с именем файла, эталоном, ответом модели и статусом «разборчиво». Снимки, которые модель не распознала, не должны автоматически превращаться в другие похожие артикулы: это риск ошибки учёта. При передаче изображений в удалённый API выясните местоположение обработки и срок хранения; согласие на загрузку в локальный интерфейс не всегда означает согласие на сторонний сервис.
Критерии приёмки
- text и files читаются из словаря, а не из строки.
- Неподходящий тип и большой файл отклоняются до модели.
- Никакой «найденный артикул» не возникает до vision-инференса.
Типичные ошибки и чего не делать
- Не выдавать диагностический ответ за распознавание.
- Не доверять одному файловому расширению.
- Не отправлять локальный путь как содержимое prompt.
FAQ
Нужна ли vision-модель?
Да, для анализа пикселей.
Что получает fn?
Словарь с text и files.
Почему не виден артикул?
Показанный callback пока проверяет загрузку, а не изображение.
Официальные источники
Частые вопросы
Нужна ли vision-модель?
Да, для анализа пикселей.
Что получает fn?
Словарь с text и files.
Почему не виден артикул?
Показанный callback пока проверяет загрузку, а не изображение.
Читайте также
Как добавить ползунок temperature к AI-чату через additional_inputs в Gradio
Связываем Slider и функцию чат-бота без ошибки порядка аргументов; проверяем значение до вызова нейросети.
Как добавить примеры вопросов в Gradio, не вызывая нейросеть по клику
Настраиваем examples и run_examples_on_click=False, чтобы пользователь отредактировал вопрос перед дорогим вызовом модели.
Как группировать запросы к ML-модели через batch=True в Gradio Interface
Сверяем сигнатуру пакетной функции, tuple of lists и max_batch_size на детерминированном тесте.
Комментарии
Пока тихо. Скажите первое слово