Skip to content
PПромтбук
RUEN
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 — лучше ошибка чем тихий пропуск
К подразделу «Безопасность»
Похожие промты