Гайд · TNWS AI

Как принять изображение и текст в Gradio Multimodal ChatInterface для vision-модели

4 мин—

Разбираем message с text и files, проверяем путь и объясняем, как не выдать текстовый чат за анализ изображения.

Задача и применимость

Русскоязычный вопрос: «как передать картинку и текст в gradio multimodal chatbot». Интерфейс применим к документированному ChatInterface(multimodal=True). Чтобы реально анализировать изображение, дополнительно нужна мультимодальная модель и её документированный формат image-input; ниже сначала тестируется только приём файла, не притворяясь выполненным vision-инференсом. Документация проверена 20 сентября 2026 года.

Что подтверждено производителем

При multimodal=True первый аргумент fn становится словарём с ключами text и files вместо обычной строки. Интерфейс использует MultimodalTextbox и позволяет загружать медиа. Полученный путь файла нужно отдельно безопасно обработать и закодировать в формат, требуемый конкретным vision API; Gradio не делает анализ изображения самостоятельно.

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

  1. Активируйте multimodal=True и напишите обработчик словаря вместо обработчика строки.
  2. Проверьте, что есть ровно один допустимый файл и непустой вопрос.
  3. Выведите диагностический размер файла без печати полного пути в пользовательский ответ.
  4. При подключении vision-модели замените диагностическую строку документированным мультимодальным запросом.
  5. Протестируйте отказ на отсутствующем изображении и неподдерживаемом содержимом.

Готовый шаблон

Сохраните пример в отдельном файле 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 выясните местоположение обработки и срок хранения; согласие на загрузку в локальный интерфейс не всегда означает согласие на сторонний сервис.

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

  1. text и files читаются из словаря, а не из строки.
  2. Неподходящий тип и большой файл отклоняются до модели.
  3. Никакой «найденный артикул» не возникает до vision-инференса.

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

  • Не выдавать диагностический ответ за распознавание.
  • Не доверять одному файловому расширению.
  • Не отправлять локальный путь как содержимое prompt.

FAQ

Нужна ли vision-модель?

Да, для анализа пикселей.

Что получает fn?

Словарь с text и files.

Почему не виден артикул?

Показанный callback пока проверяет загрузку, а не изображение.

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

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

Нужна ли vision-модель?

Да, для анализа пикселей.

Что получает fn?

Словарь с text и files.

Почему не виден артикул?

Показанный callback пока проверяет загрузку, а не изображение.

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

Комментарии

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