AI Prompt Engineering · Урок

Объём и релевантность контекста

Сочетайте полноту контекста с ограничениями на количество токенов и релевантностью

Урок 4 из 413 шагов

«Объём и релевантность контекста» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.

Бюджет контекстного окна

У каждой модели есть максимальный размер контекстного окна — общее количество токенов, которое она может обработать за один вызов программного интерфейса. Сюда входят и входные данные (ваш запрос и история диалога), и выходные данные (ответ модели).

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

Размеры контекстного окна

У разных моделей разные ограничения контекста. По состоянию на 2025 год:

  • GPT-4o: 128 000 токенов
  • Claude Opus 4.5: 200 000 токенов
  • Gemini 1.5 Pro: 1 000 000 токенов
  • GPT-3.5 Turbo: 16 385 токенов

Большие окна позволяют включать больше контекста, но каждый вызов обходится дороже. Для большинства задач достаточно 8 000–16 000 токенов. Больший размер не всегда лучше, если из-за него приходится включать не относящееся к делу содержимое.

import tiktoken

def estimate_tokens(text, model='gpt-4o'):
    encoding = tiktoken.encoding_for_model(model)
    return len(encoding.encode(text))

# Quick token budget calculator
models = {
    'GPT-3.5 Turbo':  16385,
    'GPT-4o':        128000,
    'Claude Opus 4.5': 200000,
}

prompt = 'Explain the concept of technical debt in 500 words for a non-technical CEO.'
prompt_tokens = estimate_tokens(prompt)

for model_name, limit in models.items():
    reserved_for_output = 1024
    available = limit - prompt_tokens - reserved_for_output
    print(f'{model_name}: limit={limit:,} | prompt={prompt_tokens} | '
          f'context budget={available:,} tokens')

Что включать: оценка релевантности

Прежде чем включить какой-либо элемент контекста, спросите себя: изменит ли эта информация ответ?

Простая мысленная схема — оцените каждый элемент контекста:

  • Высокая релевантность (включить): напрямую влияет на задачу, определяет словарь, ограничивает варианты
  • Средняя релевантность (возможно, включить): добавляет полезные подробности, но результат был бы OK и без них
  • Низкая релевантность (исключить): информация верна, но никак не влияет на ответ
def score_context_element(element, task):
    '''
    Heuristic: does this context element directly constrain or shape the answer?
    Returns: HIGH / MEDIUM / LOW
    '''
    high_signals = ['stack', 'constraint', 'deadline', 'must', 'cannot', 'budget',
                    'audience', 'goal', 'version', 'scale', 'limit']
    low_signals  = ['founded', 'headquartered', 'fun fact', 'history', 'awards',
                    'team building', 'company culture', 'office location']

    el_lower = element.lower()
    if any(s in el_lower for s in high_signals):
        return 'HIGH'
    if any(s in el_lower for s in low_signals):
        return 'LOW'
    return 'MEDIUM'

context_elements = [
    'Our stack is Python FastAPI and PostgreSQL',
    'We cannot use any paid third-party APIs',
    'Our company was founded in Berlin in 2020',
    'We need the solution to handle 1000 requests/second',
    'We won a startup award last year',
]

for el in context_elements:
    score = score_context_element(el, task='optimize our API')
    print(f'[{score:6}] {el}')

Проблема потери информации в середине

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

Рекомендуемый подход: размещайте наиболее важный контекст в начале или конце запроса — этим позициям модель уделяет больше всего внимания.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Structure: critical constraint at the TOP, then the body, then the task
well_structured_prompt = (
    # Critical constraint FIRST
    'CRITICAL CONSTRAINT: Output must be under 50 words and contain no code.\n\n'
    # Background in the middle
    'Background: we are explaining our API rate limiting policy to non-technical support agents. '
    'They handle billing inquiries and need to explain errors to customers. '
    'Our rate limit is 100 requests per minute per API key.\n\n'
    # Task at the end
    'Task: Write the explanation.'
)

