Перейти к содержимому

Понимание запроса и суммаризация

Понимание запроса и суммаризация кажутся разными задачами, но это два конца одного процесса:

  • На входе короткая и неточная формулировка, которую нужно превратить в хороший поисковый запрос.
  • На выходе длинный набор найденного, который нужно сжать в ответ, не потеряв смысл и не потеряв источники.

Модель полезна на обоих концах, но по разным причинам: на входе — потому что понимает разговорный язык, на выходе — потому что умеет работать с большим объёмом текста.

ШагЧто делаетПример
НормализацияРегистр, опечатки, раскладка, лишние символы«rjgjvbxrf» → «компьютер»
Определение намеренияКупить, узнать, сравнить, найти конкретное«цена» → транзакционный
Извлечение ограниченийЧисла, даты, бренды, категории«до 8000», «на выходных», «Nike»
ПереписываниеРасширение синонимами, профессиональные термины«не греет» → «низкое энергопотребление»
ДекомпозицияСоставной вопрос на подвопросы«сравни тарифы для ИП и ООО» → два запроса
Контекст диалогаПодстановка темы из предыдущих реплик«а сколько это стоит?» → подставить предмет

Порядок важен: дешевле сначала нормализовать и извлечь ограничения кодом, а модель звать только там, где без неё нельзя. Нормализация опечаток через LLM — дорогой способ решить задачу, с которой справляется словарь и расстояние Левенштейна.

Ответные движки и продвинутые поисковики не выполняют один запрос. Они разворачивают вопрос в набор подвопросов («fan-out»), ищут по каждому, затем объединяют и синтезируют ответ. Это объясняет, почему в ответе могут оказаться источники, которые не отвечают на исходную формулировку буквально.

Для внутреннего поиска тот же приём полезен, когда вопрос составной: «какие документы нужны для возврата товара, купленного по карте» — это и регламент возврата, и способы оплаты, и сроки.

Цена — несколько вызовов модели и поиска на один запрос. Оправдано там, где ответ важнее задержки.

Задача выглядит простой («сократи»), но у неё есть жёсткие требования, если результат идёт пользователю:

  • Не терять цифры и условия. «До 30 дней» и «до 30 рабочих дней» — разные утверждения.
  • Не менять модальность. «Может быть возвращён» не равно «будет возвращён».
  • Сохранять источник. Каждое утверждение должно быть проверяемо; в ответных движках цитата — часть формата.
  • Признавать противоречия. Если в двух документах разные сроки, честнее показать расхождение, чем выбрать один молча.
  • Укладываться в формат. Сниппет на 300 знаков и обзор на 3000 слов — разные задачи с разными правилами.
  • «Помещается» не значит «прочитано». Модель может потерять факт из середины документа; важное лучше ставить в начало и в конец.
  • Стоимость растёт линейно. Суммаризация 200 страниц на каждый запрос — дорогое удовольствие; кэширование и предварительные выжимки окупаются.
  • Иерархия лучше одного вызова. Сначала выжимки по разделам, потом общий вывод — точнее и дешевле, чем «прочитай всё».
  • Карта документа. Для больших корпусов полезно хранить оглавление и краткие описания разделов — это дешевле, чем full-text.
  • Переписывание меняет смысл. «Дешёвый» превратилось в «бюджетный сегмент», и поиск ушёл в другую категорию. Переписанный запрос стоит логировать и проверять.
  • Слишком много подвопросов. Ответ становится общим, потому что каждый подвопрос размыл фокус.
  • Галлюцинация в суммаризации. Модель добавляет «очевидное» условие, которого в тексте не было.
  • Потеря редкого случая. Сжатие отбрасывает исключения — а именно они чаще всего и важны.
  • Сниппет без источника. Пользователь не может проверить утверждение и либо верит зря, либо не верит вовсе.
  • Логируются ли исходный и переписанный запросы.
  • Есть ли набор эталонных вопросов с правильными ответами и цитатами.
  • Проверяется ли суммаризация на числах и условиях отдельно от общего качества.
  • Обрабатываются ли противоречия между источниками явно.
  • Укладывается ли задержка в ожидания интерфейса: понимание запроса на каждый ввод символа недопустимо дорого.