Тема
3. Разрешение сущностей
Статус: реализовано в Workbench v0.6.0 для exact identity/display name, закрытого Reranker и folder scope. Общая схема находится в разделе «AI Workbench: подготовка данных».
Цель resolver — связать текстовое упоминание с конкретным документом из текущего ExportLive. Resolver не генерирует новые identity и не изменяет домен.
Запрос на разрешение
json
{
"taskId": "task-1",
"mention": "Объект Альфа",
"expectedTypes": ["compositions"],
"scope": {
"folderIdentity": null
}
}expectedTypes и scope — это ограничения поиска, а не готовый ответ. Производный индекс строится только из текущего snapshot и не сохраняется как второй source of truth.
Генерация кандидатов
В v0.6.0 кандидаты собираются детерминированно из:
- exact identity;
- exact normalized display name;
- токенов и префиксов;
- слабого lexical-совпадения в содержимом.
Только уникальный exact identity или exact normalized display name принимается автоматически. Остальные сигналы формируют не более пяти кандидатов для Reranker и не являются самостоятельным решением.
Ранжирование
Оценка кандидата учитывает:
- силу совпадения ключа;
- совпадение типа;
- принадлежность указанной папке;
- связи с уже разрешёнными задачами;
- разницу между первым и вторым кандидами;
- количество независимых evidence signals.
Exact identity при совпадающем типе имеет приоритет над token/content match. Reranker принимает кандидата только при настроенном пороге confidence; отдельная fuzzy-метрика в v0.6.0 отсутствует.
json
{
"candidateId": "candidate-1",
"documentType": "compositions",
"identity": "example-composition-alpha",
"displayName": "Объект Альфа"
}Иерархический scope
Запрос «объекты из папки „Раздел Альфа“» выполняется в два шага:
- resolver разрешает папку;
- resolver ищет дочерние документы только по подтверждённому
folderIdentity.
Запрос «что в папке» может возвращать документы разных типов.
Semantic Reranker
Reranker вызывается только для ограниченного набора близких кандидатов. Его output contract:
json
{
"selectedCandidateId": "candidate-1",
"confidence": 0.89,
"requiresClarification": false,
"reason": "Упоминание совпадает с displayName"
}selectedCandidateId обязан существовать в переданном списке. Низкая confidence не компенсируется повторными неограниченными вызовами: Workbench переходит к уточнению.
Результат
json
{
"taskId": "task-1",
"status": "resolved",
"resolvedEntity": {
"documentType": "compositions",
"identity": "example-composition-alpha",
"snapshotSha256": "..."
}
}Результат ambiguous, not_found или unsupported_type передаётся в цикл уточнений.