Головна / Статті / Кешування промптів робить self-consistency дешевою для перевірок LLM на довгому контексті

Кешування промптів робить self-consistency дешевою для перевірок LLM на довгому контексті

Заміри на шести моделях: з кешуванням кілька прогонів одного довгого промпту коштують лише в 1,55–2,5 раза дорожче за один виклик. Плюс формула, застереження й рецепт оцінювання.

1942 слів

Чому перевірка узгодженості не мусить коштувати вшестеро дорожче

Дешевий і переносний спосіб спіймати ненадійну LLM відомий давно. Поставте моделі те саме питання кілька разів і порівняйте відповіді. Якщо вони розходяться, не вірте жодній. Не потрібні ні logprobs, ні розмітка, ні модель-суддя, і підходить будь-який API, який можна викликати двічі. Але в продакшені цим користуються рідко, бо всі наводять те саме заперечення: шість семплів — шість рахунків.

Тести на шести моделях показують іншу картину. Там, де працює кешування промптів, шість семплів обходяться в 1,55–2,5 ціни одного виклику. Уточню, що це означає: цифри — це співвідношення, тож запит з оцінюванням усе одно дорожчий за звичайний. Змінюється розмір надбавки: близько 55% замість уявних 500%. Абсолютні суми в доларах є в таблицях, їх можна перевірити.

Навантаження, під яке кешування й створювали

Причина механічна. Запит надходить до API єдиним потоком токенів: спершу контекст, наприкінці питання. Кеш порівнює цей потік із попередніми починаючи з нульового байта, і все, що збіглося, тарифікується приблизно на 90% дешевше за звичайну ціну за вхід. Будь-яка зміна на початку промпту вибиває все, що йде після неї.

Семплування заради узгодженості нічого не змінює. Воно повторює той самий промпт N разів. Перший виклик платить повну ціну й наповнює кеш, а решта п'ять перевикористовують контекст за десяту частину ціни, тож нова робота — лише генерація відповідей, тобто саме те, що ви й хочете порівняти. У RAG по довгих документах чи в агентів із великим контекстом інструментів, тобто там, де довіра найважливіша, левова частка вартості припадає на вхідні токени, і шестикратна надбавка здебільшого зникає.

Є деталі, які все ускладнюють. Запис у кеш Anthropic коштує разову надбавку 1,25x, і з трьох провайдерів лише Anthropic повідомляє про цей запис. Gemini кешує блоками по 8 192 токени, і в цих прогонах між приблизно 9k і 17k токенів нічого не кешувалося. Мінімальні розміри теж різні: 512 токенів у Claude Opus-5, 1024 в OpenAI і 4 096 у Gemini.

Як влаштовано тест і скільки він коштував

У тесті контекстом слугували правила авіакомпанії приблизно на 21k токенів, а за ними йшло одне питання; кожній моделі його надсилали шість разів. Після кожного виклику записувалася кількість закешованих токенів за даними провайдера, і в чотирьох провайдерів це поле має чотири різні назви. Потім оцінювач noncontradiction з UQLM оцінював шість відповідей, порівнюючи кожну з рештою п'ятьма за допомогою NLI-моделі. Цей крок виконується локально постфактум і не додає викликів API.

Народне повір'я — 6x. З прогрітим кешем вартість запиту з оцінюванням, поділена на вартість запиту без нього, у більшості моделей вийшла від 1,55x до 2,5x (заміри 31 липня 2026 року).

Два результати псують оптимізм. Qwen не показав жодного влучання в кеш на жодному з шести викликів, тож у нього рівно 6x, і для цієї моделі заперечення слушне в чистому вигляді. Llama закешувала 99,4% промпту, але нічого не заощадила, бо Together вказує знижену ціну за кеш для деяких моделей, але не для цієї. Влучання в кеш — технічна подія, а знижка — бізнес-рішення, і потрібно, щоб сталося і те, і те.

Довший контекст — менша надбавка

Щоб перевірити твердження про «довгий контекст», прогін ішов від 1,4k до 440k токенів, по три виклики на кожен розмір, і кожен розмір мав власний холодний префікс, щоб нічого не дісталося від теплого кешу попереднього прогону.

