Главная/Блог/Гайд/Инженерия профилей LangChain для…
Гайд12 мин чтения · 9 июля 2026 г.

Инженерия профилей LangChain для Nemotron 3 Ultra

Узнайте, как улучшить точность агентов NVIDIA Nemotron 3 Ultra без дообучения, используя инженерные профили LangChain Deep Agents и автоматизированные циклы оптимизации.

Инженерия профилей LangChain для Nemotron 3 Ultra

В мире генеративного искусственного интеллекта и агентных систем (Agentic AI) существует вечное противоречие: как достичь максимальной точности, не разоряясь на вычислительных ресурсах? Традиционно ответ лежал в плоскости использования проприетарных моделей-лидеров (frontier models), которые обеспечивают эталонное качество, но требуют значительных затрат. Альтернатива — использование открытых моделей, таких как NVIDIA Nemotron 3 Ultra, которые дешевле и доступнее, но изначально могут уступать в качестве. Классический путь улучшения открытых моделей — это дообучение (fine-tuning). Однако этот процесс требует глубокой экспертизы, мощного оборудования для обучения и сложной инфраструктуры для хостинга кастомных моделей.

Но что, если можно получить качество, сопоставимое с проприетарными моделями, не прибегая к дорогостоящему дообучению? Ответ кроется в новой парадигме — инженерии профилей агентов (harness profile engineering). Этот подход позволяет тонко настраивать поведение модели непосредственно в момент её взаимодействия с агентной средой. В этой статье мы подробно разберем, как создать профиль LangChain Deep Agents для NVIDIA Nemotron 3 Ultra, чтобы повысить его точность, избежать переобучения и автоматизировать процесс оптимизации с помощью агентных циклов, таких как "RALPH loop".

01Почему традиционные методы настройки недостаточны?

До недавнего времени настройка промптов (prompt engineering) была основным инструментом разработчиков. Однако для сложных агентных систем, где модель выполняет множество шагов, использует инструменты и взаимодействует с внешним миром, простых промптов часто недостаточно. Ошибки накапливаются, и модель может "забывать" контекст или неправильно интерпретировать результаты вызовов инструментов.

Две ключевые инновации сделали возможным формализованный подход к настройке агентов:

  1. Специализированные бенчмарки оценки: Теперь существуют тестовые наборы, созданные специально для проверки конкретных агентных harness (обвязки). Это позволяет объективно измерять, улучшает ли изменение производительность или ухудшает её.
  2. Точечная кастомизация: Появились такие инструменты, как LangChain Agent Harness Profiles. Это первый в своем роде механизм, позволяющий разработчикам вносить изменения в поведение агента, не переписывая код самого агента и не меняя архитектуру модели. Это точка расширения, где можно внедрять middleware, менять системные промпты или описания инструментов.

Цель инженерии профилей проста, но эффективна: сделать так, чтобы вызовы от агента к модели максимально напоминали данные, на которых модель обучалась. Если модель "видит" структуру данных, привычную для её обучающей выборки, она работает точнее.

Схема процесса настройки и оптимизации агентов с использованием профилей обвязки.
Схема процесса настройки и оптимизации агентов с использованием профилей обвязки.

02Основы LangChain Deep Agents и профилирование

LangChain Deep Agents — это популярная открытая обвязка для создания агентов. Для настройки её под конкретную модель, такую как NVIDIA Nemotron 3 Ultra, LangChain предоставляет два важнейших инструмента:

  • Открытый бенчмарк оценки: Набор тестов, который служит эталоном качества.
  • Профили обвязки (Harness Profiles): Формализованный способ изменения поведения агента в зависимости от используемой модели.

Процесс настройки глубокого агента для Nemotron 3 Ultra состоит из итеративного цикла:

  1. Установление базовой линии: Запуск бенчмарка с агентом и Nemotron 3 Ultra без каких-либо кастомных профилей.
  2. Анализ ошибок: Изучение того, где и почему модель провалила тест.
  3. Предложение изменений: Внесение правок в профиль (изменение промптов, добавление middleware, исключение инструментов).
  4. Верификация: Повторный запуск бенчмарка для подтверждения улучшения без появления регрессий (новых ошибок в ранее работающих тестах).

Какие изменения можно вносить в профиль?

  • Промпты: Изменение базового системного промпта, добавление суффиксов или изменение описаний инструментов. Например, можно добавить инструкцию для Nemotron Ultra предпочитать уточняющие вопросы или полагаться на результаты инструментов, а не на внутреннюю память модели.
  • Исключения: Удаление ненужных инструментов или middleware-компонентов.
  • Добавления: Внедрение новой middleware-логики или суб-агентов. Например, middleware, который проверяет, не был ли ответ модели усечен, или содержит ли он неверные имена инструментов.

