Техническая документация

TenderLens

Что где лежит в коде, как запускается и что проверялось.
Версия a618d1e7be8a · подготовлено 7 сентября 2026

О проекте

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

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

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

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

Архитектура и схемы

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

Code-map: файлы и связи

Карта привязана к версии a618d1e7be8a. В таблице — экран или API, связанный модуль и данные.

ФункцияЭкран / APIМодульДанные / проверка
Начальная индексацияCLI portfoliocli._upsert_demo_record, NatsBroker, IndexerServicesources, tenders, attachments, chunks
Поиск/ответapi/v1/search, askSearchService, FakeAIProviderchunks VECTOR(1024)
Источникилокальные HTMLweb/demoсобственный корпус
Повтор событияapi/demo/replayNatsBroker / hash guardобщий read-only корпус
Сессия и лимитcookie / middlewareportfolio, auth, rate_limitapi_keys (только хеш и счётчики)

Как работать с картой

  1. Перед изменением найти функцию и пройти связи до API, состояния и хранилища.
  2. Проверить входы, ошибки, повторные события и зависимые сценарии.
  3. После изменения обновить карту и затронутые схемы вместе с кодом.
  4. Выполнить связанные проверки и привязать новые материалы к версии исходников.

Сценарии и API

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

Проверка опубликованной версии

CI: CI ↗ · 84c37f0f · исторический запуск другой версии · 2026-08-27T06:43:00Z

CI: Documentation ↗ · 84c37f0f · исторический запуск другой версии · 2026-08-27T06:43:00Z

  • 118 unit-тестов пройдено; 18 интеграционных/внешних проверок исключены из этого запуска.
  • Search and Ask return sources; unrelated query returns no context
  • Queue replay preserves 16 chunks and ready status
  • Independent signed expiring HttpOnly sessions
  • Подтверждённого GitHub CI для этого SHA нет; перечислены выполненные локальные проверки и сценарии опубликованной версии. Исторические CI-ссылки, если есть, отмечены отдельно.

Эти проверки относятся к указанной версии. Коммерческие показатели и качество моделей на независимой выборке здесь не измерялись.

Измерения

Суммарные ресурсы контейнеров проекта · 2026-09-07T01:08:27 — 01:11:22 UTC
Суммарные ресурсы контейнеров проекта · 2026-09-07T01:08:27 — 01:11:22 UTC · Исходные данные ↓
Измеренные повторения сценария через HTTPS · 2026-09-07T01:08:36 UTC; ограничения методики в JSON
Измеренные повторения сценария через HTTPS · 2026-09-07T01:08:36 UTC; ограничения методики в JSON · Исходные данные ↓
  • Сохранено 12 содержательных кадров фактического интерфейса.
  • Дата, сценарий и версия указаны у каждого кадра.
  • Максимум RAM контейнеров в коротком тесте: 127.04 MiB. Общие службы учитываются отдельно; магазин включает свою БД.
  • Измерено 6 повторений сценария; медиана 997.0 мс, максимум 2738 мс. Время включает браузер и HTTPS; методика и ограничения приложены.
  • Четыре ready-документа, 16 chunks. Повтор четырёх NATS-событий не создал дубликаты.

Запуск и эксплуатация

В исходном проекте есть crawler и подключение AI-провайдера. В демке live AI запрещён конфигом, документы берутся только из тестового корпуса.

Dockerfile.portfolio собирается вне VPS; API и worker используют один закреплённый образ и отдельные лимиты. PostgreSQL и NATS доступны только по внутренней сети, API — через localhost:18403 и Nginx.

При запуске выполнить миграции и CLI portfolio seed. Readiness API проверяет зависимости. Повтор индексации безопасен благодаря content_hash; после рестарта сверять четыре ready-документа и 16 chunks. Сессионные ApiKey удаляются по TTL каждый пять минут.

Сборка вне VPS, на сервер уходят готовые файлы и образы с фиксированной версией. Секреты отдельно. Логи ротируются; после изменения log options контейнер нужно пересоздать. Общий docker prune не используется.

Code-map связывает экран или API с модулем и данными. При правке нужно проверить эти связи, обновить карту и прогнать затронутые сценарии: обычный проход, ошибку, повтор, сброс. Схема может устареть, поэтому её версия указана рядом.

Откат проверен 2026-09-07T01:04:24.534304+00:00: 20260907-verified → 20260907c → 20260907-verified. После каждого переключения подтверждены HTTPS, readiness и SHA. Это проверка конфигурации и артефактов на одном проверенном SHA; обратная миграция БД не выполнялась.

Стек

FastAPI / PydanticHTTP-контракты, валидация и ответы поиска.
NATS JetStreamДоставка событий индексатору и повтор.
PostgreSQL / pgvectorДокументы, attachments, chunks и cosine search.
SQLAlchemy / PythonНормализация, извлечение, chunking и проверка content_hash.

Материалы и исходники

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

Архив материалов на языке оригинала.