Русский
Проси точку поворота, а не интервал
Языковая модель хорошо видит, где разговор поворачивает, и плохо считает арифметику по таймкодам. Моя первая попытка нарезать транскрипты звонков на темы это игнорировала: я просил у модели блоки [начало–конец], а она не сводила интервалы. Починил это не острый промпт и не модель побольше. Починил другой вопрос: спрашивай, где каждая тема начинается (один реальный таймкод из транскрипта), а интервалы досчитает код. Тогда самая дешёвая модель расставила переходы на 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% |
Самая дешёвая модель почти идеальна и идёт впереди модели побольше. Это не случайность. Задача теперь звучит как «заметь поворот, скопируй таймкод» — это узнавание, её сила, а не учёт интервалов, её слабость. Лишнее рассуждение модели побольше тут ничего не даёт, а сама она иногда округляет или выдумывает время и проседает по реальным таймкодам. Чуть лучше она делает одно: формулирует заголовок как острый вывод, а не как название темы. Разница маленькая, и это последняя причина её брать.
Выводы
Если модель стабильно валит подзадачу — подозревай вопрос, а не модель. Возня с интервалами была длинным обходом простого факта: я просил арифметику. Перекроил задачу под силу модели и одним движением получил то, чего не дали три версии промпта.
Промпт и форма задачи идут раньше апгрейда модели. Здесь перекроенная задача делает лучшим выбором самую дешёвую модель, так что апгрейд был бы выброшенными деньгами.
И держи детерминированное в коде. Модель размечает повороты. Код считает интервалы, гарантирует непрерывность и не плывёт.
Что это и что не это
Гонялось на моих собственных недавних звонках, не на собранном бенчмарке. Промпты подогнаны под мою предметку и язык, а набор одного человека — это не общее утверждение про модели. Цифры считай ориентиром. Обобщается форма: распознавание бьёт арифметику, дешёвая модель догоняет (а тут и выигрывает), дизайн задачи перевешивает выбор модели.
Это первый этап графа знаний. Маркеры дают чистые блоки. Дальше — извлечение смыслов и связей между ними в [[викиссылки]].