Леонид Чекин
KNOWLEDGE ASSISTANT · AI / RAG

Как документы
становятся ответами.

Помощник извлекает текст из документов, находит подходящие фрагменты и передаёт только их вместе с вопросом генеративной модели. Ответ возвращается с именами файлов, страницами и цитатами.

Попробовать демо ↗Swagger / OpenAPI ↗Исходный код ↗
КОРОТКОЕ ДЕМО · 22 СЕКУНДЫ

Посмотрите сценарий в действии.

Видео показывает вопрос по встроенному примеру и ответ с источником. В приложении также доступны загрузки после создания аккаунта; данные бесплатного демо могут сбрасываться при перезапуске.

Скачать короткое видео ↗
01 / ПОТОК ДАННЫХ

От файла до ответа.

  1. 01 · ВЕБ-КЛИЕНТReact

    Демо доступно без входа по встроенному примеру; PDF, DOCX и TXT загружаются в библиотеку аккаунта.

  2. 02 · ИЗВЛЕЧЕНИЕFastAPI + парсеры

    Проверяет тип и размер, извлекает текст и сохраняет номер страницы. Временный файл удаляется после обработки.

  3. 03 · ФРАГМЕНТЫChunking + SQLite

    Нормализует текст, создаёт фрагменты по 1 100 символов с перекрытием 160 и сохраняет текст с метаданными источника.

  4. 04 · ПОИСКЛексический retrieval

    Сравнивает слова вопроса и фрагментов, ранжирует совпадения косинусной близостью и выбирает до трёх источников.

  5. 05 · ГЕНЕРАЦИЯOpenRouter · free route

    Сервер передаёт вопрос и найденные выдержки модели. API-ключ хранится только в переменных Render; браузер его не получает.

  6. 06 · РЕЗУЛЬТАТОтвет + источники

    Интерфейс показывает ответ, цитируемые фрагменты и недавние вопросы; история хранится в SQLite.

Граница передачи: оригинальный загруженный файл не отправляется OpenRouter. Провайдер получает вопрос и релевантные извлечённые фрагменты — максимум около 6 000 символов контекста на запрос.
02 / РЕШЕНИЯ

Что происходит внутри.

ПОИСК

Сначала извлечь, потом генерировать

Поиск по словам ограничивает контекст релевантными выдержками. LLM получает только вопрос и эти выдержки, а в системной инструкции ей запрещено исполнять команды, найденные внутри документов.

ИСТОЧНИКИ

Проверяемость ответа

Для каждого результата API возвращает имя файла, страницу, текст выдержки и оценку релевантности. Ответ просят ссылаться на источники, чтобы читатель мог сверить утверждение с документом.

СЕКРЕТЫ

Ключ остаётся на сервере

React вызывает собственный API. FastAPI читает OPENROUTER_API_KEY из окружения, а не из браузера или публичного репозитория.

ОБРАБОТКА

Синхронный путь для небольшого демо

Индексация выполняется в запросе загрузки. Это просто для демонстрации, но большие файлы и пиковая нагрузка требуют очереди задач и ограничений ресурсов.

03 / ПРОФИЛИ РАЗВЁРТЫВАНИЯ

Облако и полная конфигурация.

СлойПубличное демо на RenderПолная конфигурация Compose
Интерфейс / APIReact · FastAPIReact · FastAPI
ДанныеSQLite · файловая система контейнераPostgreSQL · том для загруженных файлов
Поиск / генерацияЛексический поиск · OpenRouter Free routeQdrant-векторы · Ollama embeddings и LLM
Фоновые компонентыЗапросы обрабатываются одним веб-сервисомCompose содержит Redis и Celery worker; обработку индексации можно перенести в задачи
СохранностьДанные могут сбрасываться после перезапуска или простояЛокальные Docker volumes сохраняют данные между перезапусками

Бесплатный профиль позволяет открыть и попробовать приложение без установки. Полный профиль нужен для изучения векторного поиска и локальной модели; это вариант разработки, не отдельный публичный production-сервис.

04 / ИЗВЕСТНЫЕ ОГРАНИЧЕНИЯ

Что добавить перед реальными данными.

Постоянная база: приложение поддерживает PostgreSQL, но текущая успешная версия демо использует временную SQLite на Render.

Файлы и резервные копии: исходный файл удаляется после индексации; нужны объектное хранилище и проверенное восстановление базы.

Уже реализовано: регистрация, изоляция документов и истории по аккаунту и удаление документа владельцем.

Следующие улучшения: подтверждение email, восстановление пароля, очередь индексации и проверка качества retrieval/цитат.