/
Вопросы и ответы
/
Промт-инжиниринг
/

Как правильно передавать историю диалога в языковую модель?

Как правильно передавать историю диалога в языковую модель?

17 дней назад

Никита Вихров

Ответы

0

Как правильно передавать историю диалога в языковую модель

Языковая модель не помнит предыдущие сообщения — каждый запрос независимый. Чтобы поддерживать диалог, историю нужно передавать явно при каждом вызове.

Базовый пример

from openai import OpenAI

client = OpenAI()

history = []

def chat(user_text: str, system: str) -> str:
    history.append({"role": "user", "content": user_text})

    resp = client.chat.completions.create(
        model="gpt-4.1",
        messages=[{"role": "system", "content": system}] + history,
        max_tokens=512
    )

    answer = resp.choices[0].message.content
    history.append({"role": "assistant", "content": answer})
    return answer

system = "Ты помощник по изучению Python."

print(chat("Что такое список?", system))
print(chat("А чем он отличается от кортежа?", system))

Проблема: история растет и переполняет контекст

Если не ограничивать историю, рано или поздно суммарный объем превысит допустимый размер контекста модели.

Простое решение: скользящее окно

MAX_TURNS = 10  # последние N пар сообщений

def trim_history(history: list[dict]) -> list[dict]:
    # Пара — это сообщение пользователя + ответ модели
    pairs = MAX_TURNS * 2
    return history[-pairs:] if len(history) > pairs else history

def chat_trimmed(user_text: str, system: str) -> str:
    history.append({"role": "user", "content": user_text})
    trimmed = trim_history(history)

    resp = client.chat.completions.create(
        model="gpt-4.1",
        messages=[{"role": "system", "content": system}] + trimmed,
        max_tokens=512
    )

    answer = resp.choices[0].message.content
    history.append({"role": "assistant", "content": answer})
    return answer

Когда скользящего окна мало

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

Правила

  • Не передавайте бесконечную историю — это дорого и ухудшает качество ответов.
  • Логируйте полную историю в базе отдельно, передавайте модели только нужное.
  • Суммаризируйте, если диалог длинный и факты из начала важны.

17 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845