Sobes.tech
Back to questions
Middle
3

Спроектируй сервис на FastAPI: принимает триггер по расписанию, обрабатывает PDF-документы из Kafka (OCR, выделение сущностей), сохраняет текст + сущности в Postgres. Как бы ты спроектировал структуру?

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

Для такого сервиса на FastAPI я бы спроектировал архитектуру следующим образом:

  1. Триггер по расписанию
  • Использовать APScheduler или Celery Beat для запуска периодической задачи, которая инициирует обработку.
  1. Обработка сообщений из Kafka
  • Создать отдельный consumer, который слушает топик с PDF-документами.
  • При получении сообщения скачивать или получать PDF (если в сообщении ссылка или бинарные данные).
  1. OCR и выделение сущностей
  • Для OCR использовать Tesseract или облачные сервисы (Google Vision, AWS Textract).
  • Для выделения сущностей — NLP-библиотеки (spaCy, DeepPavlov) или кастомные модели.
  1. Сохранение в Postgres
  • Таблица documents с полями: id, имя файла, дата загрузки, исходный текст.
  • Таблица entities с полями: id, document_id (FK), тип сущности, значение, позиция в тексте.
  1. Структура проекта
/app
  /api.py          # FastAPI endpoints
  /kafka_consumer.py # Логика потребления сообщений
  /ocr.py          # Функции OCR
  /ner.py          # Выделение сущностей
  /db.py           # Работа с Postgres через SQLAlchemy
  /scheduler.py    # Планировщик задач
  1. Пример кода Kafka consumer (упрощённо):
from kafka import KafkaConsumer
import json

consumer = KafkaConsumer('pdf_topic', bootstrap_servers='localhost:9092')

for msg in consumer:
    data = json.loads(msg.value)
    pdf_path = data['pdf_path']
    text = ocr_process(pdf_path)
    entities = extract_entities(text)
    save_to_db(pdf_path, text, entities)
  1. FastAPI можно использовать для мониторинга статуса обработки или ручного запуска задач.

Таким образом, сервис будет модульным, масштабируемым и легко поддерживаемым.