Перейти к содержанию

Первичный анализ тендера

До решения go/no-go процесс tender сам разбирает закупку со знанием о компании: сопоставляет позиции с номенклатурой, проверяет требования к участнику по базе знаний, разбирает документацию и предлагает рекомендацию. Решает человек. Статья для тех, кто разворачивает пакет tenders или строит похожий анализ в своём процессе. Обоснование — TAI-ADR-0056 (решение 8); сам процесс описан в статье Тендеры.

Где в процессе

Анализ занимает конец стадии screening и начало стадии decision:

flowchart LR
    RH[recall-history<br/>дела и уроки заказчика] --> RC[recall-company<br/>организация, документы,<br/>договоры, опыт]
    RC --> RR[recall-roles<br/>подразделения, роли,<br/>профили работ]
    RR --> RO[recall-offerings<br/>предложения под объект]
    RO --> MI[match-items<br/>tender.match_items@1]
    MI --> CR[check-requirements<br/>tender.check_requirements@1]
    CR --> AR{aiPending?}
    AR -->|да| RT[ai-retry<br/>requireAi, до 3 повторов]
    AR -->|нет| AU[assign-unit<br/>executorRole]
    RT --> AU
    AU --> AD[analyze-docs<br/>tender.analyze_docs@2]
    AD --> GO[go-no-go<br/>решает человек]
Шаг Что делает
recall-company от организации компании по ИНН: удостоверяющие документы (held_by), договоры и выполненные работы (party_to); виды legal_entity, credential, agreement, engagement
recall-roles подразделения (unit_of, до трёх уровней), их роли (belongs_to) и профили работ (performs)
recall-offerings смысловой добор по объекту закупки: offering, product_registry_entry, capability
match-items позиции закупки ↔ предложения компании, исполнитель по профилю работ
check-requirements требования, преимущества и ограничения извещения по базе знаний
ai-retry повтор ИИ-части, если ИИ был недоступен
assign-unit executorRole — роль исполнителя из сопоставления, иначе tender-lead
analyze-docs документация, риски, вопросы, рекомендация
remember-analysis в дело — покрытие, блокеры и рекомендация
go-no-go задача руководителю тендерного отдела: анализ, подсказка по истории, сопоставление, проверки, исполнитель, НМЦК, ссылка

У каждого recall таймаут две минуты: память не ответила — анализ идёт дальше с пустым ответом. Сбой скилла сопоставления, проверки или анализа тоже не останавливает процесс: в данные пишется status: unavailable, задача go/no-go создаётся.

Что процесс вспоминает о компании

- id: recall-company
  recall:
    anchors: [{kind: legal_entity, key: "'${TENDERS_COMPANY_INN}'"}]
    traverse:
      - {relation: held_by, direction: in, depth: 1, limit: 100}
      - {relation: party_to, direction: out, depth: 1, limit: 200, from: anchors}
    kinds: [legal_entity, credential, agreement, engagement]
    limit: 100
    timeout: PT2M
    onTimeout: [{id: no-company, set: {company: "{}"}}]
  output: {as: {company: step.result}}

Якорь — организация компании: вид legal_entity с ключом из переменной установки TENDERS_COMPANY_INN. Знание должно быть загружено в базу знаний дерева workspace тендеров (см. База знаний компании): без него проверки получают статус «неизвестно».

Сопоставление позиций — tender.match_items@1

Вход — позиции нормальной формы закупки и ответы трёх recall. Каждая позиция сопоставляется детерминированно, по порядку:

  1. КТРУ — предложение, связанное coded_as с кодом code:ktru:<позиция>;
  2. ОКПД2 — самый длинный общий префикс кода позиции с кодами предложения (атрибут okpd2), от вида к классу; совпадение короче класса (XX.XX) не считается;
  3. единица ОКЕИ — у совпадения по ОКПД2 сравнивается unit предложения с кодом ОКЕИ позиции; расхождение — пометка unitMismatch.

Позиция без совпадения берёт смыслового кандидата — предложение, найденное recall по смыслу (inferred), с наибольшим числом общих основ слов в названии и описании. Её статус — «неизвестно», method: semantic.

