Код-ревью Senior ИИ-фичи в продукте обновлено

Код-ревью: кеш и логи ИИ-ассистента

Вопрос

Ассистент добавил кеш и логирование в сервис, который отвечает сотрудникам на вопросы по их документам. Найдите проблемы.

import hashlib, json, logging

log = logging.getLogger("ai")

def answer(user, question):
    key = "ans:" + hashlib.sha256(question.encode()).hexdigest()
    cached = redis.get(key)
    if cached:
        return cached.decode()
    docs = search_docs(question, user=user)
    prompt = f"Сегодня {date.today()}. Пользователь {user.email}.\n" \
             f"Инструкции: {RULES}\nДокументы: {docs}\nВопрос: {question}"
    log.info("prompt=%s", prompt)
    text = llm.complete(prompt)
    log.info("answer=%s user=%s", text, user.email)
    redis.set(key, text)
    return text

Коротко

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

Что должен найти ревьюер

  1. Безопасностьстрока 6
    Ключ кеша только по тексту вопроса, а ответ собран из документов, доступных конкретному пользователю. Другой сотрудник с тем же вопросом получит ответ по чужим документам. В ключ нужны область доступа, модель и версия промпта.
  2. Безопасностьстрока 13
    В лог пишется весь промпт с документами и email: персональные данные и коммерческая тайна оказываются в общих логах. Логировать метаданные, тексты маскировать или не писать.
  3. Безопасностьстрока 15
    Ответ модели и email пользователя в обычном логе: те же персональные данные. Достаточно идентификатора, токенов, задержки и стоимости.
  4. Ошибкастрока 16
    Кеш без срока жизни: после обновления документов или прав пользователи годами получают устаревшие ответы. Нужен TTL и инвалидация.
  5. Производительностьстрока 11
    Дата и email в начале промпта ломают кеш промпта у провайдера: префикс каждый раз разный. Стабильные инструкции ставят первыми, изменчивое в конец.
  6. Ошибкастрока 14
    Вызов модели без таймаута и обработки ошибок, и email в промпте модели не нужен: лишние персональные данные уходят провайдеру.

Разбор

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

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.