Кожна крива падає, а потім виходить на полицю. Це справжня асимптота, а не повільний спад. OpenAI дає 1,51x, 1,51x, 1,50x і 1,50x від 55k до 440k токенів, тобто восьмикратне зростання контексту зсуває результат на соту. Щоб опуститися нижче полиці, потрібно менше семплів (три семпли впираються в 1,20x) або більша знижка на кеш.

Два провайдери відхиляються кожен по-своєму. Anthropic впирається в 1,75x, а не 1,50x, бо кожен холодний виклик платить 1,25x за запис у кеш. Блоки Gemini по 8 192 токени змушують його множник стрибати щоразу, коли префікс перетинає межу блоку: 2,07x на 28k, зростання до 2,31x на 50k, потім 1,63x на 84k, і все це прямує до тієї самої полиці.

Нижче приблизно 7k токенів Gemini нічого не кешував і стабільно тримався на 6,00x. Це і є межа, де аргумент перестає працювати: на малих промптах стандартне заперечення просто слушне.

Усе вміщується в одну формулу

Усе зводиться до одного рядка. Для N семплів того самого промпту:

C  cached context tokens
c  cached / input rate   (~0.1; 1.0 if no cached price)
Q  uncached input per call
w  write / input rate    (1.0; 1.25 on Anthropic)
O  output tokens
k  output / input price  (6 Terra · 5 Opus, Gemini · 2 DeepSeek)

У цій формулі f показує, яка частка вартості запиту може їхати на кеші, а M лінійно від неї залежить: дорівнює N, коли нічого не закешовано, і полиці, коли закешовано все. Усі шість моделей лягають на цю пряму з точністю до 0,005.

Уваги заслуговує зважування за вартістю. Вихідні токени входять у f після множення на k, бо коштують у k разів дорожче й ніколи не кешуються. У Terra один вихідний токен з'їдає кешовану частку так само швидко, як шість токенів контексту її нарощують, і цим пояснюється більша частина спостережуваного розкиду. DeepSeek доходить до 1,86x навіть за 99% влучань, бо кожна відповідь містила 656 токенів міркувань. Llama стоїть рівно на 6,00x за f = 0,99: без ціни за кеш c = 1, і формула не лишає їй простору.

Практичне правило: закешований контекст C має значно перевищувати вихід O, помножений на k. Довгий контекст допомагає, а довгі відповіді шкодять у k разів швидше. Поверхня, побудована за довжиною контексту й довжиною виводу, ставить точку беззбитковості 2x там, де ці дві сили врівноважуються.

Для вашого власного стеку це арифметика, а не бенчмарк:

# pip install r2c2 — Reuse Context, Recheck Consistency
from r2c2 import estimate, required_context
estimate(context_tokens=21_000, output_tokens=40, model="gpt-5.6-terra").multiplier
# 1.56 — matches the 1.55 measured
required_context(output_tokens=40, model="gpt-5.6-terra", threshold=1.8)
# 4060 — under ~4k context tokens, six samples cost more than 1.8x

Друга функція рахує формулу у зворотний бік. Дайте їй стелю вартості, і вона поверне розмір контексту, починаючи з якого оцінювання в цю стелю вкладається. Вона повертає None, якщо такого розміру немає, а це буває, коли стеля не вища за полицю провайдера.

Що ловлять додаткові витрати

Дешеве семплування безглузде, якщо оцінка нічого не виявляє, тому тестове питання було складним. Правила дозволяють повернення коштів за неповоротні тарифи протягом 24 годин після бронювання й не уточнюють, хто скасував рейс. Сценарій: пасажир купив неповоротний квиток 30 годин тому, а потім авіакомпанія скасувала рейс. Чи належить повернення?

На контрольному питанні, на яке правила відповідають прямо, усі шість моделей отримали 0,99 і вище. Формулювання щоразу змінюються, а висновок — ніколи: перефразування — це і є суть семплування, і розбіжністю воно не вважається.

