Гайд · TNWS AI
Как принять TXT-документ для RAG через gr.File и проверить его перед индексацией
Ограничиваем тип и размер файла, читаем 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, но отдельная проверка содержимого и размера необходима в пользовательском коде.
Порядок действий
- Задайте file_types=[".txt"] и type="filepath" для тестового интерфейса.
- Проверьте отсутствие файла и лимит байтов на сервере.
- Прочитайте содержимое как UTF-8 и сообщите об ошибке декодирования.
- Проверьте количество непустых строк и покажите короткий безопасный предпросмотр.
- Только после валидации передавайте текст в разбиение и индекс 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 соответствующей строки; на пустом файле поиск не должен выдавать срок. Это проверяет полезный результат конвейера, а не только успешное появление имени файла в браузере.
Для большого корпуса организуйте очередь и отслеживание статуса по каждому документу, но не сообщайте общий успех после первой прочитанной строки. Если документы заменяются новыми редакциями, удаляйте старые фрагменты по стабильному идентификатору и подтверждайте отсутствие дублей. Авторизация чтения результатов поиска столь же важна, как право загрузки файла: общая векторная база без фильтра владельца может выдать чужой документ.
Критерии приёмки
- Две строки прочитаны как UTF-8 в указанном порядке.
- Пустой, большой и невалидный файл обработаны отдельно.
- До подтверждения индекса текст не объявлен доступным RAG.
Типичные ошибки и чего не делать
- Не считать фильтр расширения проверкой содержимого.
- Не применять инструкции внутри документа как системный промпт.
- Не сохранять временный путь в качестве постоянного ID.
FAQ
Что возвращает filepath?
Путь к временному файлу на стороне приложения.
Индексирует ли gr.File документ?
Нет.
Почему нужен контроль байтов?
Чтобы ограничить ресурсы и не принимать слишком большой файл.
Официальные источники
Частые вопросы
Что возвращает filepath?
Путь к временному файлу на стороне приложения.
Индексирует ли gr.File документ?
Нет.
Почему нужен контроль байтов?
Чтобы ограничить ресурсы и не принимать слишком большой файл.
Читайте также
Как добавить ползунок temperature к AI-чату через additional_inputs в Gradio
Связываем Slider и функцию чат-бота без ошибки порядка аргументов; проверяем значение до вызова нейросети.
Как добавить примеры вопросов в Gradio, не вызывая нейросеть по клику
Настраиваем examples и run_examples_on_click=False, чтобы пользователь отредактировал вопрос перед дорогим вызовом модели.
Как группировать запросы к ML-модели через batch=True в Gradio Interface
Сверяем сигнатуру пакетной функции, tuple of lists и max_batch_size на детерминированном тесте.
Комментарии
Пока тихо. Скажите первое слово