Перейти к содержанию

Panacea Многофункциональное Введение Документов

Этот рецепт объясняет, как Panacea расширяет вопросы и ответы по документам + RAG (см. рецепт 03) за пределы простого текста до изображений, аудио, видео и таблиц — делая все их доступными для поиска через один и тот же процесс разбиения и встраивания.

Что вы узнаете

  • Как Panacea классифицирует загрузку по типу MIME и направляет ее в специализированный сервис ввода
  • Как изображения и кадры видео преобразуются в индексируемый текст с использованием LLM, способного к визуализации
  • Как аудио (включая аудиодорожку видео) транскрибируется с помощью Whisper
  • Как таблицы преобразуются в Markdown таблицы вместо того, чтобы быть уплощенными в неструктурированный текст
  • Флаги функций и ограничения по размеру, которые регулируют многофункциональное введение

Почему это важно

Tika (стандартный экстрактор текста из документов) может эффективно обрабатывать только текстовые форматы. Без дополнительной обработки загруженное изображение, аудиофайл, видео или таблица либо не будут загружены, либо потеряют всю свою структуру. Вместо этого Panacea определяет тип медиа во время загрузки и вызывает специально разработанный сервис, который производит чистый текст, который затем хранится как document_text и проходит через точно такой же путь извлечения, как и любой другой документ — так что скриншот, запись звонка или таблица продаж становятся доступными для ответов через чат, как это было бы с PDF.

Ключевые файлы Panacea

Файл Почему это важно
Panacea/backend/api_endpoints/documents/handler.py Определяет тип MIME/расширение при загрузке и направляет в правильный сервис ввода
Panacea/backend/services/vision_service.py describe_image() — создает подробное текстовое описание изображения с использованием GPT-4o или Claude vision
Panacea/backend/services/audio_service.py transcribe_audio() — транскрибирует аудио с помощью OpenAI Whisper
Panacea/backend/services/video_service.py Извлекает кадры с помощью ffmpeg, описывает каждый с помощью сервиса визуализации, транскрибирует аудиодорожку и объединяет оба
Panacea/backend/services/tabular_service.py ingest_tabular() — преобразует CSV/TSV/XLSX/XLS/ODS в Markdown таблицы, которые сохраняют заголовки и строки
Panacea/backend/agents/config.py Флаги функций AgentConfig: ENABLE_MULTIMODAL, MAX_IMAGE_BYTES, MAX_AUDIO_BYTES, MAX_VIDEO_BYTES, VIDEO_FRAME_INTERVAL_SECS, VIDEO_MAX_FRAMES

Как это работает

  1. Файл загружается через тот же конечный пункт, который используется для обычных документов; handler.py определяет тип MIME/расширение, чтобы классифицировать его как изображение, видео, аудио, табличный или простой текст/документ.
  2. Изображениеvision_service.describe_image() отправляет изображение (в кодировке base64) в модель, способную к визуализации, с подсказкой, инструктирующей ее транскрибировать любой видимый текст, описывать графики/диаграммы/скриншоты интерфейса и отмечать объекты и компоновку — так что одно описание достаточно для семантического поиска, чтобы найти его позже.
  3. Аудиоaudio_service.transcribe_audio() вызывает Whisper (whisper-1) и возвращает транскрипцию с метаданными о длительности/языке.
  4. Видеоvideo_service извлекает кадры с фиксированным интервалом (VIDEO_FRAME_INTERVAL_SECS, по умолчанию 30с, ограничено VIDEO_MAX_FRAMES) с помощью ffmpeg, описывает каждый кадр с помощью сервиса визуализации, транскрибирует аудиодорожку отдельно и объединяет оба в один документ с временными метками.
  5. Табличныйtabular_service.ingest_tabular() обрабатывает каждый лист нативно (через csv/pandas+openpyxl/xlrd) и отображает его как Markdown таблицу, возвращаясь к простому CSV для строк, превышающих первые 500, чтобы ничего не потерять из индекса поиска, даже если это не отображается красиво.
  6. Любой текст, выходящий из любого из этих сервисов, хранится как document_text и разбивается/встраивается точно так же, как обычный документ, так что его можно извлечь через стандартный поток RAG Q&A из рецепта 03.

Каждый сервис разработан так, чтобы никогда не вызывать ошибки — неудавшийся вызов визуализации, отсутствующая зависимость или слишком большой файл возвращает строку-заполнитель (например, "[Изображение слишком велико для встроенного анализа (23.4 МБ). Ограничение: 20 МБ.]"), так что запись документа всегда создается вместо того, чтобы завершить всю загрузку.

Запустите локально

Из корня рабочего пространства (anote/panacea):

bash cd Panacea cp backend/.env.example backend/.env docker compose up --build

Многофункциональное введение включено по умолчанию (ENABLE_MULTIMODAL=true). Установите эти параметры в backend/.env, чтобы настроить поведение:

bash ENABLE_MULTIMODAL=true # главный переключатель MAX_IMAGE_BYTES=20971520 # 20 МБ по умолчанию MAX_AUDIO_BYTES=26214400 # 25 МБ по умолчанию MAX_VIDEO_BYTES=524288000 # 500 МБ по умолчанию VIDEO_FRAME_INTERVAL_SECS=30 VIDEO_MAX_FRAMES=20

Для ввода видео дополнительно требуется, чтобы ffmpeg был доступен в PATH контейнера бэкенда (уже включен в предоставленный образ Docker). Для ввода Excel требуется openpyxl (XLSX/ODS) и xlrd (устаревший XLS), а оба сервиса визуализации/аудио нуждаются в установленных OPENAI_API_KEY и/или ANTHROPIC_API_KEY в зависимости от DEFAULT_AGENT_MODEL_TYPE.

Попробуйте это

```bash curl -X POST http://localhost:5000/ingest-pdf \ -F chat_id=1 \ -F "files[]=@./screenshot.png"

curl -X POST http://localhost:5000/ingest-pdf \ -F chat_id=1 \ -F "files[]=@./quarterly_sales.xlsx" ```

Затем, в веб-интерфейсе по адресу http://localhost:3000, откройте ту же сессию чата и задайте вопрос о изображении или таблице, которые вы только что загрузили — Panacea ответит на основе сгенерированного описания/Markdown таблицы так же, как это было бы с PDF.

Заметки для кулинарной книги

Этот рецепт хорошо сочетается с рецептом 03: это тот же поток RAG, просто с более широким входным форматом. Стоит отметить читателям, что "качество индекса" для изображений/видео зависит от описания модели визуализации, поэтому настройка подсказок в _INDEXING_PROMPT файла vision_service.py является естественной точкой для кастомизации.