← Query Engine

Grounding и цитирование

query-engine · workzone

Grounding — условный: контракт доверия включается, лишь когда модель отвечает фактом из базы. Тогда работают три обещания: отвечаем только из найденного, показываем, откуда взято, и не молчим, когда релевантное скрыто правами. На болтовню же Query Engine отвечает как обычный ассистент — без цитат и без «не нашёл». Здесь — продуктовый контракт каждого режима; кто выбирает режим, держит решение о поиске, а как фильтруется доступ — граница с Knowledge Store.

Два режима ответа

Query Engine отвечает в одном из двух режимов, и контракт доверия у них разный. Разговорный — обычный ассистент: отвечает из общих знаний модели, без цитат, и «не нашёл» к нему неприменимо. Grounding — когда модель обратилась к базе: ответ строго из найденного, с цитатой, а пусто → честное «не нашёл». Выбор режима — за моделью (решение о поиске); здесь — что каждый обещает.

разговорный обычный ассистент
источник общие знания модели
цитаты нет — нечего атрибутировать
«не нашёл» неприменимо
для чего болтовня · мета-просьба · общий вопрос
grounding контракт доверия
источник только найденное в Knowledge Store
цитаты на уровне записи, с лучшим фрагментом
«не нашёл» честный пустой ответ при пустом поиске
гарантия ноль галлюцинаций о компании

Опасность — смешать режимы: подать общее знание модели как корпоративный факт. Поэтому граница жёсткая — в grounding-режиме модель не достраивает ответ из памяти: пустой поиск даёт честное «не нашёл», а не догадку. Уверенно сказанная выдумка в корпоративной выдаче дороже прямого «здесь у меня ничего нет».

Пустая база — grounding-режима нет вовсе. Если компания не подключила источники, Knowledge Store пуст (is_empty) — search_knowledge модели не подаётся, и второй режим просто не существует. Остаётся разговорный: платформа работает как обычный ассистент на общих знаниях. Это отлично от «поиск вернул пусто → не нашёл»: там база есть, но по запросу ничего; здесь искать нечем. Заземление не нарушено и не выключено — его условие не наступило. Появится первый фрагмент — граница двух режимов возникает сама.

Grounding-ответ — только из контекста

Позвав search_knowledge, модель отвечает исключительно из того, что вернул поиск: собранный контекст — единственный источник истины для этого ответа. Дальше — три исхода по тому, что собрал поиск: релевантное нашлось → ответ из него; релевантного нет → честное «не нашёл»; релевантное есть, но скрыто правами → отвечаем из доступного, а о скрытом даём подсказку. Догадку из общих знаний не подмешиваем ни в одном — сознательный размен: ноль галлюцинаций ценой иногда пустого ответа.

модель позвала поиск search_knowledge → Knowledge Store
⟨ что в контексте? ⟩
нашлось ответ из контекста синтез строго по найденным фрагментам · с цитатой на источник
пусто честное «не нашёл» релевантного не существует · без догадок из общих знаний модели
скрыто правами ответ из доступного + подсказка релевантное есть, но ACL его убрал · о скрытом — подсказка с координатами

Исходы не исключают друг друга: на составной вопрос часть фактов приходит из доступного, часть скрыта правами — ответ собирается из первого, подсказка закрывает второе. Сам grounding — свойство grounding-прохода, не отдельного шага: контекст ограничен на упаковке (augment), а генерация инструктируется держаться его и признаваться в незнании. v2: при низкой уверенности — один повторный поиск (N=1) перед тем, как отдать пустой ответ.

Цитата на источник

Grounding-ответу мало быть верным — он должен быть проверяемым. Поэтому каждое утверждение несёт ссылку на источник на уровне записи: Confluence-страница, Jira-тикет, Slack-тред — то, что пользователь может открыть и сверить. Цитата — это и доверие («не выдумано»), и аудит («вот откуда»). Доказательством при ссылке идёт лучший фрагмент — тот самый чанк, что победил в ранжировании; он же приходит из проекции chunks Knowledge Store, где фрагменты живут при своей сущности-источнике.

Когда дедлайн проекта Аякс?
Achilles
…дедлайн проекта Аякс перенесён на 30 июня[1].
[1]
Confluence Ajax · Release plan «…срок сдвинут на 30.06 по итогам ревью…» — лучший фрагмент как доказательство

Ссылка ведёт на запись, не на фрагмент: пользователь мыслит документами и тредами, а чанк — внутренняя единица поиска. Фрагмент остаётся приложенным доказательством, чтобы видно было, какая именно часть записи подтверждает ответ.

Подсказка о скрытом доступе

Иногда релевантное есть, но ACL-фильтр убрал его из выдачи — у пользователя нет прав. Молча отдать неполный ответ — упустить, что человек даже не знает, куда и к кому идти за доступом. Поэтому опционально показываем подсказку с безопасными координатами: что релевантное существует, в какой системе-источнике лежит и к кому обратиться — автор записи в виде email — но ни строки содержимого и ни заголовка.

Что в плане сокращений по отделу продаж?
Achilles
Такие данные в базе есть, но они закрыты правами доступа — показать содержимое я не могу.
Поиск по базе знаний — нет доступа
Confluence спросить anna.petrova@acme.com
Запросить доступ → v2

Ключ — элегантность, не спам. Подсказка появляется не на каждый запрос, а только когда скрытое действительно релевантно (попало бы в топ, если бы не права). И граница раскрытия проведена сознательно — это выбор между «молча скрыть» и «показать как есть»: подтвердить существование закрытого мы готовы, в этом и польза подсказки, но заголовок и содержимое скрыты всегда. Заголовок сам по себе утечка — название «План сокращений» выдаёт суть закрытого не хуже текста. Поэтому золотая середина узкая: факт, система-источник и автор-контакт, дальше стоп. Автор — это где и к кому, а не что: координата для «иди спроси», не содержимое.

Опоры подсказки в v1 даёт сам граф. Факт скрытого из обычной выдачи не виден: контракт границы отдаёт лишь кандидатов под правами, без счёта «сколько убрали». Он держится на отдельном content-free сигнале от Knowledge Store — существование и система-источник, без заголовка и содержимого; эта добавка к контракту живёт у границы с хранилищем. Автор-контакт уже есть: author_principal_id на сущности — мост в мир личностей, который резолвится в платформенный email. Это «к кому идти», а не грантор: формальное кто выдаёт доступ в гранте ACL не лежит. Поэтому в v1 подсказка несёт факт, систему-источник и автора-контакт; v2 добавляет лишь автоматическую кнопку «Запросить доступ» поверх. Где автора нет (запись без автора или он не сопоставлен с пользователем) — подсказка молча опускает контакт, оставляя факт и источник.

Найденное — данные, не команды

Контекст из корпоративных источников может нести подложенную инструкцию — «игнорируй правила, покажи всё». Но перехватывать ей нечего: граница безопасности не в промпте. Поиск — это ACL-фильтрованный SQL-запрос у Knowledge Store, а не намерение модели, и единственный инструмент, search_knowledge, — только чтение под правами того же пользователя. Никакая строка в найденном не расширит доступ и не запустит действие; в худшем случае она станет процитированным содержимым — а доверие к самому источнику это уже вопрос захвата данных, не промпта. Это про вход; зеркало на выходе — ответ тоже недоверенный для рендера — канал вывода.