Демка · 7 сентября 2026

TenderLens

HTML разбивается на фрагменты и индексируется через очередь. Поиск идёт в pgvector, ответ содержит ссылки на найденные куски. В демке четыре тестовых документа. Embeddings и LLM замоканы, внешний crawler отключён.

История реализации: с 20 августа 2026. Публичное демо: 7 сентября 2026.Версия a618d1e712 кадров интерфейса

01 / Задача

Поиск по документам: FastAPI и pgvector

Нужен поиск по своему набору документов. У ответа должны быть ссылки на исходные фрагменты. Если ничего подходящего не найдено, ответ об этом и сообщает.

Сценарий: Поиск и разбор набора документов.

Что делал

  • Нормализация документов, индексация через события и хранение chunks.
  • API поиска и ответа со ссылками. Отдельный ответ при пустом контексте.
  • Тестовый корпус, детерминированные моки AI и лимиты на сессию.

Скриншоты

Экраны, формы, ошибки

Скриншоты, схемы и исходные материалы сохранены на языке оригинала; подписи и описание переведены.

02 / Технологии

Что использовано

FastAPI / Pydantic

HTTP-контракты, валидация и ответы поиска.

NATS JetStream

Доставка событий индексатору и повтор.

PostgreSQL / pgvector

Документы, attachments, chunks и cosine search.

SQLAlchemy / Python

Нормализация, извлечение, chunking и проверка content_hash.

03 / Решения

Как устроен проект

  • Seed отправляет настоящее TenderChangedV1 через NATS; индексатор извлекает HTML и формирует chunks.
  • PostgreSQL VECTOR(1024) выполняет cosine search. FakeAIProvider создаёт embeddings через hashing trick.
  • Повтор события использует content_hash: неизменённый документ не дублирует chunks.
  • Генерация ответа — обозначенный шаблон из найденных фрагментов; внешний crawler и Ollama выключены.
Компоненты опубликованного демо
Компоненты опубликованного демо

04 / Проверка

Сценарии демки

  1. Найдите документ о серверах или Angular-портале.
  2. Задайте вопрос и откройте источники ответа.
  3. Введите запрос вне корпуса и проверьте отсутствие контекста.
  4. Повторите индексационные события: четыре документа и 16 chunks сохранятся без дублирования.

Результаты проверок

  • Сохранено 12 содержательных кадров фактического интерфейса.
  • Дата, сценарий и версия указаны у каждого кадра.
  • Максимум RAM контейнеров в коротком тесте: 127.04 MiB. Общие службы учитываются отдельно; магазин включает свою БД.
  • Измерено 6 повторений сценария; медиана 997.0 мс, максимум 2738 мс. Время включает браузер и HTTPS; методика и ограничения приложены.
  • Четыре ready-документа, 16 chunks. Повтор четырёх NATS-событий не создал дубликаты.

Ограничения

  • Четыре синтетических документа и 16 chunks — демонстрационный корпус, не база реальных закупок.
  • Cosine score и шаблонный ответ не являются оценкой качества промышленной модели.
  • До 30 запросов в минуту на сессию и 1000 живых demo-ключей. Запросы пользователя не сохраняются.
  • Worker health подтверждает соединение при старте; отдельный детектор зависшего вычисления не реализован.

Технические заметки

Модули, API, схема данных, запуск и результаты проверок.

Документация →Материалы ↓