response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=128,
    messages=[{'role': 'user', 'content': well_structured_prompt}]
)
print(response.content[0].text)

Разбиение длинных документов на фрагменты

Если вам нужно работать с документом, который превышает ваш бюджет токенов, есть три варианта:

  • Сначала обобщить: попросить модель сжать документ, а затем работать с его кратким изложением
  • Разделить и обработать: разбить документ на части, обработать каждую, а затем объединить результаты
  • Извлечь и вставить: извлечь только релевантные разделы перед добавлением их в запрос

Никогда не пытайтесь протолкнуть документ, превышающий размер контекстного окна: он будет незаметно обрезан.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

def chunk_and_summarize(long_text, chunk_size=2000):
    '''Split text into chunks, summarize each, combine summaries.'''
    words = long_text.split()
    chunks = []
    for i in range(0, len(words), chunk_size):
        chunk = ' '.join(words[i:i + chunk_size])
        chunks.append(chunk)

    summaries = []
    for idx, chunk in enumerate(chunks):
        response = client.messages.create(
            model='claude-opus-4-5',
            max_tokens=256,
            messages=[{
                'role': 'user',
                'content': f'Summarize this section in 3 bullet points:\n\n{chunk}'
            }]
        )
        summaries.append(f'Section {idx+1}:\n{response.content[0].text}')

    return '\n\n'.join(summaries)

