Гайд · TNWS AI

Как принять TXT-документ для RAG через gr.File и проверить его перед индексацией

4 мин—

Ограничиваем тип и размер файла, читаем UTF-8 и отделяем загрузку документа от векторной индексации.

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

Русскоязычный вопрос: «как загрузить txt файл в gradio для rag с проверкой размера». Для Gradio File с type="filepath" и txt-документа на сервере приложения. Установите отдельный лимит файла и проверяйте кодировку; документ и модельный API могут иметь дополнительные ограничения. Официальная справка Gradio по File проверена 20 сентября 2026 года. Пример читает и показывает текст, но ещё не вызывает embeddings.

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

gr.File принимает file_types как список расширений или типов и type со значениями filepath либо binary. По умолчанию filepath даёт ссылку на временный файл в обработчике; binary передаёт байты. Ограничение расширения — это контроль ввода UI, но отдельная проверка содержимого и размера необходима в пользовательском коде.

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

  1. Задайте file_types=[".txt"] и type="filepath" для тестового интерфейса.
  2. Проверьте отсутствие файла и лимит байтов на сервере.
  3. Прочитайте содержимое как UTF-8 и сообщите об ошибке декодирования.
  4. Проверьте количество непустых строк и покажите короткий безопасный предпросмотр.
  5. Только после валидации передавайте текст в разбиение и индекс RAG со стабильным ID.

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

Сохраните пример в отдельном файле Python. В коде нет реального секрета или скрытого вызова модели: если подключён внешний API, его адрес и параметры указаны явно. Установите gradio в отдельном окружении; дополнительные пакеты требуются только там, где они импортированы в примере.

from pathlib import Path
import gradio as gr

def inspect(file_path):
    if file_path is None:
        raise gr.Error("Выберите TXT-файл")
    path = Path(file_path)
    if not path.is_file() or path.stat().st_size > 100_000:
        raise gr.Error("Файл недоступен или больше 100 КБ")
    try:
        text = path.read_text(encoding="utf-8")
    except UnicodeError:
        raise gr.Error("Нужен UTF-8 TXT")
    lines = [s.strip() for s in text.splitlines() if s.strip()]
    return f"Строк: {len(lines)}; первый фрагмент: {lines[0][:60]}" if lines else "Пустой документ"

gr.Interface(inspect, inputs=gr.File(file_types=[".txt"],
             type="filepath"), outputs=gr.Textbox(),
             title="Проверка документа")  .launch(server_name="127.0.0.1")

Вход и ожидаемый результат

Создайте UTF-8 TXT из двух строк: «Возврат 14 дней» и «Доставка по будням». Ожидается «Строк: 2; первый фрагмент: Возврат 14 дней». При пустом файле отображается «Пустой документ», при файле более 100 КБ — ошибка. Число 100 КБ здесь правило учебного сервиса, а не максимальный размер Gradio.

Проверка контракта

При RAG опасно перейти от успешной загрузки к утверждению «документ уже доступен для поиска». Между ними нужно нормализовать текст, нарезать фрагменты, построить embeddings и подтвердить запись в индекс. Проводите отдельный контрольный запрос «Сколько дней на возврат?»; ожидайте doc_id и точный фрагмент с числом 14. Если retrieval не нашёл строку, LLM не должна угадывать срок по общим знаниям.

Работа с данными пользователя

Расширение .txt не доказывает безопасный текст. Файл может содержать секреты, токсичный prompt injection или повреждённую кодировку. Не давайте содержимому документа права системной инструкции и не выполняйте встреченные в нём команды. Ограничьте байты, длину строки, число документов и права загрузившего пользователя; до индексации свяжите запись с tenant_id на сервере. Путь временного файла не должен становиться постоянным doc_id.

Что проверить перед развёртыванием

В демонстрации первые 60 символов документа показываются в UI, поэтому используйте только несекретные тесты. В production вместо фрагмента можно вернуть нейтральные метаданные и результат проверки качества. После окончания обработки удаляйте временные файлы по политике хранения Gradio и приложения. Сохраняйте исходную кодировку и хеш документа, если нужна дедупликация: совпавшее имя файла не значит совпавшее содержимое.

Готовый шаблон для проверки будущего RAG: «Ответь только по retrieved фрагментам. Назови срок возврата и идентификатор источника; если срок не найден, напиши НЕИЗВЕСТНО». Два теста: на описанном TXT ожидаются 14 дней и ID соответствующей строки; на пустом файле поиск не должен выдавать срок. Это проверяет полезный результат конвейера, а не только успешное появление имени файла в браузере.

Для большого корпуса организуйте очередь и отслеживание статуса по каждому документу, но не сообщайте общий успех после первой прочитанной строки. Если документы заменяются новыми редакциями, удаляйте старые фрагменты по стабильному идентификатору и подтверждайте отсутствие дублей. Авторизация чтения результатов поиска столь же важна, как право загрузки файла: общая векторная база без фильтра владельца может выдать чужой документ.

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

  1. Две строки прочитаны как UTF-8 в указанном порядке.
  2. Пустой, большой и невалидный файл обработаны отдельно.
  3. До подтверждения индекса текст не объявлен доступным RAG.

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

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

FAQ

Что возвращает filepath?

Путь к временному файлу на стороне приложения.

Индексирует ли gr.File документ?

Нет.

Почему нужен контроль байтов?

Чтобы ограничить ресурсы и не принимать слишком большой файл.

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

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

Что возвращает filepath?

Путь к временному файлу на стороне приложения.

Индексирует ли gr.File документ?

Нет.

Почему нужен контроль байтов?

Чтобы ограничить ресурсы и не принимать слишком большой файл.

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

Комментарии

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