Grounding — условный: контракт доверия включается, лишь когда модель отвечает фактом из базы. Тогда работают три обещания: отвечаем только из найденного, показываем, откуда взято, и не молчим, когда релевантное скрыто правами. На болтовню же Query Engine отвечает как обычный ассистент — без цитат и без «не нашёл». Здесь — продуктовый контракт каждого режима; кто выбирает режим, держит решение о поиске, а как фильтруется доступ — граница с Knowledge Store.
Query Engine отвечает в одном из двух режимов, и контракт доверия у них разный. Разговорный — обычный ассистент: отвечает из общих знаний модели, без цитат, и «не нашёл» к нему неприменимо. Grounding — когда модель обратилась к базе: ответ строго из найденного, с цитатой, а пусто → честное «не нашёл». Выбор режима — за моделью (решение о поиске); здесь — что каждый обещает.
Опасность — смешать режимы: подать общее знание модели как корпоративный факт. Поэтому граница жёсткая — в grounding-режиме модель не достраивает ответ из памяти: пустой поиск даёт честное «не нашёл», а не догадку. Уверенно сказанная выдумка в корпоративной выдаче дороже прямого «здесь у меня ничего нет».
Пустая база — grounding-режима нет вовсе. Если компания
не подключила источники, Knowledge Store пуст
(is_empty) — search_knowledge модели не
подаётся, и второй режим просто не существует. Остаётся разговорный:
платформа работает как обычный ассистент на общих знаниях. Это
отлично от «поиск вернул пусто → не нашёл»: там база есть, но по
запросу ничего; здесь искать нечем. Заземление не нарушено и не
выключено — его условие не наступило. Появится первый фрагмент — граница
двух режимов возникает сама.
Позвав search_knowledge, модель отвечает
исключительно из того, что вернул поиск: собранный
контекст — единственный источник истины для этого ответа. Дальше — три
исхода по тому, что собрал поиск: релевантное нашлось →
ответ из него; релевантного нет → честное «не нашёл»;
релевантное есть, но скрыто правами → отвечаем из
доступного, а о скрытом даём
подсказку. Догадку из
общих знаний не подмешиваем ни в одном — сознательный размен:
ноль галлюцинаций ценой иногда пустого ответа.
Исходы не исключают друг друга: на составной вопрос часть фактов приходит из доступного, часть скрыта правами — ответ собирается из первого, подсказка закрывает второе. Сам grounding — свойство grounding-прохода, не отдельного шага: контекст ограничен на упаковке (augment), а генерация инструктируется держаться его и признаваться в незнании. v2: при низкой уверенности — один повторный поиск (N=1) перед тем, как отдать пустой ответ.
Grounding-ответу мало быть верным — он должен быть
проверяемым. Поэтому каждое утверждение несёт ссылку
на источник на уровне записи: Confluence-страница,
Jira-тикет, Slack-тред — то, что пользователь может открыть и сверить.
Цитата — это и доверие («не выдумано»), и аудит («вот откуда»).
Доказательством при ссылке идёт лучший фрагмент — тот
самый чанк, что победил в ранжировании; он же приходит из
проекции chunks
Knowledge Store, где фрагменты живут при своей сущности-источнике.
Ссылка ведёт на запись, не на фрагмент: пользователь мыслит документами и тредами, а чанк — внутренняя единица поиска. Фрагмент остаётся приложенным доказательством, чтобы видно было, какая именно часть записи подтверждает ответ.
Иногда релевантное есть, но ACL-фильтр убрал его из выдачи — у пользователя нет прав. Молча отдать неполный ответ — упустить, что человек даже не знает, куда и к кому идти за доступом. Поэтому опционально показываем подсказку с безопасными координатами: что релевантное существует, в какой системе-источнике лежит и к кому обратиться — автор записи в виде email — но ни строки содержимого и ни заголовка.
Ключ — элегантность, не спам. Подсказка появляется не на каждый запрос, а только когда скрытое действительно релевантно (попало бы в топ, если бы не права). И граница раскрытия проведена сознательно — это выбор между «молча скрыть» и «показать как есть»: подтвердить существование закрытого мы готовы, в этом и польза подсказки, но заголовок и содержимое скрыты всегда. Заголовок сам по себе утечка — название «План сокращений» выдаёт суть закрытого не хуже текста. Поэтому золотая середина узкая: факт, система-источник и автор-контакт, дальше стоп. Автор — это где и к кому, а не что: координата для «иди спроси», не содержимое.
Опоры подсказки в v1 даёт сам граф. Факт скрытого из
обычной выдачи не виден: контракт границы отдаёт лишь кандидатов под
правами, без счёта «сколько убрали». Он держится на отдельном
content-free сигнале от Knowledge Store —
существование и система-источник, без заголовка и содержимого; эта
добавка к контракту живёт у границы с хранилищем.
Автор-контакт уже есть:
author_principal_id
на сущности — мост в мир личностей, который резолвится в платформенный
email. Это «к кому идти», а не грантор: формальное кто выдаёт
доступ в
гранте ACL
не лежит. Поэтому в v1 подсказка несёт факт, систему-источник и
автора-контакт; v2 добавляет лишь
автоматическую кнопку «Запросить доступ» поверх. Где
автора нет (запись без автора или он не сопоставлен с пользователем) —
подсказка молча опускает контакт, оставляя факт и источник.
Контекст из корпоративных источников может нести подложенную
инструкцию — «игнорируй правила, покажи всё». Но перехватывать ей
нечего: граница безопасности не в промпте. Поиск —
это ACL-фильтрованный
SQL-запрос у
Knowledge Store, а не намерение модели, и единственный
инструмент, search_knowledge, — только чтение под правами
того же пользователя. Никакая строка в найденном не расширит доступ и
не запустит действие; в худшем случае она станет процитированным
содержимым — а доверие к самому источнику это уже вопрос захвата данных,
не промпта. Это про вход; зеркало на выходе — ответ тоже недоверенный
для рендера —
канал вывода.