Back to questions
СБЕР
Middle
3
Спроектируй сервис на FastAPI: принимает триггер по расписанию, обрабатывает PDF-документы из Kafka (OCR, выделение сущностей), сохраняет текст + сущности в Postgres. Как бы ты спроектировал структуру?
Companies where asked
Answer from AI
sobes.tech AI
Для такого сервиса на FastAPI я бы спроектировал архитектуру следующим образом:
- Триггер по расписанию
- Использовать
APSchedulerилиCelery Beatдля запуска периодической задачи, которая инициирует обработку.
- Обработка сообщений из Kafka
- Создать отдельный consumer, который слушает топик с PDF-документами.
- При получении сообщения скачивать или получать PDF (если в сообщении ссылка или бинарные данные).
- OCR и выделение сущностей
- Для OCR использовать Tesseract или облачные сервисы (Google Vision, AWS Textract).
- Для выделения сущностей — NLP-библиотеки (spaCy, DeepPavlov) или кастомные модели.
- Сохранение в Postgres
- Таблица
documentsс полями: id, имя файла, дата загрузки, исходный текст. - Таблица
entitiesс полями: id, document_id (FK), тип сущности, значение, позиция в тексте.
- Структура проекта
/app
/api.py # FastAPI endpoints
/kafka_consumer.py # Логика потребления сообщений
/ocr.py # Функции OCR
/ner.py # Выделение сущностей
/db.py # Работа с Postgres через SQLAlchemy
/scheduler.py # Планировщик задач
- Пример кода 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)
- FastAPI можно использовать для мониторинга статуса обработки или ручного запуска задач.
Таким образом, сервис будет модульным, масштабируемым и легко поддерживаемым.