promptfoo пробовал — не зашёл в основном из-за YAML и отдельного DSL. В итоге сделал похожую штуку как плагин поверх Vitest + Playwright, чтобы не тащить ещё один слой абстракции
Соглашусь с тезисом про “тестируем поведение, а не exact match” — у себя делаю примерно то же самое, но через кастомные матчеры:
toMatchSemanticMeaning(expected, options?)
toSatisfyCriteria(rubric, options?)
toContainToolCall(name, args?)
toMatchResponseSchema(schema)
toContainText(text) / toNotContainText(text)
Но у меня это встроено в e2e слой, потому что продукт — это по сути динамический UI + чат. Там важно не только что ответил LLM, но и:
какие тулы вызвались
что вернулось в UI
как это повлияло на следующий шаг
Возможно, это действительно ближе к e2e, чем к чистым eval’ам - но мне пока кажется, что в AI-first продуктах это не совсем разделимые вещи.
Отдельный eval-слой (типа promptfoo) пока не стал выносить, но идея с golden dataset из прод-запросов - 100% согласен, это сейчас основной источник правды.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Соглашусь с тезисом про “тестируем поведение, а не exact match” — у себя делаю примерно то же самое, но через кастомные матчеры:
Но у меня это встроено в e2e слой, потому что продукт — это по сути динамический UI + чат. Там важно не только что ответил LLM, но и:
Возможно, это действительно ближе к e2e, чем к чистым eval’ам - но мне пока кажется, что в AI-first продуктах это не совсем разделимые вещи.
Отдельный eval-слой (типа promptfoo) пока не стал выносить, но идея с golden dataset из прод-запросов - 100% согласен, это сейчас основной источник правды.