03Практический пример: Проблема с чтением файлов

Давайте рассмотрим конкретный случай, который часто встречается при работе с большими данными. Представьте, что агенту нужно найти последнюю непустую строку в большом файле /big.txt. Модель использует встроенный инструмент read_file.

Вот как выглядит провал теста:

terminalpython
Failing test: tests/evals/test_file_operations.py::test_read_file_truncation_recovery_with_pagination[nvidiahub:ultra-tme]
Failure:
  success check failed: Expected final text to contain 'opal-fox-91', got: 'x'
  Trajectory:
  step 1:
    - read_file {'file_path': '/big.txt'}
  step 2:
    text: x

Инструмент read_file является критически важным для задач кодирования, анализа данных и агентных сценариев. В данном случае задача требует найти последнее значение в файле. Первый вызов read_file возвращает первую страницу файла, которая содержит только значения 'x'. Правильный ответ, 'opal-fox-91', находится гораздо позже. Модель должна была продолжить чтение, используя пагинацию (смещение и лимит), но остановилась после первой страницы, приняв её конец за конец файла.

💡
Важно понимать. Проблема не в том, что модель "глупая". Проблема в том, что она не получила сигнала о том, что данные могут продолжаться. В обучающих данных LLM часто встречаются явные маркеры конца файла, а здесь такого маркера не было.

04Предложение исправления: Middleware

Как исправить эту ситуацию? Мы можем создать собственную middleware-функцию, которая будет анализировать результат вызова read_file и добавлять к нему подсказку, если файл, вероятно, продолжается.

Вот код для ReadFileContinuationNoticeMiddleware:

terminalpython
class ReadFileContinuationNoticeMiddleware(AgentMiddleware):
    """Tell the model when a read_file result probably continues."""
    name = "ReadFileContinuationNoticeMiddleware"
    def wrap_tool_call(self, request, handler):
        return self._annotate(request, handler(request))
    @staticmethod
    def _annotate(request, result):
        if not isinstance(result, ToolMessage):
            return result
        if request.tool_call.get("name") != "read_file":
            return result
        content = str(result.text)
        args = request.tool_call.get("args", {}) or {}
        offset = int(args.get("offset", 0))
        limit = int(args.get("limit", 100))
        n_lines = sum(
            1
            for row in content.split("\n")
            if "\t" in row and row.split("\t", 1)[0].strip().isdigit()
        )
        if n_lines < limit:
            return result
        notice = (
            f"\n\n[read_file returned {limit} lines starting at offset {offset}, "
            f"the per-read limit. The file likely continues past this window. "
            f"To read further, call read_file again with offset={offset + limit}. "
            f"Do not assume you have seen the end of the file.]"
        )
        return result.model_copy(update={"content": content + notice})

Этот middleware проверяет, вернул ли инструмент максимальное количество строк (лимит). Если да, он добавляет к ответу текст, явно указывающий модели, что файл продолжается, и подсказывает, как вызвать инструмент снова с новым смещением.

Теперь добавим этот middleware в профиль обвязки:

terminalpython
profile = HarnessProfile(
    extra_middleware=[
        ReadFileContinuationNoticeMiddleware(),
    ]
)
register_harness_profile("nvidia:nemotron-ultra", profile)
Схема цикла улучшения (flywheel blueprint), демонстрирующая итеративный процесс тестирования и исправления.
Схема цикла улучшения (flywheel blueprint), демонстрирующая итеративный процесс тестирования и исправления.

05Валидация исправления

После внедрения профиля необходимо проверить, работает ли исправление. Запустим провалившийся тест снова:

terminalbash
uv run pytest \
  tests/evals/test_file_operations.py \
  --model nvidia:nemotron-utlra \
  --harness-profile nemotron-ultra

Если тест проходит, важно запустить весь бенчмарк оценки, а не только исправленный тест. Это необходимо, чтобы убедиться, что новое изменение не вызвало регрессий в других тестах. Поскольку бенчмарки и тесты являются стохастическими (вероятностными), рекомендуется запускать базовую линию и предлагаемое изменение несколько раз для получения статистически значимых результатов.

Результаты показывают эффективность подхода:

Профиль Тесты чтения файлов Общий бенчмарк
Базовая линия 0 / 3 Среднее 94 / 127
Middleware для чтения файлов 3 / 3 Среднее 96 / 127

