aibooks — backend-сервис для работы с PDF-книгами со следующим функционалом:
- загрузка книг;
- OCR распознавание текста;
- векторизация распознанного текста;
- семантический поиск по библиотеке;
- генерация кратких содержаний книг через LLM
Проект написан на Go и построен как асинхронный пайплан: тяжёлые этапы выполняются воркером через очередь, а HTTP-сервер отдаёт API и принимает пользовательские запросы.
- Что делает проект
- Примеры работы проекта
- Архитектура
- Технологии
- Запуск
- HTTP API
- Переменные окружения
- Task-команды
- Структура репозитория
- Наблюдаемость и логи
Основной функционал:
- Пользователь загружает PDF через
POST /books/upload. - Сервер ставит задачу
ocr:bookв asynq. - Воркер:
- конвертирует PDF-страницы в изображения (
pdftoppm); - запускает OCR (
tesseract); - пишет текст в БД (
ocr_pages).
- конвертирует PDF-страницы в изображения (
- Затем воркер запускает
index:book:- делит текст на чанки;
- получает эмбеддинги;
- сохраняет полученные векторы в БД (pgvector).
- Затем
summarize:book:- при помощи LLM осуществляется создание краткого содержания книги;
- сохраняет полученный текст в БД.
- Пользователь делает
POST /searchи получает ответ LLM на основе релевантных фрагментов.
Важно: пока шаги index/summarize не завершились, GET /books/{bookID}/summary может вернуть 404, это ожидаемое поведение.
Компоненты:
aibooks-server— HTTP API, auth, enqueue задач.aibooks-worker— фоновые job handlers (ocr:book,index:book,summarize:book).- PostgreSQL + pgvector — хранение книг, OCR-текста, чанков, эмбеддингов, саммари.
- Redis — очередь Asynq.
- Kafka — транспорт логов.
Поток данных:
client -> server -> redis(asynq) -> worker -> postgres/pgvector -> server -> client
- Go 1.26
- HTTP:
chi,cors, middleware - Queue:
hibiken/asynq - DB:
pgx, PostgreSQL, pgvector - OCR:
poppler-utils,tesseract-ocr - Embeddings: GigaChat
- LLM: DeepSeek
- Logging: stdout + файл + опционально Kafka
- Прочее: Docker Compose, Taskfile
cp .env.example .envЗаполнить минимум:
AIBOOKS_DB_URLAIBOOKS_AUTH_SECRETAIBOOKS_GIGACHAT_AUTH_KEYAIBOOKS_DEEPSEEK_API_KEY
task bootstraptask app:uptask app:healthtask app:logstask app:webGET /healthzPOST /auth/registerPOST /auth/login
GET /booksPOST /books/upload(multipart:file,title,author)POST /searchGET /books/{bookID}/summaryDELETE /books/{bookID}
- общий лимит API;
- отдельный (более строгий) для
/auth/*.
настраивается через AIBOOKS_HTTP_RATE_LIMIT_* и AIBOOKS_HTTP_AUTH_RATE_LIMIT_*.
Ключевые:
AIBOOKS_DB_URL— PostgreSQL DSNAIBOOKS_REDIS_ADDR,AIBOOKS_REDIS_DBAIBOOKS_AUTH_SECRETAIBOOKS_OCR_LANG,AIBOOKS_PDF_DPIAIBOOKS_EMBEDDING_PROVIDER(по умолчаниюgigachat)AIBOOKS_GIGACHAT_AUTH_KEYAIBOOKS_LLM_PROVIDER(по умолчаниюdeepseek)AIBOOKS_DEEPSEEK_API_KEYAIBOOKS_LOG_DIRAIBOOKS_LOG_KAFKA_BROKERS,AIBOOKS_LOG_KAFKA_TOPIC
task
task bootstrap
task infra:up
task infra:down
task infra:reset
task db:migrate
task db:rollback
task app:up
task app:down
task app:logs
task app:server
task app:worker
task app:test
task app:buildcmd/
aibooks-server/ # HTTP REST API
aibooks-worker/ # Asynq worker
internal/
auth/ # JWT-токены и middleware
handlers/ # HTTP хэндлеры
jobs/ # Asynq хэндлеры
ingest/ # пайплайн распознавания текста
chunking/ # разделение на чанки
index/ # пайплайн эмбеддинга
search/ # семантический поиск + генерация LLM ответа
summarize/ # пайплайн суммаризации текста
db/ # работа с базой данных
providers/ # работа с GigaChat API и Deepseek API
ocr/ # распознавание текста
logging/ # логирование (в т.ч. через Kafka)
config/ # загрузка и валидация переменных окружения
migrations/ # миграции
web/ # простой фронтенд для локальных проверок
Логи пишутся в:
- stdout
- файл в
AIBOOKS_LOG_DIR - Kafka (если заданы брокеры)
Топик для Kafka: AIBOOKS_LOG_KAFKA_TOPIC (по умолчанию aibooks.logs).


