03Безопасность
Валидация вывода LLM
JSON-схемы, типы, проверки безопасности — никогда не доверяй сырому выводу.
Валидируй вывод LLM.
Правило: Никогда не передавай LLM-вывод напрямую в downstream систему без валидации.
Что может пойти не так
- Некорректный JSON (валидация формата)
- Корректный JSON, неверные типы / значения
- Hallucinations (выдуманные данные)
- Injection в downstream (SQL, command, prompt дальнейших агентов)
- Чувствительные данные в выводе
- Слишком длинный / короткий вывод
Слои валидации
1. Формат
JSON / YAML / structured:
try {
const data = JSON.parse(llmOutput);
} catch (e) {
// Retry с подсказкой "Output was not valid JSON"
}
Tip: Используй Anthropic structured outputs / tool use для гарантии формата. Если LLM поддерживает — это лучше чем парсинг строки.
2. Схема
Через Zod / Yup / JSON Schema:
const schema = z.object({
name: z.string().min(1).max(100),
age: z.number().int().min(0).max(150),
email: z.string().email().optional(),
status: z.enum(['active', 'inactive', 'pending']),
});
const result = schema.safeParse(data);
if (!result.success) {
// retry или error
}
3. Бизнес-валидация
Формат правильный, но данные могут быть:
- Несуществующий ID
- Out of range
- Конфликтующие значения
Проверь:
- ID-ссылки существуют в БД
- Значения в допустимых диапазонах
- Связки имеют смысл
4. Safety
- Не содержит PII (email, телефоны если не запрашивали)
- Не содержит инструкции которые могут быть injection в следующий шаг
- Не содержит malicious content (XSS, links на phishing)
- Длина в разумных пределах
5. Tool calls validation
Если LLM вернёт tool call:
// LLM хочет вызвать deleteUser(id: 5)
// Валидация:
if (!user.canDelete(targetId)) {
return "Permission denied";
}
if (targetId === user.id) {
return "Cannot delete self";
}
// Все ок — выполняй
Retry с feedback
Если валидация провалилась, retry с подсказкой:
async function getValidOutput(prompt, maxRetries = 2) {
for (let i = 0; i < maxRetries; i++) {
const output = await llm.complete(prompt);
const result = schema.safeParse(JSON.parse(output));
if (result.success) return result.data;
// Retry с feedback
prompt += `
Previous attempt failed: ${result.error.message}`;
}
throw new Error("Failed to get valid output");
}
Логирование
- Лог каждый случай валидации failed
- Анализ patterns — какие ошибки повторяются?
- Используй для улучшения промта
Anti-patterns
- ❌
eval(llmOutput)— катастрофа - ❌ Trust JSON.parse без schema validation
- ❌ Передать LLM output в SQL query
- ❌ Не retry при failed validation
- ❌ Логировать только успехи
Принципы
- Treat LLM output как user input — never trust
- Schema-first thinking — определи схему до промта
- Defense in depth — несколько слоёв проверок
- Fail loud — лучше ошибка чем тихий пропуск
Похожие промты
site / security
Content Security Policy и security headers
CSP, HSTS, X-Frame, Permissions-Policy — закрыть основные классы атак за один проход.
securitycspheaders
Открыть
Продвинутый30-60 мин
site / security
Управление секретами
Где хранить, как ротировать, как обнаружить утечку.
securitysecrets
Открыть
Средний30-60 мин
site / security
Аутентификация и rate limiting
Защита логина, реги, восстановления пароля от brute force.
securityauthrate-limit
Открыть
Продвинутый30-60 мин