Неизменяемые характеристики — характеристики позиции с инструкцией «значение не может изменяться участником» — у совпавших и смысловых позиций проверяет ИИ одним вызовом (до 40 позиций): кандидат подходит (met), явно не подходит (not_met), данных не хватает (unknown), с пояснением по каждой характеристике.

Исполнитель — профиль работ (capability), чьи коды ОКПД2 покрывают больше всего позиций, и роль или подразделение, которое его выполняет (performs); роль подразделения — связь belongs_to. В выход идёт platformRole первой роли с этим атрибутом.

Поле выхода Что значит
items[] по позиции: status (met, not_met, unknown), method (ktru, okpd2, semantic, none), level — глубина совпадения ОКПД2, offeringKey, unitMismatch, characteristics[], source
coverage count из total позиций покрыто, sumShare — доля суммы покрытых позиций
executor role, capability, unit
status ok или partial (есть «неизвестно» или ИИ не ответил)
aiPending ИИ недоступен — детерминированная часть готова, характеристики проверятся позже

executorRole процесса — executor.role, иначе tender-lead. На эту роль (с tender-lead запасным) назначается задача документов заявки на стадии подготовки.

Требования к участнику — tender.check_requirements@1

Коды требований, преимуществ и ограничений извещения проверяются по справочнику кодов пакета и по базе знаний. Справочник — данные интеграции tenders (requirement_codes.yaml): код справочника ЕИС → как его проверять и блокирует ли его невыполнение участие.

Проверка Как
declaration участник декларирует соответствие в заявке — выполнено с пометкой
info сведения, не требование — выполнено
credential есть удостоверяющий документ компании (лицензия, членство, допуск, аккредитация, сертификат), действующий на дату окончания подачи; все истекают раньше — не выполнено
small_business атрибут smallBusiness организации компании; нет организации или атрибута — неизвестно
experience выполненная работа (engagement) роли prime на сумму не меньше доли НМЦК (share) за окно лет (years)
registry и прочие проверка по внешнему реестру — неизвестно, нужен человек
код не из справочника неизвестно, нужен человек, со ссылкой на поле извещения

Сверх кодов:

  • национальный режим — позиции с запретом или ограничением: сопоставленное предложение должно быть связано registered_as с записью реестра продукции (product_registry_entry); блокирующая проверка;
  • лимит СРО — для закупок с ОКПД2 разделов 41–43: предельный размер обязательств членства в СРО (contractLimit профиля credential с memberOf: sro) не меньше НМЦК плюс текущие обязательства (вход obligations); блокирующая проверка;
  • требования из документации — ИИ выписывает из текстов документов закупки требования, которых нет среди кодов, с цитатой и именем файла, со статусом «неизвестно»: проверяет человек.

Предупреждение о сроке. Если все действующие документы истекают раньше окончания исполнения контракта, проверка выполнена, но с предупреждением: какой документ и когда истекает. Предупреждения собираются в warnings.

Поле выхода Что значит
checks[] id, title, status, blocker, warning, note, source (поле извещения, документ с цитатой, знание, правило), evidence[] — ключи сущностей базы знаний
blockers невыполненные блокирующие проверки
warnings предупреждения о сроках
aiPending ИИ недоступен — требования из документации разберутся позже

Нет данных в базе знаний — всегда «неизвестно», а не «не выполнено».

Документация и рекомендация — tender.analyze_docs@2

Вход — закупка, тексты документов закупки, прошлые дела и уроки заказчика, знание о компании, итоги сопоставления и проверки требований. Тексты — из артефактов procurement-document с содержимым (коннектор ЕИС кладёт файлы содержимым при attachments: content): до 10 документов, PDF, DOCX, XLSX или текст. Артефакт-ссылка без содержимого пропускается.

Выход:

Поле Что значит
summary резюме закупки
risks[] риски исполнителя (сроки, ответственность, обеспечения, объём, приёмка): text, severity (low, medium, high), дословная quote и source — документ
blockers блокеры проверки требований и стоп-факторы из документации
questions вопросы заказчику до окончания подачи
recommendation decision (go, no_go, needs_review) и rationale — покрытие позиций, блокеры, риски, уроки
documentsRead сколько документов прочитано
aiPending ИИ недоступен