Как видно из таблицы, внедрение middleware решило все три провалившихся теста и улучшило общий балл бенчмарка с 94 до 96 из 127. Это значительный прогресс, достигнутый без изменения весов самой модели.

⚠️
Осторожно: Переобучение. Перед финализацией изменений важно оценить риск переобучения. В данном примере middleware является "механическим" исправлением, которое учит модель правильно использовать инструменты. Однако, если бы мы добавили в промпт специфичные определения слов (например, разницу между "alert" и "triage") только для одного теста, это могло бы привести к переобучению. Модель запомнила бы ответ, а не научилась решать задачу обобщенно.

06Автоматизация создания профилей: Цикл RALPH

Ручной процесс "запуск бенчмарка -> анализ ошибок -> изменение профиля -> повторный запуск" является итеративным. Но именно такие циклы — то, в чем агенты преуспевают. Они могут выполнять эти действия без участия человека.

Джеффри Хантли (Geoffrey Huntley) назвал этот паттерн "RALPH loop": модель постоянно читает текущее состояние, вносит одно изменение и использует файловую систему (а не историю чата) в качестве памяти. Хотя этот термин был введен для кодовых агентов, он применим и к инженерии профилей.

Инженерия профилей — это тот же цикл, но направленный на другую цель. Мы заменяем кодовую базу на файл профиля, а набор тестов — на бенчмарк оценки. Цикл остается неизменным: предложи изменение, проверь его по объективному сигналу (бенчмарку), сохрани или отбрось, и повтори. Именно бенчмарк делает эту автоматизацию безопасной, так как он служит верификатором истины: изменение принимается только если оно измеримо улучшает результаты.

Иллюстрация дата-центров, символизирующая вычислительную инфраструктуру для запуска больших моделей.
Иллюстрация дата-центров, символизирующая вычислительную инфраструктуру для запуска больших моделей.

07Агентный пропозер и LangSmith Engine

LangSmith Engine — это управляемая версия этого цикла от LangChain. Он обнаруживает ошибки в продакшен-трейсах, диагностирует их первопричину, черновик исправления и добавляет оценщик, чтобы предотвратить возвращение ошибки. Каждое предлагаемое изменение проверяется человеком перед развертыванием.

Однако, мы можем пойти дальше и использовать полностью автоматизированный цикл, как в референсной реализации из репозитория NemoClaw. Этот цикл работает автономно и включает несколько ключевых решений, отделяющих надежный цикл улучшения от машины переобучения:

  1. Проверяй, прежде чем верить. Вызов модели стохастичен, и бенчмарк с оценкой LLM тоже. Исправление принимается только после того, как оно успешно проходит тест несколько раз подряд. Это фильтрует случайные успехи.
  2. Снимок и откат. Профиль сохраняется перед каждой попыткой. Если попытка не удалась, профиль восстанавливается. Это гарантирует, что плохое предложение никогда не ухудшит профиль.
  3. Учись на последней попытке. Если попытка провалилась, цикл передает следующей итерации именно то, что было сделано, и как это провалилось. Это позволяет модели уточнять подход, а не повторять одни и те же ошибки.
  4. Проверяй весь набор. После любого успешного исправления запускается весь бенчмарк, а не только исправленный тест. Это выявляет регрессии и новые тесты, которые стали возможными благодаря исправлению.

Цикл продолжается раунд за раундом, пока профиль не пройдет чисто, раунд не принесет улучшений, или не исчерпается бюджет итераций.

08Агентный пропозер: Как это работает изнутри

Самая интересная часть цикла — шаг "предложи изменение". Здесь модель получает описание ошибки, инструменты для исследования решений и предлагает модификацию профиля.

Каждое предложение запускается как короткая сессия агента. Агент получает:

  • Записываемую копию профиля.
  • Только для чтения доступ к провалившемуся тесту, наблюдаемой траектории агента, SDK и коду бенчмарка.

С помощью обычных файловых инструментов (чтение, редактирование, grep, glob) агент может подтвердить, как ведет себя хук middleware или значение по умолчанию инструмента, прежде чем полагаться на него. Затем он вносит минимальное изменение, устраняющее диагностированную ошибку, и пишет краткое объяснение того, что он изменил и почему.

Два ограничения держат агента в рамках:

  1. Ограниченная запись: Доступ на запись ограничен только файлом профиля. Агент может читать весь кодовый базу для контекста, но может изменять только один файл, который настраивается.
  2. Предпочтение обобщенных решений: Агенту сказано предпочитать общее исправление специфичному хаку. Он должен выводить общее поведение, которое выявляет ошибка, а не специализироваться на точных входах одного теста. Это разница между обучением модели устойчивому навыку и запоминанием одного ответа.

