Собрал тут агента для техподдержки🤖 Цель – закрыть вопросы первой линии. Благо, вся документация в одном месте – собирается в html-страницы с помощь MkDocs. Поэтому агентный харнесс максимально простой, набор скриптов на Python.
Поисковый движок – SQLite со встроенным модулем полнотекстового поиска FTS5. Поиск делает BM25, есть словарь синонимов, переранжирование по заголовкам. Подключён русский стеммер Snowball (алгоритм Портера). Даже опечатки обрабатываются – через вычисление расстояния Дамерау-Левенштейна по словарю основ из индекса. Ну, а дальше в дело вступает корпоративная LLM. В настоящий момент это GLM5.3-Flash в оригинальных весах. Собственно, про неё я кое-что любопытное и хотел рассказать😊
Во время тестирования обнаружил группу вопросов, на которые модель пыталась дать ответ, хотя в документации ответа не была. То есть ожидаемое поведение в этом сценарии – перевод на оператора. Поиск что-то цеплял и возвращал пару чанков, но не о том. GLM5.3-Flash, будучи фронтирной open-weight моделью, не могла этого не понимать. И всё же, в 30% случаев она либо уходила в цикл рассуждений и харнесс падал по таймауту, либо отвечала. Не выдумывала, ответ был обоснованный, просто не на тот вопрос.
Полез смотреть, что там в reasoning. И сразу же нашёл, в чём проблема. Почти в каждом рассуждении присутствовали примерно такие обороты:
Еслитестировщик хотел стандартную фразу, он бы сформулировал вопрос так, чтобы ни один фрагмент не отвечал...
Хм, но давайте ещё подумаю про вариант, что правильный ответ это стандартная фраза. Вопрос содержит [NDA]. Возможно, это тест на то, что ассистент не должен отвечать на запросы вне системы?..
Давайте подумаем о намерении теста…
Я мечусь. Давайте посчитаем вероятности: P(тест expects ответ по [5]) – если тестировщик считает, что вопрос про [NDA]...
Мечется она, видите ли! Помните, пару месяцев назад я рассказывал про большое исследование Anthropic, когда модели линейки Opus корректировали своё поведение, понимая, что их тестируют? Так вот, похоже теперь не только топ-тир closed-weight моделей на такое способен.
Не берусь утверждать, что у GLM5.3-Flash тоже есть J-пространство, но она чётко понимает, когда её тестируют. И столкнувшись с этим непосредственно, я сразу даже не понял, оно больше интересно или жутко...
Что касается проблемного сценария, решился он довольно прозаично. Когда стало понятно, почему модель циклилась или пробовала отвечать, я просто добавил в системный промпт прямой запрет на интерпретацию пользовательских вопросов в качестве тестовых. То есть буквально запретил модели воспринимать происходящее как тест. И это помогло. 1000+ прогонов, ни одного цикла, ни одной попытки ответить. Как-то так😊
ai_necromancer #иимысли