Новое: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 компилируются отдельно и вставляются как узлы в родительский граф; взаимодействие идёт через общий state или явные адаптеры, параллельный запуск — через Send API.

Базовая архитектура: supervisor + subgraphs

Наиболее распространённый паттерн — граф-супервизор, который маршрутизирует задачи к специализированным подграфам. Каждый подграф обрабатывает свою область ответственности и возвращает результат в общий state.

from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver
from typing import TypedDict, Literal

# --- State подграфа (researcher) ---
class ResearchState(TypedDict):
    query: str
    findings: str

def search_web(state: ResearchState) -> ResearchState:
    # имитация поиска
    return {"findings": f"Results for: {state['query']}"}

def summarize(state: ResearchState) -> ResearchState:
    return {"findings": state["findings"] + " [summarized]"}

research_builder = StateGraph(ResearchState)
research_builder.add_node("search", search_web)
research_builder.add_node("summarize", summarize)
research_builder.set_entry_point("search")
research_builder.add_edge("search", "summarize")
research_builder.add_edge("summarize", END)
research_graph = research_builder.compile()

# --- State подграфа (writer) ---
class WriterState(TypedDict):
    research: str
    draft: str

def write_draft(state: WriterState) -> WriterState:
    return {"draft": f"Draft based on: {state['research']}"}

writer_builder = StateGraph(WriterState)
writer_builder.add_node("write", write_draft)
writer_builder.set_entry_point("write")
writer_builder.add_edge("write", END)
writer_graph = writer_builder.compile()

# --- Общий state супервизора ---
class SupervisorState(TypedDict):
    task: str
    findings: str
    draft: str
    next: Literal["researcher", "writer", END]

def supervisor(state: SupervisorState) -> SupervisorState:
    if not state.get("findings"):
        return {"next": "researcher"}
    if not state.get("draft"):
        return {"next": "writer"}
    return {"next": END}

# Адаптеры: преобразование state супервизора в state подграфа
def call_researcher(state: SupervisorState) -> SupervisorState:
    result = research_graph.invoke({"query": state["task"], "findings": ""})
    return {"findings": result["findings"]}

def call_writer(state: SupervisorState) -> SupervisorState:
    result = writer_graph.invoke({"research": state["findings"], "draft": ""})
    return {"draft": result["draft"]}

supervisor_builder = StateGraph(SupervisorState)
supervisor_builder.add_node("supervisor", supervisor)
supervisor_builder.add_node("researcher", call_researcher)
supervisor_builder.add_node("writer", call_writer)
supervisor_builder.set_entry_point("supervisor")
supervisor_builder.add_conditional_edges(
    "supervisor",
    lambda s: s["next"],
    {"researcher": "researcher", "writer": "writer", END: END}
)
supervisor_builder.add_edge("researcher", "supervisor")
supervisor_builder.add_edge("writer", "supervisor")

memory = MemorySaver()
graph = supervisor_builder.compile(checkpointer=memory)

config = {"configurable": {"thread_id": "task-1"}}
result = graph.invoke(
    {"task": "quantum computing trends", "findings": "", "draft": "", "next": "supervisor"},
    config=config
)
print(result["draft"])

Координация агентов через подграфы в LangGraph

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

Прямое встраивание подграфа как узла

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

parent_builder = StateGraph(SupervisorState)
# Прямая вставка — LangGraph автоматически передаёт
# пересекающиеся ключи в подграф
parent_builder.add_node("research_agent", research_graph)

Паттерн параллельного запуска подграфов

Для параллельного выполнения нескольких агентов используется Send API — он создаёт несколько параллельных ветвей:

from langgraph.types import Send

def dispatch_agents(state: SupervisorState):
    return [
        Send("researcher", {"query": state["task"], "findings": ""}),
        Send("researcher", {"query": state["task"] + " advanced", "findings": ""})
    ]

supervisor_builder.add_conditional_edges(
    "supervisor",
    dispatch_agents
)

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

  • Несовместимость state: родительский и дочерний граф имеют разные TypedDict — при прямой вставке без адаптера LangGraph передаёт только пересекающиеся ключи, остальные молча игнорируются. Это частая причина потери данных.
  • Чекпоинты подграфов: по умолчанию подграф, вставленный как узел, не использует checkpointer родителя. Для сохранения истории подграфа нужно явно передавать checkpointer при компиляции подграфа или использовать subgraphs=True в конфиге.
  • thread_id изоляция: при вызове подграфа через invoke внутри узла thread_id не передаётся автоматически — нужно явно прокидывать config.
  • Рекурсия: граф с циклами (агент вызывает другой агент, который возвращается к первому) может уйти в бесконечный цикл. LangGraph ограничивает глубину через recursion_limit (по умолчанию 25).
  • Отладка вложенных графов: стандартные print-логи не показывают иерархию вызовов. Используйте LangSmith или stream_mode="values" для полного трейсинга.
  • Производительность Send: параллельные ветки через Send выполняются псевдопараллельно (Python asyncio), а не истинно параллельно. Для CPU-heavy задач это не даст выигрыша без ProcessPoolExecutor.

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

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

Типичные ошибки

  • Объяснять multi agent subgraphs только синтаксисом без shape, dtype, состояния или режима выполнения.
  • Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
  • Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.

Что проверяет интервьюер

  • Может ли связать multi agent subgraphs с реальным контрактом входов и выходов.
  • Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
  • Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.
  • Предлагает ли observability, rollback, ограничения стоимости и стратегию incident replay.

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

Проверить себя по теме LangGraph →

Источники

  • https://docs.langchain.com/oss/python/langgraph/overview

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

LangGraphdata-ailanggraphobservabilityproduction-ml