Маршрутизация LLM через промпт или через tools
Я никакой не Data Scientist, я просто фронтендер.
Но даже фронтендеру иногда бывает интересно, что лучше отработает — обычный промпт типа такого:
Верни слово "auto", если пользователь говорит про автомобили. Верни слово "movie", если пользователь говорит о фильмах…
или передача в LLM функций (или тулов) с описанием каждой из категорий, между которыми LLM нужно сделать выбор.
И да, эту задачу можно было бы решить и с помощью векторов, но мне захотелось сравнить именно эти два подхода.
Первый способ может показаться ненадёжным и контринтуитивным — мы ведь не используем structured_output, поэтому ответ модели здесь не так строго типизирован, как во втором случае. Но так ли всё просто?
Как я сравнивал промпт и тулы
— Написал первый промпт. Он будет проверять, насколько хорошо LLM маршрутизирует, используя обычное текстовое описание:
Твоя основная задача — правильно определить категорию вопроса пользователя.
Если вопрос касается автомобилей, ответь "auto".
Если вопрос касается кораблей, ответь "ship".
Если вопрос касается фильмов, ответь "movie".
Если вопрос касается мотоциклов, ответь "moto".
Если вопрос не относится ни к чему из вышеперечисленного, ответь "incorrect".
Если из фразы клиента не удалось понять, к какой категории относится вопрос, задай клиенту уточняющий вопрос.
— Второй промпт выглядел так же, как и предыдущий, но без описания категорий — их я вынес отдельно в функции. Этим промптом я буду проверять качество маршрутизации с помощью тулов. Получилось в итоге следующее:
Твоя основная задача - правильно определить категорию вопроса пользователя.
Если из фразы клиента не удалось понять, к какой категории относится вопрос, задай клиенту уточняющий вопрос.
— Описал 25 тестовых фраз и их ожидаемый результат по каждой из них.
— Запустил все 25 тестов с первым промптом, затем 25 этих же тестов со вторым промптом и тулами.
— Повторил проверки на шести разных моделях GigaChat и на DeepSeek.
Результаты
Что касается DeepSeek, то почему-то даже на один мой запрос их API отвечал целых 5 секунд, поэтому он выбыл из гонки, так особо в ней и не поучаствовав.
А вот GigaChat показал интересную статистику:
Во-первых, промпт с тулами отрабатывал в среднем в 2-3 раза медленнее обычного текстового промпта — 25 вызовов GigaChat с текстовым промптом отрабатывали за 6-8 секунд, в зависимости от модели. А 25 запросов с тулами занимали в сумме от 18 до 23 секунд.
Во-вторых, промпт с тулами расходовал в 2-3 раза больше токенов — от 800 до 2300 за обычный текстовый промпт, и от 2400 до 4600 токенов за промпт со structured_output.
В-третьих, structured output не всегда давал 100% точность. Было интересно увидеть, как GigaChat-Max и GigaChat-2-Max с обычными текстовыми промптами показали максимальную точность (25 из 25) среди всех моделей.
Что ещё более странно — наименьшую точность среди всех моделей показали эти же GigaChat-Max и GigaChat-2-Max со structured_output (21 из 25).
Я понимаю, что объём тестовых данных у меня совсем небольшой.
Уверен, что если бы тестов у меня было не 25, а 25000, то результаты, скорее всего, были бы совсем иными.
Но в любом случае результаты меня очень удивили. Проверяйте свои инструменты внимательно под каждую задачу)) функций https://t.me/nepshajs/145