Для дальнейшего предотвращения переобучения часть набора тестов может быть выделена как валидационная выборка. Агентный цикл, вносящий изменения, никогда не видит эти тесты, но балл по ним используется для валидации улучшений профиля.

Сравнительная визуализация моделей Llama и Nemotron, подчеркивающая возможности оптимизации открытых моделей.
Сравнительная визуализация моделей Llama и Nemotron, подчеркивающая возможности оптимизации открытых моделей.

09Пример работы автоматизированного цикла

Ниже приведен сокращенный вывод референсной реализации, работающей с обвязкой Deep Agents и Nemotron 3 Ultra для устранения ранее идентифицированной ошибки пагинации read_file:

terminalbash
$ hep langchain ralph \
    --model "openai:nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B" \
    --profile examples/deepagents/profiles/nvidia_nemotron_3_ultra.py \
    --evals-dir external/deepagents/libs/evals \
    --category file_operations \
    --ralph-model "anthropic:...:bedrock-claude-opus-4-8" \
    --ralph-max-turns 100 \
    --max-iters 100 \
    --max-iters-per-failure 5 \
    --verify-runs 3
[ralph] baseline: 20 passed, 1 failed  (correctness: 0.95)
  FAILED test_read_file_truncation_recovery_with_pagination
  Expected final text to contain 'opal-fox-91', got: 'x'
    step 1: read_file {'file_path': '/big.txt'}
    step 2: text: x
[ralph] round 1 — fixing pagination failure (attempt 1/100)
[ralph:proposer] Root cause: read_file pages by lines (100),
  and the result gives no signal the file continues past the
  page — so the model treated the first page's last line as
  EOF and answered after one call.
  Fix (profile levers, not test-specific values):
    1. Middleware: when a page returns full (lines == limit),
       append a hint to keep paging (offset=)
       until a short page signals EOF.
    2. Prompt: page to EOF before answering end-of-file
       questions.
[ralph]   verify 1/3 ✓   2/3 ✓   3/3 ✓
[ralph]   FIXED
[ralph] === re-running full suite ===
  results: 21 passed, 0 failed  (correctness: 1.00)
result: 20 → 21 passed, 1 → 0 failed

Агент диагностировал первопричину ошибки, внедрил исправление, которое прошло три последовательные проверки, и выдержал повторный запуск всего набора тестов без регрессий. Это демонстрирует мощь автоматизированной инженерии профилей.

10Адаптация к другим обвязкам

Важно отметить, что этот автоматизированный цикл не специфичен для LangChain Deep Agents. Чтобы адаптировать Nemotron 3 Ultra к другим фреймворкам агентов, используя этот подход, необходимо обеспечить три вещи:

  1. Способ запуска оценок и отчетности о результатах прохождения/непрохождения тестов и траекториях.
  2. Файл профиля или конфигурации, который можно редактировать и валидировать программно.
  3. Модель качества уровня frontier для предложения правок.

При наличии этих компонентов тот же цикл — "предложи, проверь, сохрани или откатись, перезапусти" — работает неизменно. Это открывает путь к универсальной оптимизации открытых моделей для любых агентных систем.

11Что это значит на практике

Для разработчиков и инженеров, работающих с NVIDIA Nemotron 3 Ultra, этот подход означает переход от "магии промптов" к инженерной дисциплине. Вы больше не зависите только от удачи в формулировке запроса. Вы можете систематически улучшать производительность модели, используя объективные метрики и автоматизированные циклы обратной связи.

Это особенно важно для российских пользователей и компаний, так как:

  • Доступность: Nemotron 3 Ultra доступен через облачных провайдеров NVIDIA (Baseten, Crusoe, Fireworks, Nebius, Together AI), что позволяет запускать его из РФ, соблюдая локальные требования к данным.
  • Экономия: Оптимизация через профили дешевле, чем дообучение, и не требует сложной инфраструктуры.
  • Качество: Вы можете достичь уровня, близкого к проприетарным моделям, используя открытые инструменты и модели.

Рекомендуем начать с изучения профиля, опубликованного командой LangChain, и протестировать Blueprint NVIDIA NemoClaw для LangChain Deep Agents. Это даст вам практический опыт работы с автоматизированной оптимизацией агентов и поможет интегрировать Nemotron 3 Ultra в ваши проекты с максимальной эффективностью.

Источник: NVIDIA Developer ↗