На тому ж питанні, взятому з тих самих шести викликів, що й цифри вартості, моделі розійшлися. Qwen чергував «ні», «так», «ні», «так», «ні», «так» — по суті, підкидав монетку в питанні про повернення грошей — і отримав 0,40. Gemini розділився 4 до 2, і в його відповідях «так» згадувалися «правила Міністерства транспорту», про які в промпті ні слова. Terra і DeepSeek розділилися 5 до 1. Claude Opus 5 шість разів із шести відповів «так», вирішивши — правдоподібно, але без опори на текст, — що правило 24 годин стосується лише скасувань з ініціативи пасажира. Llama отримала ідеальні 1,00, шість разів давши те саме ухильне формулювання («може вважатися винятком... може мати право»). Стабільна ухильність — теж сигнал, але цей оцінювач її не ловить.

Кожна з тридцяти шести відповідей звучить гладко й упевнено, і кожна посилається на правила. Дивлячись на одну відповідь, ви ніколи не дізнаєтеся, що наступний семпл може сказати протилежне. Ті самі 0,40 — єдине видиме попередження, і там, де домінує вхід, воно коштує приблизно половину одного додаткового виклику.

Розклади ще й змінюються від прогону до прогону. В іншому прогоні Terra розділився 3 до 3, а Gemini всі шість разів відмовився відповідати. Попереднє тестування цього не виправить, і це аргумент на користь оцінювання наживо, а не разового офлайн-аудиту.

Як застосувати

Якщо ви вже семплуєте N відповідей, саме оцінювання безкоштовне: .score() запускається постфактум на вже отриманих відповідях:

from uqlm import BlackBoxUQ
# six answers you already collected; calls 2-6 hit the prompt cache
scorer = BlackBoxUQ(scorers=["noncontradiction"], use_best=False)
result = scorer.score(responses=[answers[0]], sampled_responses=[answers[1:]])
confidence = result.to_df()["noncontradiction"][0]  # 0.99 = agrees; 0.40 = coin flip

Оцінювач запускає локальну NLI-модель (microsoft/deberta-large-mnli), тож платити моделі-судді не потрібно. Низькі оцінки можна надсилати людині, на повторний пошук або більшій моделі.

Три звички вирішують, чи побачите ви реальні 1,55x. Надсилайте перший виклик окремо, а решту — віялом, бо запис у кеші не можна прочитати, доки не почала стримитися перша відповідь, а шість одночасних однакових запитів промахнуться всі. Тримайте семпли ідентичними до байта й виносьте все мінливе за контекст: одна вставлена мітка часу псує все, що йде після неї. І нарешті, семплуйте з температурою вище нуля, інакше шість однакових відповідей дадуть ідеальну оцінку, яка нічого не каже.

До чого це веде

Серед методів виявлення галюцинацій оцінка невизначеності за принципом чорної скриньки завжди була найпростішою у впровадженні: не потрібні ні logprobs, ні розмітка, працює будь-де. Єдиним серйозним мінусом була ціна, і він зблід, коли провайдери запровадили читання з кешу зі знижкою 90%, адже семплування заради узгодженості за своєю природою надсилає ті самі байти. Цикл такий: закешувати прочитане, пересемплувати відповідь, оцінити згоду й надіслати низькі оцінки людині. На платформах, через які йде більша частина продакшен-трафіку, це коштує приблизно половину зайвого виклику.

Ніщо з цього не переноситься без змін на будь-яку конфігурацію. Цифри залежать від розміру контексту, провайдера й цін на токени. Промпт на 2k токенів у Gemini не кешується взагалі, а чат-бот із короткими промптами й довгими відповідями до 1,55x не дійде. Формула за пів хвилини дає ваш власний множник, а репозиторій для відтворення повторює все це з чотирма API-ключами приблизно за два долари.

І все ж напрям цій техніці на руку, і причина — агенти. Їхні контексти — промпти, що ростуть найшвидше в продакшені: кожен виклик інструмента додається до історії, кожен хід надсилає її повністю, і навіть акуратне стискання не зупиняє зростання. Зростання не послаблює аргумент, воно зсуває вас далі по кривій. Провайдери зробили кешування промптів, бо агенти пересилають величезні префікси, і оцінка узгодженості користується тим самим механізмом. Перевірка дешевшає найбільше саме в агентних навантаженнях, де вона найпотрібніша.

Код і дані: https://github.com/mohitcek/r2c2 (репозиторій для відтворення) і https://github.com/cvs-health/uqlm (UQLM).