Управление длинным контекстом: Стратегии окна в 1М+ токенов

35 минут Урок 16

Введение: Сдвиг парадигмы или «Смерть RAG»?

Добро пожаловать в урок, который меняет правила игры. Долгое время в разработке ИИ-приложений мы жили в условиях жесткой экономии: контекстное окно в 4k, 8k или даже 32k токенов заставляло нас «нарезать» данные на мелкие кусочки, использовать векторные базы данных и молиться, чтобы алгоритм поиска (retrieval) нашел именно тот фрагмент, который нужен для ответа.

С приходом Gemini и окна в 1 миллион (и даже 2 миллиона) токенов, мы переходим от эпохи Retrieval (поиска) к эпохе Processing (обработки). Представьте, что 1 миллион токенов — это примерно:

  • 700 000 слов;
  • 50-60 часов аудиозаписей;
  • 1 час видео высокого разрешения;
  • 30 000 строк кода.

Это не просто увеличение буфера. Это возможность загрузить в модель всю документацию проекта, весь юридический кодекс или полную историю переписки с клиентом за 5 лет. Однако, «большая сила — это большая ответственность» (и большие задержки, если делать это неправильно).

В этом уроке мы разберем, как работать с таким объемом данных, не разориться на токенах, минимизировать галлюцинации и понять, когда классический RAG всё ещё нужен.

Феномен «Иголки в стоге сена» (NIAH) и внимание модели

Главный страх при работе с длинным контекстом — это проблема Lost in the Middle (потеря середины). Ранние модели хорошо помнили начало и конец промпта, но «забывали» информацию в середине. Gemini демонстрирует феноменальные результаты в тесте Needle In A Haystack (NIAH), достигая точности выше 99% даже при полной загрузке контекста.

Как это работает архитектурно?
В отличие от простого внимания (attention), Gemini использует оптимизированные механизмы (такие как Ring Attention), которые позволяют модели удерживать глобальные связи между удаленными частями текста. Это значит, что модель может найти связь между требованием на странице 10 и исключением на странице 950 технической документации.

Ключевые принципы работы с длинным контекстом в Gemini:
  1. Холистическое понимание: Модель «видит» весь документ сразу, что позволяет ей делать обобщения, которые невозможны при фрагментарном RAG-подходе.
  2. Мультимодальность как стандарт: Длинный контекст — это не только текст. Вы можете загрузить видео семинара и спросить: «На какой минуте спикер упомянул архитектуру микросервисов?».
  3. Инструкции имеют вес: В огромном море данных ваши инструкции (системный промпт) должны быть якорем.

python
import google.generativeai as genai
import os

# Настройка API
genai.configure(api_key=os.environ["GEMINI_API_KEY"])

# Выбор модели с поддержкой длинного контекста
model = genai.GenerativeModel('gemini-1.5-pro-latest')

# Функция для подсчета токенов перед отправкой
# Это критически важно для оценки стоимости и лимитов
def check_token_count(text_content, file_content=None):
    contents = [text_content]
    if file_content:
        contents.append(file_content)
        
    response = model.count_tokens(contents)
    print(f"Количество токенов: {response.total_tokens}")
    
    # Примерная оценка стоимости (условные цифры для примера)
    # В реальности цены меняются, всегда сверяйте с прайсом
    cost_per_million = 3.50  # $ за 1М входных токенов (Input)
    estimated_cost = (response.total_tokens / 1_000_000) * cost_per_million
    print(f"Примерная стоимость запроса: ${estimated_cost:.4f}")

# Пример использования
large_text = "Текст огромного документа... " * 5000
check_token_count(large_text)

Context Caching: Экономика больших данных

Главная проблема длинного контекста — это цена и латентность (задержка). Если вы каждый раз отправляете в модель книгу «Война и мир» (около 600к токенов), чтобы задать один вопрос, вы каждый раз платите за обработку этих 600к токенов. Это медленно и дорого.

Решение: Context Caching (Кэширование контекста).