# Example usage
long_doc = 'word ' * 5000  # placeholder for a real document
print('Chunks needed:', len(long_doc.split()) // 2000 + 1)

Фильтрация релевантности на практике

Фильтрация релевантности означает извлечение только нужных частей большого документа перед добавлением его в запрос. Это особенно важно для:

  • длинных отчётов, в которых релевантен только один раздел
  • файлов кода, в которых нужно проверить только одну функцию
  • цепочек электронных писем, в которых важны только последние 3 сообщения
  • схем баз данных, в которых релевантны только 2 из 50 таблиц
import openai

client = openai.OpenAI(api_key='sk-your-key-here')

# Step 1: Filter first, then ask
full_schema = (
    'Table: users (id, name, email, created_at, role)\n'
    'Table: products (id, name, price, stock, category_id)\n'
    'Table: orders (id, user_id, total, status, created_at)\n'
    'Table: order_items (id, order_id, product_id, quantity, unit_price)\n'
    'Table: categories (id, name, parent_id)\n'
    'Table: reviews (id, product_id, user_id, rating, body)\n'
    'Table: sessions (id, user_id, token, expires_at)'
)

# Only include relevant tables for the specific question
relevant_context = (
    'Relevant tables for this query:\n'
    'Table: orders (id, user_id, total, status, created_at)\n'
    'Table: order_items (id, order_id, product_id, quantity, unit_price)\n'
)

response = client.chat.completions.create(
    model='gpt-4o',
    messages=[{
        'role': 'user',
        'content': f'{relevant_context}\nWrite SQL to find the top 5 orders by total value this month.'
    }]
)
print(response.choices[0].message.content)

Управление историей диалога

В многоэтапных диалогах история увеличивается после каждой реплики. Грамотное управление ею помогает сохранять здоровый бюджет токенов:

  • Скользящее окно: сохранять только последние N реплик
  • Добавление краткого изложения: периодически объединять старые реплики в одно краткое сообщение
  • Извлечение ключевых фактов: отслеживать важные решения в виде маркированного списка и добавлять его как системный контекст
  • Сброс при смене темы: начинать новый сеанс при переходе к несвязанной теме
import openai

client = openai.OpenAI(api_key='sk-your-key-here')

def summarize_history(old_history):
    '''Compress old conversation turns into a brief summary.'''
    history_text = '\n'.join(
        f'{m["role"].upper()}: {m["content"]}' for m in old_history
    )
    response = client.chat.completions.create(
        model='gpt-4o',
        max_tokens=200,
        messages=[{
            'role': 'user',
            'content': (
                'Summarize this conversation history in 3 bullet points. '
                'Focus on decisions made and key information established.\n\n'
                + history_text
            )
        }]
    )
    return response.choices[0].message.content

# Example: compressing old history before continuing
old_turns = [
    {'role': 'user',      'content': 'We are building a Kanban app.'},
    {'role': 'assistant', 'content': 'Great, what is your stack?'},
    {'role': 'user',      'content': 'React + FastAPI + PostgreSQL.'},
    {'role': 'assistant', 'content': 'Good choice for a Kanban app.'}
]
summary = summarize_history(old_turns)
print('Summary of old history:', summary)

Методы сжатия контекста

Когда нужно включить много контекста, но бюджет токенов ограничен, используйте методы сжатия:

  • Маркированный список вместо прозы: маркированные списки на 30–50% эффективнее предложений с точки зрения количества токенов
  • Сокращайте известные термины: после первого использования «PostgreSQL 15» → «ПГ15»
  • Удаляйте вводные фразы: вместо «Стоит отметить, что…» просто сообщите факт
  • Используйте структурированные форматы: пары «ключ:значение» плотнее, чем предложения
import tiktoken

def count_tokens(text):
    enc = tiktoken.encoding_for_model('gpt-4o')
    return len(enc.encode(text))

# Same information, different token counts
prose_context = (
    'Our company is a startup that was founded recently and we are building '
    'a data analytics platform. It is worth noting that we use Python for our backend. '
    'Additionally, we have chosen PostgreSQL as our primary database. '
    'Furthermore, we deploy on AWS using ECS containers.'
)

bullet_context = (
    'Company: data analytics startup\n'
    'Stack: Python backend, PostgreSQL, AWS ECS'
)

print('Prose context tokens: ', count_tokens(prose_context))
print('Bullet context tokens:', count_tokens(bullet_context))
print('Tokens saved:', count_tokens(prose_context) - count_tokens(bullet_context))
print('Same information? Yes — same facts, 60% fewer tokens')

Динамический выбор контекста

В рабочих приложениях на основе ИИ контекст часто выбирается динамически — в зависимости от того, что наиболее релевантно текущему запросу. Это называется генерацией с дополнением извлечёнными данными (RAG).

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

# Simplified RAG pattern: retrieve relevant chunks, inject into prompt
import openai

client = openai.OpenAI(api_key='sk-your-key-here')

# Simulated knowledge base (in production: vector database)
knowledge_base = [
    {'id': 1, 'topic': 'billing',   'text': 'Refunds are processed within 5-7 business days.'},
    {'id': 2, 'topic': 'shipping',  'text': 'Standard shipping takes 3-5 days.'},
    {'id': 3, 'topic': 'returns',   'text': 'Returns accepted within 30 days with receipt.'},
    {'id': 4, 'topic': 'warranty',  'text': 'All products come with a 1-year warranty.'},
]

def get_relevant_docs(user_query, kb, top_k=2):
    '''Simplified relevance: keyword match. Production uses embeddings.'''
    scored = [(doc, sum(w in user_query.lower() for w in doc['topic'].split())) for doc in kb]
    scored.sort(key=lambda x: x[1], reverse=True)
    return [doc['text'] for doc, _ in scored[:top_k]]

query = 'Can I return this and get my money back?'
relevant = get_relevant_docs(query, knowledge_base)
context = '\n'.join(relevant)
print('Injected context:', context)
response = client.chat.completions.create(
    model='gpt-4o', max_tokens=80,
    messages=[{'role': 'user', 'content': f'Context:\n{context}\n\nQuestion: {query}'}]
)
print('Answer:', response.choices[0].message.content.strip())

Планирование бюджета контекста

Перед созданием рабочего приложения заранее спланируйте бюджет контекста:

  • зарезервируйте 25% контекстного окна для выходных данных
  • выделите 10% для системного сообщения и персоны
  • выделите 30% для самой свежей истории диалога
  • оставьте 35% для динамического контекста (извлечённых документов и добавленных данных)

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

# Context budget planner
MODEL_LIMIT = 128000  # GPT-4o

BUDGET = {
    'output_reserve':  int(MODEL_LIMIT * 0.25),  # 32,000 tokens
    'system_message':  int(MODEL_LIMIT * 0.05),  # 6,400 tokens
    'recent_history':  int(MODEL_LIMIT * 0.30),  # 38,400 tokens
    'dynamic_context': int(MODEL_LIMIT * 0.35),  # 44,800 tokens
    'task_prompt':     int(MODEL_LIMIT * 0.05),  # 6,400 tokens
}

total_input = sum(v for k, v in BUDGET.items() if k != 'output_reserve')
print('Context budget plan:')
for key, tokens in BUDGET.items():
    pct = round(tokens / MODEL_LIMIT * 100)
    print(f'  {key:<20}: {tokens:>7,} tokens ({pct}%)')
print(f'  {"total input":<20}: {total_input:>7,} tokens')
print(f'  {"+ output reserve":<20}: {BUDGET["output_reserve"]:>7,} tokens')
print(f'  {"= model limit":<20}: {MODEL_LIMIT:>7,} tokens')

Когда релевантность важнее длины

Контекст объёмом 500 токенов, полностью соответствующий задаче, даёт лучший результат, чем контекст объёмом 5 000 токенов, лишь отдалённо связанный с ней. Когда модели приходится разбирать меньше материала, она выдаёт лучший результат.

Признаки того, что ваш контекст слишком длинный и не сфокусирован:

  • модель игнорирует некоторые ваши ограничения
  • результат кажется шаблонным, несмотря на большой объём контекста
  • модель отвечает не на ту часть вашего вопроса
  • задержка и стоимость выше ожидаемых

Если вы заметили эти признаки, сократите контекст и запустите обработку ещё раз.

import anthropic

client = anthropic.Anthropic(api_key='sk-ant-your-key-here')

# Demonstrating: lean context produces sharper output
lean_context = (
    'Task: write a 50-word product tagline.\n'
    'Product: CLI tool that auto-generates Git commit messages from your diff.\n'
    'Audience: senior developers who hate writing commit messages.\n'
    'Tone: dry, witty, technical.'
)

response = client.messages.create(
    model='claude-opus-4-5',
    max_tokens=100,
    messages=[{'role': 'user', 'content': lean_context}]
)
print('Lean context output:')
print(response.content[0].text.strip())

Проверка знаний

Разработчик создаёт чат-бота с историей диалога из 20 реплик. После 20 реплик контекстное окно почти заполнено. Какую BEST-стратегию следует выбрать, чтобы продолжить диалог и не потерять важный контекст?

Длина и релевантность контекста — повторение

Эффективное управление контекстом — важнейший навык составления запросов, который становится критически необходимым в рабочих приложениях. Основные принципы:

  • оценивайте каждый элемент контекста: высокая / средняя / низкая релевантность — включайте только элементы с высокой релевантностью
  • размещайте важные ограничения в начале или конце, а не в середине
  • используйте маркированные списки вместо прозы, чтобы сэкономить 30–50% токенов
  • обобщайте или разбивайте на части документы, превышающие ваш бюджет
  • в многоэтапных диалогах сжимайте старую историю, а не начинайте всё заново
  • явно планируйте свой бюджет контекста в виде констант кода
Можно начать бесплатно

Изучай AI Prompt Engineering с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
53
Уроки
199

Часто задаваемые вопросы

Урок «Объём и релевантность контекста» бесплатный?

Да — полный текст урока «Объём и релевантность контекста» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.

Чему я научусь в уроке «Объём и релевантность контекста»?

Сочетайте полноту контекста с ограничениями на количество токенов и релевантностью Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Prompt Engineering?

Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Объём и релевантность контекста»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Prompt Engineering?

Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Что означает контекст при составлении запросов к искусственному интеллекту
  2. Предоставление исходной информации
  3. Эффективная постановка контекста
  4. Объём и релевантность контекста
← Назад к AI Prompt Engineering