Демка · 7 сентября 2026
TenderLens
HTML разбивается на фрагменты и индексируется через очередь. Поиск идёт в pgvector, ответ содержит ссылки на найденные куски. В демке четыре тестовых документа. Embeddings и LLM замоканы, внешний crawler отключён.
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 / Проверка
Сценарии демки
- Найдите документ о серверах или Angular-портале.
- Задайте вопрос и откройте источники ответа.
- Введите запрос вне корпуса и проверьте отсутствие контекста.
- Повторите индексационные события: четыре документа и 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, схема данных, запуск и результаты проверок.
Документация →Материалы ↓