Read in:
Русский

Проси точку поворота, а не интервал

Языковая модель хорошо видит, где разговор поворачивает, и плохо считает арифметику по таймкодам. Моя первая попытка нарезать транскрипты звонков на темы это игнорировала: я просил у модели блоки [начало–конец], а она не сводила интервалы. Починил это не острый промпт и не модель побольше. Починил другой вопрос: спрашивай, где каждая тема начинается (один реальный таймкод из транскрипта), а интервалы досчитает код. Тогда самая дешёвая модель расставила переходы на 100% по порядку и на 97% по реальным таймкодам и обошла модель побольше.

Шаг

Сборка базы знаний из звонков начинается с сегментации: разрезать транскрипт на блоки по темам, чтобы ходить по времени и кормить следующий этап извлечения. Кривые границы — и ошибку наследует всё, что ниже. Тестировал на 28 своих звонках две дешёвые модели: nano (самая дешёвая) и mini (средняя).

Первый блин: просить интервалы

Я велел выдавать блоки [MM:SS–MM:SS] с заголовком в строку. Темы поймала точно, структуру — мимо. На 28 звонках диапазоны самой дешёвой модели были полностью непрерывны лишь на 29%. Замаскировано — реальные темы заменены нейтральными заглушками, структура настоящая:

[42:52–49:53]  …
[44:00–47:50]  …   начинается и кончается внутри предыдущего блока
…
[09:25–05:17]  …   конец на четыре минуты раньше начала

Дальше я сделал то, что хочется сделать: стал бороться с промптом. Строгое «непрерывно, без разрывов, покрой весь звонок» починило порядок. Зато заставило дробить, кроша начало на по-репликовые крошки, около 52 блоков на звонок:

[00:02–00:07]  приветствие
[00:07–00:14]  обменялись именами
[00:14–00:18]  реплика про погоду
…тринадцать блоков за первые две минуты

Лимит гранулярности («блок — это тема, 8–18 штук») починил и это: снова около 11 чистых блоков, 100% непрерывно, по самой дешёвой цене. А модель побольше справлялась из коробки, в 3,7 раза дороже. И вот два аккуратных вывода на выбор: «доведи промпт» или «плати за модель». Оба мимо. Я латал задачу, которой не должно быть. Модель не вычтет 05:17 из 09:25, зачем я её заставляю?

Поворот: размечать переходы, интервалы досчитать

Перестань просить интервалы. Спроси то, в чём модель сильна: где начинается новая тема? Одна строка на переход: таймкод, скопированный из транскрипта, и тема, которая тут начинается. Интервалы — это арифметика, значит работа кода, а не модели: блок i идёт от маркера i до маркера i+1.

На тех же 28 звонках («по порядку» — маркеры идут по возрастанию времени; «по реальным таймкодам» — таймкод взят из транскрипта, а не выдуман):

маркеров (ср.) по порядку по реальным таймкодам
nano 24 100% 97%
mini 21 96% 93%

Самая дешёвая модель почти идеальна и идёт впереди модели побольше. Это не случайность. Задача теперь звучит как «заметь поворот, скопируй таймкод» — это узнавание, её сила, а не учёт интервалов, её слабость. Лишнее рассуждение модели побольше тут ничего не даёт, а сама она иногда округляет или выдумывает время и проседает по реальным таймкодам. Чуть лучше она делает одно: формулирует заголовок как острый вывод, а не как название темы. Разница маленькая, и это последняя причина её брать.

Выводы

Если модель стабильно валит подзадачу — подозревай вопрос, а не модель. Возня с интервалами была длинным обходом простого факта: я просил арифметику. Перекроил задачу под силу модели и одним движением получил то, чего не дали три версии промпта.

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

И держи детерминированное в коде. Модель размечает повороты. Код считает интервалы, гарантирует непрерывность и не плывёт.

Что это и что не это

Гонялось на моих собственных недавних звонках, не на собранном бенчмарке. Промпты подогнаны под мою предметку и язык, а набор одного человека — это не общее утверждение про модели. Цифры считай ориентиром. Обобщается форма: распознавание бьёт арифметику, дешёвая модель догоняет (а тут и выигрывает), дизайн задачи перевешивает выбор модели.

Это первый этап графа знаний. Маркеры дают чистые блоки. Дальше — извлечение смыслов и связей между ними в [[викиссылки]].