Детерминированные правила поверх модели:

  • подача уже закончилась — no_go без вызова модели;
  • есть невыполненные блокирующие требования — no_go, что бы ни предложила модель.

Рекомендация — не решение

Решение об участии принимает человек задачей go-no-go (роль tender-lead). Рекомендация, риски с цитатами, покрытие и блокеры — вход этой задачи, а дело закупки получает их фактами (remember-analysis).

Если ИИ недоступен

Все три скилла отдают детерминированную часть сразу, а ИИ-часть помечают aiPending: true:

Скилл Без ИИ
tender.match_items@1 статусы по кодам готовы; неизменяемые характеристики — «неизвестно»
tender.check_requirements@1 проверки по кодам готовы; требования из документации не выписаны
tender.analyze_docs@2 status: partial, рекомендация no_go при блокерах, иначе needs_review

Процесс повторяет ИИ-часть отдельным шагом с входом requireAi: true — в этом режиме сбой ИИ становится ошибкой вызова, а шаг повторяется: до трёх раз, первая пауза 15 минут, дальше экспоненциально. Не помогло — в данные пишется пометка analysisNote («ИИ недоступен … нужен человек» или «рекомендация — по детерминированной части»), и процесс идёт к go/no-go.

Промпты всех трёх скиллов проходят страж персональных данных skill-sdk (см. База знаний компании).

Установка

В дополнение к Что нужно для запуска:

Что Зачем
переменная установки TENDERS_COMPANY_INN ИНН организации компании — якорь recall о компании
пакеты онтологии process-knowledge@1, company@1, procurement@2 включены для дерева workspace тендеров виды компании, закупок, реестров продукции и профиль СРО
знание о компании загружено организация (own: true, smallBusiness), удостоверяющие документы со сроками, выполненные работы, номенклатура с кодами ОКПД2 и КТРУ, подразделения, роли с platformRole, профили работ — таблицами, документами или из 1С
хостинг local-скиллов с пакетом taimen_tenders и LLM инсталляции исполнение трёх скиллов; разбор текстов использует модуль извлечения интеграции company_knowledge

Регистрация и включение procurement@2:

uv run taimen-tenders-pack register --server https://platform.example.com
uv run taimen-tenders-pack enable --server https://platform.example.com \
    --workspace <root-workspace-id> --pack default@1 --pack process-knowledge@1 --pack company@1

enable заменяет набор пакетов namespace целиком — перечисляйте все нужные.

Тесты

Сценарии пакета покрывают анализ: primary-analysis (знание компании, повтор ИИ-части, исполнитель по профилю работ), ai-unavailable (ИИ не ответил за все повторы — пометка «нужен человек»), degraded-analysis (память и скиллы недоступны — рекомендация по детерминированной части). Ответы recall и скиллов в тестах — заглушки mocks (см. Тесты пакета).

PYTHONPATH=control-plane/src:control-plane/client/src python3 tools/package_sandbox.py tenders

Типичные проблемы

Симптом Причина Что делать
все проверки «неизвестно» знания о компании нет в дереве workspace или неверный TENDERS_COMPANY_INN загрузить организацию с этим ИНН и связанные сущности; проверить переменную
позиции не сопоставляются по ОКПД2 у предложений нет атрибута okpd2 или совпадение короче класса заполнить коды ОКПД2 номенклатуры
исполнитель всегда tender-lead нет профилей работ с кодами ОКПД2, связей performs или platformRole у ролей загрузить capability, связи и роли
национальный режим «неизвестно» в базе знаний нет записей реестра продукции загрузить product_registry_entry и связи registered_as
documentsRead: 0 документы закупки пришли ссылками без содержимого коннектор ЕИС с attachments: content
рекомендация needs_review, analysisNote про ИИ ИИ был недоступен все повторы проверить LLM хостинга скиллов; решение — по детерминированной части

См. также