Gemini позволяет вам загрузить контекст один раз, получить уникальный идентификатор кэша и ссылаться на него в последующих запросах. Это работает как «оперативная память» для вашей сессии.

  • Как это работает: Вы загружаете файлы или текст в кэш. Кэш живет определенное время (TTL - Time To Live).
  • Ценообразование: Вы платите за хранение кэша (дешево) и за ввод данных один раз. Последующие запросы к кэшу стоят значительно дешевле, чем повторная отправка данных.
  • Когда использовать: Если вы планируете сделать к одному и тому же набору данных более 2-3 запросов, кэширование уже становится выгодным.

python
import google.generativeai as genai
from google.generativeai import caching
import datetime
import time

# Предположим, у нас есть большой файл 'manual.pdf' (загруженный через File API)
# В реальном коде сначала используется genai.upload_file(...)

# Создание кэша
cache = caching.CachedContent.create(
    model='models/gemini-1.5-pro-001',
    display_name='technical_manual_cache',
    system_instruction='Ты эксперт по технической поддержке. Используй данный мануал для ответов.',
    contents=[document_file_object], # объект файла после загрузки
    ttl=datetime.timedelta(minutes=60) # Кэш живет 60 минут
)

print(f"Кэш создан: {cache.name}")

# Использование кэша
# Обратите внимание: мы создаем модель, привязанную к кэшу
model_with_cache = genai.GenerativeModel.from_cached_content(cached_content=cache)

response = model_with_cache.generate_content("Как сбросить настройки устройства до заводских?")
print(response.text)

# Обновление времени жизни (если сессия затянулась)
cache.update(ttl=datetime.timedelta(minutes=120))

Стратегии промптинга для 1М+ токенов

Даже с идеальной памятью модели, то, как вы формулируете запрос, влияет на качество ответа. При работе с экстремально длинным контекстом обычные правила меняются.

1. Позиционирование инструкций

В коротком контексте мы привыкли ставить инструкцию в начало («Ты полезный ассистент...»). В длинном контексте это всё ещё работает, но для сложных задач, требующих анализа всего массива данных, эффективна стратегия «Сэндвич» или «Напоминание в конце».

Пример:
[СИСТЕМНАЯ ИНСТРУКЦИЯ]
[ОГРОМНЫЙ КОНТЕКСТ ДАННЫХ]
[ПОВТОРЕНИЕ КЛЮЧЕВОГО ЗАДАНИЯ: Исходя из всех данных выше, найди...]

Повторение вопроса в конце помогает модели «сфокусироваться» после обработки миллионов токенов.

2. Chain-of-Thought (CoT) с цитированием

При таком объеме данных риск «галлюцинаций» (смешивания фактов) возрастает. Требуйте от модели цитировать источники.

Плохой промпт: «Сделай резюме финансовых показателей.»
Хороший промпт: «Проанализируй финансовые отчеты. Для каждого утверждения о прибыли или убытках укажи точную страницу и название документа, из которого взята цифра. Сначала выпиши все найденные цифры, а затем составь резюме.»

3. RAG vs Long Context: Где граница?

Это самый частый архитектурный вопрос. Когда переключаться?

КритерийRAG (Векторный поиск)Long Context (1M+ токенов)
Объем данныхБесконечный (терабайты)Ограничен окном (до 2М токенов)
Тип задачиНайти конкретный факт («Какой телефон у клиента?»)Обобщение, анализ связей, паттернов («Какие тенденции в жалобах клиентов за год?»)
Скорость (Latency)Быстро (миллисекунды/секунды)Медленнее (десятки секунд на первый проход)
ТочностьЗависит от качества нарезки (chunking)Максимальная (видит всё в оригинале)

Вердикт: Используйте Long Context для глубокого анализа конкретных наборов документов (книг, дел, проектов). Используйте RAG для поиска по всей базе знаний компании.

Упражнение

Вы разрабатываете систему для юридической фирмы. У юристов есть папка «Дело №123», содержащая 50 PDF-файлов (договоры, переписка, протоколы) общим объемом 800 000 токенов. Юристам нужно задавать сложные вопросы, требующие сопоставления фактов из разных документов (например, «Противоречат ли показания свидетеля А в протоколе от 5 марта условиям договора от 10 января?»). <br><br>Задача: Опишите архитектуру решения, выбрав между RAG и Long Context + Caching. Обоснуйте выбор и напишите псевдокод (или структуру промпта) для реализации.

Вопрос

В каком случае использование Context Caching (кэширования контекста) в Gemini является НАИБОЛЕЕ экономически оправданным?