Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 220
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

DevOps и инфраструктура

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

Аналитика и данные

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

Другие направления

  • Проджект-менеджер611
  • UI/UX дизайн145
  • Ручное тестирование14

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме LangGraphВсе вопросы
LangGraphSeniorОпыт

Как проверять корректность решения на LangGraph, а не только успешное выполнение кода?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Корректность в LangGraph проверяется на четырёх уровнях: unit-тесты узлов с мок-LLM, изолированные тесты routing-функций, интеграционные тесты графа с MemorySaver и LLM evaluation harness (LangSmith/RAGAS) для нетерминированных ответов.

Уровень 1: детерминированные unit-тесты узлов

Каждый узел — чистая функция над State. Мокируем LLM-вызовы, проверяем трансформацию State:

from unittest.mock import patch, MagicMock
from my_agent.nodes import evaluate_node
from my_agent.state import State

def test_evaluate_sets_score():
    state: State = {
        "messages": [],
        "draft": "Paris is the capital of France.",
        "score": 0.0,
        "iterations": 1,
    }
    mock_response = MagicMock()
    mock_response.content = '{"score": 0.92, "feedback": "accurate"}'

    with patch("my_agent.nodes.llm.invoke", return_value=mock_response):
        result = evaluate_node(state)

    assert result["score"] == 0.92
    assert "feedback" in result
    # граф не упал, но и результат проверен

Разница между «код выполнился» и «результат корректен»

В LangGraph граф может завершиться без исключений, но вернуть неверный результат: LLM галлюцинировал, routing-функция выбрала не ту ветку, reducer перетёр часть истории. Проверка корректности требует отдельного слоя валидации поверх happy-path тестов.

Уровень 2: тесты routing-логики

Routing-функции должны быть детерминированы и тестироваться изолированно. Особенно важно проверить граничные случаи:

from my_agent.routing import should_continue

def test_routing_ends_after_max_iterations():
    state = {"score": 0.5, "iterations": 3}
    assert should_continue(state) == "__end__"

def test_routing_retries_on_low_score():
    state = {"score": 0.5, "iterations": 1}
    assert should_continue(state) == "generate"

def test_routing_passes_on_high_score():
    state = {"score": 0.9, "iterations": 1}
    assert should_continue(state) == "__end__"

Уровень 3: интеграционные тесты всего графа

Запускаем граф с фиксированными моками LLM и проверяем финальный State. Используем MemorySaver вместо реального checkpointer:

from langgraph.checkpoint.memory import MemorySaver
from my_agent.graph import build_graph

def test_graph_terminates_and_produces_valid_state():
    memory = MemorySaver()
    graph = build_graph(checkpointer=memory)
    config = {"configurable": {"thread_id": "test-001"}}

    with patch("my_agent.nodes.llm.invoke") as mock_llm:
        # Первый вызов: низкий score → retry
        # Второй вызов: высокий score → завершение
        mock_llm.side_effect = [
            MagicMock(content='{"score": 0.5}'),
            MagicMock(content='{"score": 0.95}'),
        ]
        final = graph.invoke({"draft": "", "score": 0.0, "iterations": 0}, config)

    assert final["score"] >= 0.8
    assert final["iterations"] <= 3  # не зашёл в бесконечный цикл

Уровень 4: проверка State-инвариантов через get_state

После выполнения граф можно остановить через interrupt_before и инспектировать промежуточный State:

graph_with_interrupt = builder.compile(
    checkpointer=memory,
    interrupt_before=["evaluate"]
)
result = graph_with_interrupt.invoke(initial_state, config)
snapshot = graph_with_interrupt.get_state(config)

# Проверяем, что узел generate отработал корректно
assert snapshot.values["draft"] != ""
assert snapshot.next == ("evaluate",)

Уровень 5: LLM evaluation для нетерминированных ответов

Для финальных ответов LLM используйте evaluation harness (LangSmith Dataset + evaluate() или RAGAS для RAG-пайплайнов):

  • Фиксируйте тестовые датасеты (input → expected output) в langsmith.create_dataset().
  • Запускайте langsmith.evaluate(graph.invoke, data=dataset, evaluators=[accuracy_evaluator]) в CI.
  • Следите за дрейфом метрик при обновлении модели или промпта.

Подводные камни

  • Тестирование только через assert result is not None — граф завершился, но вернул пустой или некорректный State.
  • Отсутствие проверки числа итераций — тест проходит, но в production граф делает 10 лишних LLM-вызовов.
  • Использование реального LLM в unit-тестах — нестабильные ответы делают тесты flaky и дорогими.
  • Не тестировать routing-функции изолированно — ошибка в routing обнаруживается только в интеграционном тесте.
  • Игнорирование reducer-поведения — тест на одном сообщении проходит, но с несколькими сообщениями список перетирается.
  • Отсутствие seed для random в промптах с temperature > 0 — тесты проходят иногда, а не всегда.
  • Не проверять snapshot.next при interrupt-тестах — непонятно, на каком узле граф ожидает.

Частые вопросы на собеседовании

  • Как LangGraph представляет состояние с помощью TypedDict и как оно передаётся между узлами?
  • Что является основной абстракцией в LangGraph — что такое nodes, edges и state?
  • Что такое LangGraph и как он расширяет LangChain для построения stateful агентских воркфлоу?
  • В каких data/AI-задачах LangGraph даёт реальный выигрыш, а где лучше выбрать другой инструмент или более простой pipeline?

Что портит ответ

  • Сразу обвинять LangGraph, не проверив соседние слои системы
  • Чинить симптом без минимального воспроизведения и evidence
  • Не учитывать версии, конфигурацию, окружение и recent changes

Что слушает интервьюер

  • Умеет локализовать проблему вокруг LangGraph
  • Двигается от симптома к гипотезам и проверкам
  • Отличает баг инструмента от ошибки использования или окружения

Как вы знаете этот вопрос?

Проверить себя по теме LangGraph →
←Предыдущий вопросКакие ключевые абстракции LangGraph нужно понимать, чтобы не получать формально рабочие, но неверные результаты?Следующий вопрос→Представьте, pipeline на LangGraph даёт хорошие результаты в dev, но плохо работает на новых данных. Как вы будете разбираться?

Связанные темы

LangGraphDebugginglanggraphtechnical-communicationtechnology-selectiontrade-off-analysis