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

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

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

17 дней назад

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

Ответы

0

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

Языковая модель не помнит предыдущие разговоры. Если нужно, чтобы система «помнила» пользователя — его стек, уровень, предпочтения — эти данные нужно извлекать из диалога и хранить самостоятельно.

Схема

Диалог заканчивается ↓ Извлекаем новые факты о пользователе ↓ Дополняем профиль в базе ↓ При следующем запросе вставляем профиль в контекст

Шаг 1: извлечь факты из диалога

from openai import OpenAI
import json

client = OpenAI()

def extract_user_facts(dialog: list[dict]) -> list[str]:
    текст_диалога = "\n".join(
        f"{m['role'].upper()}: {m['content']}" for m in dialog
    )

    prompt = f"""Из диалога ниже извлеки конкретные факты о пользователе:
язык программирования, фреймворки, уровень, цели, проблемы.

Верни JSON-массив строк. Если фактов нет — верни [].

Диалог:
{текст_диалога}"""

    resp = client.chat.completions.create(
        model="gpt-4.1",
        temperature=0.0,
        max_tokens=256,
        messages=[{"role": "user", "content": prompt}]
    )

    return json.loads(resp.choices[0].message.content)

Шаг 2: обновить профиль

def update_profile(existing: list[str], new_facts: list[str]) -> list[str]:
    все = existing + new_facts
    if not все:
        return []

    prompt = f"""Объедини список фактов о пользователе.
Убери дубли, уточни устаревшие данные новыми.
Верни JSON-массив строк.

Факты:
{json.dumps(все, ensure_ascii=False)}"""

    resp = client.chat.completions.create(
        model="gpt-4.1",
        temperature=0.0,
        max_tokens=256,
        messages=[{"role": "user", "content": prompt}]
    )

    return json.loads(resp.choices[0].message.content)

Шаг 3: использовать профиль в следующей сессии

def build_system_with_profile(base_system: str, profile: list[str]) -> str:
    if not profile:
        return base_system

    факты = "\n".join(f"- {f}" for f in profile)
    return f"{base_system}\n\nЧто известно о пользователе:\n{факты}"

профиль = [
    "Пишет на Python 3.11",
    "Работает с FastAPI и PostgreSQL",
    "Начинающий, изучает async/await"
]

system = build_system_with_profile(
    "Ты наставник по программированию.",
    профиль
)

Правила

  • Спрашивайте согласие пользователя на сохранение данных.
  • Давайте возможность удалить профиль.
  • Не храните в профиле чувствительные данные — только технические факты.
  • Ограничивайте размер профиля: 10–20 фактов достаточно.

17 дней назад

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

+7 800 100 22 47

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

+7 495 085 21 62

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

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