Inspect AI, An OSS Python Library For LLM Evals – Hamel’s Blog - Hamel Husain
Несколько недель назад Hamel Husain пригласил JJ Allaire — основателя RStudio (теперь Posit) — прочитать гостевую лекцию в их курсе по LLM Evals. Статья представляет собой аннотированную версию презентации о Inspect AI, открытом Python-фреймворке (inspect-ai) для создания и запуска оценок LLM, который JJ разработал во время сабbatical в британском AI Safety Institute (AISI). Inspect строится вокруг трёх основных концепций — Dataset, Solver и Scorer — и предлагает как высокоуровневый API из готовых блоков, так и низкоуровневый универсальный интерфейс к LLM с кэшированием, логированием, инструментами и параллельным выполнением. Фреймворк имеет первоклассную поддержку инструментов и агентов, песочниц для безопасного исполнения кода, систему одобрения рискованных действий и подробное логирование с интерактивным просмотрщиком. Inspect уже используется почти для всех автоматических оценок AISI и принят крупнейшими AI-лабораториями, включая Anthropic, DeepMind и Grok, а проект открыт и насчитывает более 100 внешних контрибьюторов.
Несколько недель назад я имел удовольствие принимать JJ Allaire в качестве приглашённого лектора на нашем курсе по LLM Evals. Для тех, кто, возможно, не знает: JJ — легенда в области инструментов для разработчиков. Он основатель RStudio (теперь Posit) — компании, стоящей за IDE RStudio и многими фундаментальными пакетами в экосистемах data science на R и Python. Когда такой человек, как JJ, обращает своё внимание на новую задачу, стоит присмотреться повнимательнее.
Его последнее начинание — Inspect AI, фреймворк с открытым исходным кодом для создания и запуска оценок LLM. Он разработал его во время сабbatical в британском AI Safety Institute (AISI) — организации, которая проводит тысячи оценок frontier-моделей. С тех пор он был принят как предпочтительный фреймворк во многих из крупнейших AI-лабораторий, включая Anthropic, DeepMind и Grok.
Доклад был обзором философии, архитектуры и возможностей Inspect. Это аннотированная версия его презентации, вдохновлённая аннотированными презентациями Simon Willison.
Видео
Вот полное видео:
👉 В следующем месяце мы проводим наш самый последний, финальный поток нашего курса по AI Evals (нам нужно вернуться к разработке). Вот промокод на скидку 35% для читателей этого поста. 👈
Аннотированная презентация
Ниже приведена аннотированная версия презентации, с привязанными по времени ссылками на соответствующие части презентации для каждого слайда.
1. Обзор Inspect
Inspect — это Python-пакет (inspect-ai), призванный преодолеть разрыв между исследованиями и продакшеном для оценок LLM. JJ подчёркивает, что он уже используется почти для всех автоматических оценок британского AISI и получил широкое распространение в крупных AI-лабораториях, таких как Anthropic, DeepMind, Grok и других.
2. Мотивация
Мотивация, стоящая за Inspect, — улучшить воспроизводимость оценок, особенно для крупномасштабных оценок frontier-моделей. Inspect достигает этого, предоставляя общие инструменты и простую точку входа для запуска почти любого бенчмарка одной командой. Помимо того, что бенчмарки становятся воспроизводимыми, Inspect предоставляет фреймворк, который помогает с предметно-специфичными и кастомными оценками.
Inspect имеет открытый исходный код и активно приветствует внешний вклад.
3. Основные концепции
JJ разбивает Inspect на три основные концепции: Dataset, Solver и Scorer. * Dataset: это ваш набор тестовых случаев, каждый из которых имеет input (промпт для модели) и target (правильный ответ или указания по оценке). * Solver: это сердце всей операции. Это Python-функция, которая определяет логику того, как модель должна генерировать свой вывод. Это может варьироваться от простого вызова модели до сложных цепочек, включающих prompt engineering, самокритику или использование инструментов и агентов. * Scorer: эта функция оценивает вывод модели относительно target. Это может быть простое текстовое сравнение, более сложная оценка с участием модели (например, использование LLM в качестве судьи) или полностью кастомная схема валидации.
JJ уточняет, что «Solver» — это место, где вы можете реализовать более сложные техники рассуждения. Он приводит примеры использования циклов «критика и регенерация» или «агентного каркаса с использованием инструментов» для определения того, как модель приходит к своему ответу.
4. Пример «Hello, World»
Этот пример кода демонстрирует основные компоненты фреймворка. В этом примере план таков: сначала использовать промпт chain_of_thought, затем стандартный вызов generate и, наконец, раунд self_critique перед получением финального вывода, который оценивается.
Задача (theory_of_mind) определяется с помощью декоратора @task. Внутри она возвращает объект Task, который задаёт dataset, plan (список солверов, таких как chain_of_thought и self_critique) и scorer. Финальный вызов eval() запускает всю оценку на указанной модели (openai/gpt-4).
5. Два взгляда на Inspect
JJ представляет два способа думать об Inspect и использовать его. Высокоуровневый взгляд — это использование готовых строительных блоков (солверов, скореров и т.д.) для быстрой компоновки оценок. Низкоуровневый взгляд открывает набор утилит, таких как универсальный интерфейс к LLM с кэшированием, логированием, метриками, инструментами и параллельным выполнением.
«Низкоуровневый» взгляд описывается как «очень глубокий универсальный интерфейс к LLM». Это означает, что он предоставляет единообразный способ взаимодействия с разными провайдерами моделей и разными способами вызова инструментов, будь то внутренние функции или внешние веб-поиски.
6. Примеры высокоуровневого API
Задача gpqa_diamond — это простая оценка с множественным выбором. Задача intercode_ctf — более продвинутая «агентная оценка» на основе челленджа Capture the Flag. Для этой задачи модели предоставляется доступ к инструментам bash и python внутри docker-контейнера, и она должна сообразить, как выполнить челлендж.
7. Низкоуровневый API
Этот слайд противопоставляет высокоуровневый API его низкоуровневому эквиваленту. Вместо декларативного plan вы можете написать async Python-функцию (solve), которая даёт вам полный контроль. Здесь вы можете вручную добавлять сообщения, управлять инструментами, вызывать модель в цикле, разрешать вызовы инструментов и т.д.
Этот низкоуровневый подход — то, что вы использовали бы для создания более «продвинутых агентов» или реализации «по-настоящему индивидуальной обработки». Он даёт вам прямой контроль над «механикой генерации и вызова инструментов», например, управлением состоянием разговора в цикле.
8. Solvers
Solver формально определяется как Python-функция, которая принимает объект TaskState и преобразует его.
9. Базовые солверы
Inspect поставляется с несколькими базовыми солверами. prompt_template() — это солвер, который модифицирует текущий промпт, пропуская его через шаблон. Солвер generate() — это основной компонент, который обрабатывает вызов модели. Важная деталь: он автоматически разрешает вызовы инструментов и при необходимости повторяет цикл генерации и вызова инструментов.
10. Солвер для множественного выбора
Это более специализированный солвер, предназначенный для вопросов с множественным выбором. Он интеллектуально переписывает промпт, чтобы включить варианты (например, A, B, C), при необходимости перемешивает их для предотвращения позиционного смещения, а затем сопоставляет однотокенный вывод модели (например, «A») обратно с правильным индексом варианта для оценки.
11. Солвер самокритики
Солвер self_critique сначала генерирует ответ, затем использует шаблон критики, чтобы попросить модель (или даже другую, более мощную модель) критически оценить собственный ответ. Эта критика затем добавляется в историю разговора, и модель просят сгенерировать улучшенный ответ.
12. Композиция
Важный принцип проектирования Inspect — композиция. Кастомные солверы и скореры можно создавать и упаковывать в стандартные Python-пакеты. Это позволяет легко делиться ими и переиспользовать их в самых разных оценках. Упомянутый пакет sheppard — это внутренний инструмент, используемый в британском AISI, который содержит различные техники джейлбрейкинга. Они реализованы как солверы, применяющие разные виды prompt engineering.
13. Пример композиции
Этот слайд приводит пример композиции. Он показывает оценку безопасности, которая импортирует солвер pap_jailbreak из пакета sheppard. Этот джейлбрейк-солвер затем вставляется в plan перед финальным шагом generate.
14. Использование инструментов
Inspect имеет первоклассную поддержку использования инструментов. Объект TaskState может содержать список доступных ToolDef. Солвер use_tools() — это основной способ сделать эти инструменты доступными для функции generate(), которая затем обрабатывает полный цикл вызова инструментов.
15. Агенты и инструменты
JJ обозначает несколько способов реализации и оценки агентов. Вы можете использовать встроенный use_tools() с промптом в стиле ReAct для простых «автопилотных» агентов. Для более сложных сценариев вы можете написать собственную логику агента внутри кастомного солвера.
Inspect также предоставляет мосты (bridges), которые интегрируются с популярными внешними библиотеками, такими как LangChain и Autogen. Эти мосты — отличный способ использовать Inspect, не переписывая код вашего агента. Agent Bridge работает за счёт «monkey-patching» базового клиента openai API. Когда ваш внешний агент делает стандартный вызов OpenAI API, Inspect перехватывает его, направляет к текущей сконфигурированной модели для задачи оценки и логирует всё взаимодействие. По сути, он действует как прокси.
16. Agent API
Agent API предоставляет инструменты для задач Linux и веба, разделение состояния между компонентами, форкинг TaskState для суб-агентов в сложных потоках, детальную наблюдаемость, песочницу для исполнения недоверенного кода и настраиваемую систему одобрения для рискованных действий.
17. Инструменты агента
Inspect предоставляет набор готовых инструментов для агентов. К ним относятся Web Search, исполнение Bash and Python, Text Editor, Web Browser (использующий headless Chromium) и даже инструмент Computer, который позволяет агенту взаимодействовать с десктоп-окружением через скриншоты. Инструмент Think также позволяет модели явно выводить свои шаги рассуждения.
Мне показалось, что они выглядят довольно неплохо для использования в ваших основных вызовах LLM, но JJ настоял, что они предназначены только для оценок. JJ заметил: «В Inspect почти все те же инструменты, что и в LangChain, но наши пользователи сосредоточены на оценках — я не хочу подталкивать людей к использованию их для других целей». В качестве уточнения: вы не захотите использовать отдельные инструменты для ваших основных вызовов LLM и для ваших оценок (там, где это возможно, вы должны запускать один и тот же пайплайн). Это просто инструменты для оценок на случай, если вашему потоку оценки они понадобятся.
18. Одобрение действий агента
Этот слайд демонстрирует интерактивную систему одобрения действий агента. Когда агент хочет выполнить потенциально чувствительный вызов инструмента (например, отправить форму на веб-сайте), оценка может приостановиться и запросить одобрение у человека-оператора. Оператор может одобрить, отклонить или завершить задачу, обеспечивая критически важный уровень безопасности для агентных оценок.
Этот слайд показывает инструмент использования браузера, который выглядел довольно неплохо. В этот момент JJ смягчился и сказал, что, может быть, его можно использовать и для вещей за пределами оценок :)
JJ отметил, что по мере того, как развёртывается всё больше LLM-агентов, веб-сайты всё лучше обнаруживают ботов, поэтому обязательно тестируйте инструменты браузера для ваших задач оценки, прежде чем развёртывать их.
19. Агентные оценки
Inspect поставляется с реализациями нескольких хорошо известных бенчмарков на основе агентов. Сюда входят GAIA для универсальных AI-ассистентов, GDM Dangerous Capabilities, включающий челленджи Capture the Flag по кибербезопасности, и SWE-Bench для решения GitHub-issue.
20. Оценивание (Scoring)
Оценивание в Inspect гибкое. В нём есть встроенные скореры для обычного сопоставления по паттернам и шаблонных ответов. Скорер с оценкой моделью также встроен и может быть сильно кастомизирован. Скореры подключаемые, поэтому вы можете легко предоставлять их из других пакетов, и JJ отмечает, что они ожидают много инноваций в этой области. Также есть полная поддержка офлайн/человеческих рабочих процессов оценивания.
21. Пример кастомного скорера
Этот пример показывает реализацию кастомного скорера expression_equivalence. Он использует регулярное выражение для извлечения ответа, а затем запрашивает LLM, чтобы тот рассудил, математически ли эквивалентен ответ модели целевому выражению.
22. Продакшен: параллелизм
Inspect спроектирован для огромного масштаба. Он может работать конкурентно с несколькими моделями и задачами. Вы можете настроить max_connections для конкурентности API и max_subprocesses для конкурентности Docker-контейнеров. Благодаря своей async-архитектуре один узел может запускать десятки оценок параллельно с минимальным использованием ресурсов.
23. Продакшен: наборы оценок (Eval Sets)
Чтобы справиться с ненадёжностью крупномасштабных систем (например, лимиты запросов моделей, сетевые ошибки), в Inspect есть концепция «Eval Sets». Этот инструмент командной строки применяет лучшие практики для устойчивости, включая автоматические повторы с настраиваемыми стратегиями, переиспользование сэмплов из проваленных задач, чтобы работа не повторялась, и возможность перезапустить команду так, чтобы она продолжила ровно с того места, где остановилась предыдущая.
24. Продакшен: логирование
Комплексное логирование — краеугольный камень фреймворка. Inspect фиксирует весь контекст, необходимый для отладки, анализа и, что самое важное, воспроизведения оценки. Он предоставляет Python API для вычислений над лог-файлами и просмотрщик логов для интерактивного исследования результатов.
25. Структура EvalLog
Каждый запуск оценки производит структурированный файл EvalLog. Этот слайд детализирует его содержимое, которое включает общий статус, сведения о задаче оценки и модели, использованный план солверов, список каждого оценённого сэмпла (с его input, output и оценкой), агрегированные результаты, статистику использования токенов и любые логирующие сообщения или ошибки.
26. Скриншот просмотрщика логов
Это основной вид просмотрщика логов Inspect, inspect-view. Он показывает таблицу всех сэмплов в запуске оценки. Вы можете видеть input, target, ответ модели и финальную оценку (Correct/Incorrect). Вверху отображается общая точность и другие метрики, такие как bootstrap-стандартное отклонение.
27. Детальный вид сэмпла
Когда вы кликаете по сэмплу в просмотрщике логов, вы получаете детальный вид. Этот детальный разбор показывает полный input-промпт, target, полный ответ от модели и оценку, предоставляя ясный способ изучить отдельные успехи и неудачи.
28. Вид истории сообщений
Для более сложных, многошаговых оценок просмотрщик отображает всю историю сообщений. Сюда входят изначальный пользовательский промпт, процесс «размышления» ассистента, любые вызовы инструментов и финальный ответ, давая вам полный транскрипт взаимодействия агента.
29. Вид размышлений ассистента
Этот вид показывает богатую детализацию, фиксируемую во время исполнения агента. Мы можем видеть внутренний монолог ассистента или процесс «размышления», где он разбивает задачу на части и формулирует план. За этим следуют сами вызовы инструментов, которые он решает сделать, например, компиляция и дизассемблирование файла.
30. Inspect View в IDE
Плагин для VS Code позволяет вам писать код оценки, запускать его из встроенного терминала и сразу же видеть детальные, интерактивные результаты в панели Inspect View, не покидая редактор.
JJ упоминает команду inspect view bundle, которая берёт результаты вашей оценки и создаёт автономный статический веб-сайт, который вы можете опубликовать где угодно, например, на GitHub Pages. Это позволяет легко делиться детальными, интерактивными отчётами об оценках.
32. Окружения-песочницы
Критически важная функция для оценок безопасности — песочница (sandboxing). Inspect предоставляет абстракцию SandboxEnvironment, которая позволяет коду инструментов (например, Python- или shell-скриптам, сгенерированным LLM) исполняться в изолированном окружении. Это предотвращает воздействие потенциально вредоносного кода на хост-систему.
33. Типы окружений для инструментов
В Inspect есть несколько встроенных реализаций этих окружений-песочниц. Локальное окружение для инструментов запускает команды в той же файловой системе, что и оценка. JJ явно предупреждает, что это следует использовать только если вы уже запускаете всю вашу оценку внутри другой, внешней песочницы.
34. Узнать больше
JJ подчеркнул, что Inspect — это открытый проект с более чем 100 внешними контрибьюторами. Он обещает, что если вы вложите усилия в pull request, они будут работать с вами, чтобы его смержить.
JJ завершает, указывая на несколько ресурсов для того, чтобы узнать больше:
Документация: https://inspect.ai-safety-institute.org.uk/ — документация по Inspect Оценки: https://inspect.ai-safety-institute.org.uk/evals/ — реализации широко используемых бенчмарков Разработка: https://github.com/ukgovernmentbeis/inspect_ai — исходный код Inspect
Сессия вопросов и ответов
После презентации у нас была сессия вопросов и ответов. Вот основные моменты:
Можно ли использовать Inspect для оценки уже существующих агентов, например, построенных с LangChain или Claude Code? Да, безусловно. Функция Agent Bridge как раз для этого предназначена. Вы можете по сути обернуть вашего существующего агента (если у него есть базовый API «сообщение на входе — сообщение на выходе») и оценивать его внутри фреймворка Inspect, получая все преимущества его логирования, оценивания и наблюдаемости. Мы планируем вскоре добавить пример для Claude Code. Улучшает ли джейлбрейк модели для обхода отказов по безопасности также её производительность на полезных бенчмарках вроде SWE-Bench? В целом нет. Джейлбрейки предназначены для обхода механизмов отказа, которые распространены в оценках, связанных с безопасностью (например, запрос опасной информации). Они обычно не улучшают производительность на бенчмарках способностей, таких как программирование или рассуждение, где отказы не являются основным режимом сбоя. Что вы думаете об инструментах разметки для создания датасетов для оценки? Это определённо в дорожной карте. Создание хороших UI для разметки и рабочих процессов, помогающих людям создавать высококачественные датасеты и оценивать судей с оценкой моделью, — ключевая область интереса. Это сложная задача, но есть большой потенциал для создания инструментов, которые либо управляются данными (генерация UI из схемы), либо интегрируются с существующими инструментами vibe coding. Отслеживает ли Inspect метаданные эксперимента, такие как стоимость и задержка? Да. Задержка отслеживается в деталях, даже с учётом повторов, чтобы дать точное «рабочее время». Использование токенов тщательно отслеживается для каждого шага, что служит отличным прокси для стоимости. Функция расчёта точной стоимости в долларах на основе количества токенов и публичных цен находится в PR и скоро будет доступна.
👉 В следующем месяце мы проводим наш самый последний, финальный поток нашего курса по AI Evals (нам нужно вернуться к разработке). Вот промокод на скидку 35% для читателей этого поста. 👈