Код-ревью 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
Коротко
Главная ошибка в ключе кеша: ответ зависит от прав пользователя, а кеш общий, это утечка данных между сотрудниками. Вторая группа: персональные данные и содержимое документов в логах и в промпте без необходимости.
Что должен найти ревьюер
- Безопасностьстрока 6Ключ кеша только по тексту вопроса, а ответ собран из документов, доступных конкретному пользователю. Другой сотрудник с тем же вопросом получит ответ по чужим документам. В ключ нужны область доступа, модель и версия промпта.
- Безопасностьстрока 13В лог пишется весь промпт с документами и email: персональные данные и коммерческая тайна оказываются в общих логах. Логировать метаданные, тексты маскировать или не писать.
- Безопасностьстрока 15Ответ модели и email пользователя в обычном логе: те же персональные данные. Достаточно идентификатора, токенов, задержки и стоимости.
- Ошибкастрока 16Кеш без срока жизни: после обновления документов или прав пользователи годами получают устаревшие ответы. Нужен TTL и инвалидация.
- Производительностьстрока 11Дата и email в начале промпта ломают кеш промпта у провайдера: префикс каждый раз разный. Стабильные инструкции ставят первыми, изменчивое в конец.
- Ошибкастрока 14Вызов модели без таймаута и обработки ошибок, и email в промпте модели не нужен: лишние персональные данные уходят провайдеру.
Разбор
Главная ошибка в ключе кеша: ответ зависит от прав пользователя, а кеш общий, это утечка данных между сотрудниками. Вторая группа: персональные данные и содержимое документов в логах и в промпте без необходимости. Плюс кеш без TTL и промпт, собранный так, что кеш провайдера не срабатывает. Правильно: ключ с областью доступа, моделью и версией промпта, TTL, логи только с метаданными, стабильная часть промпта в начале.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.