Первичный анализ тендера¶
До решения 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. Каждая позиция
сопоставляется детерминированно, по порядку:
- КТРУ — предложение, связанное
coded_asс кодомcode:ktru:<позиция>; - ОКПД2 — самый длинный общий префикс кода позиции с кодами предложения
(атрибут
okpd2), от вида к классу; совпадение короче класса (XX.XX) не считается; - единица ОКЕИ — у совпадения по ОКПД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 (см. Тесты пакета).
Типичные проблемы¶
| Симптом | Причина | Что делать |
|---|---|---|
| все проверки «неизвестно» | знания о компании нет в дереве 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 хостинга скиллов; решение — по детерминированной части |