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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python16 417
  • Облачные технологии13 174
  • QA вакансии3 433
  • Backend вакансии2 035
  • Инженер данных1 666
  • Продакт-менеджер1 162

Разработка

  • Android1 816
  • iOS1 666
  • AI вакансии937
  • Fullstack вакансии892
  • Frontend вакансии717
  • Mobile вакансии38

По стеку

  • Go8 561
  • Java6 090
  • Node.js1 889
  • Kotlin1 554
  • .NET1 545
  • Rust1 432
  • PHP640
  • C#562
  • C++498

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

  • Kubernetes7 303
  • DevOps вакансии5 594
  • Linux-инфраструктура5 291
  • Terraform / IaC4 014
  • CI/CD2 557
  • Мониторинг и Observability1 735
  • SRE548
  • Кибербезопасность398

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

  • Data Scientist1 033
  • Бизнес-аналитик868
  • Аналитик данных829
  • Системный аналитик134

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

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

По регионам

  • Вакансии в США44 779
  • Вакансии в Европе21 327
  • Вакансии в Канаде4 450
  • Работа в России3 877

По формату

  • Удалённые вакансии73 902
  • Релокация в США44 794
  • Гибридная работа11 412
  • Офисная работа6 956

По уровню

  • Senior вакансии41 197
  • Middle вакансии20 361
  • Junior вакансии6 638

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

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab136 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Что такое state_schema и как определить кастомные редукторы для полей состояния?

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

state_schema — это TypedDict (или Pydantic-модель), определяющий поля состояния графа. Кастомный редуктор задаётся через Annotated[тип, функция_слияния] и вызывается каждый раз, когда узел возвращает обновление этого поля.

Простая схема без редукторов

from typing import TypedDict
from langgraph.graph import StateGraph, END


class SimpleState(TypedDict):
    counter: int
    name: str


def update(state: SimpleState) -> dict:
    return {"counter": state["counter"] + 1}  # полностью заменяет поле counter


builder = StateGraph(SimpleState)
builder.add_node("update", update)
builder.set_entry_point("update")
builder.add_edge("update", END)
graph = builder.compile()
print(graph.invoke({"counter": 0, "name": "test"}))  # {"counter": 1, "name": "test"}

state_schema и редукторы в LangGraph

Каждый граф LangGraph работает с объектом состояния — словарём, структура которого задана схемой. Схема — это TypedDict или Pydantic BaseModel, переданный при создании StateGraph(schema).

Кастомные редукторы через Annotated

По умолчанию каждый возврат из узла заменяет поле. Если нужно накапливать значения (например, добавлять в список), используйте Annotated[тип, функция]:

import operator
from typing import Annotated, TypedDict
from langgraph.graph import StateGraph, END


class AccState(TypedDict):
    items: Annotated[list[str], operator.add]  # конкатенация списков
    total: Annotated[int, operator.add]         # сложение чисел
    latest: str                                  # простая замена


def node_a(state: AccState) -> dict:
    return {"items": ["a1", "a2"], "total": 10, "latest": "from_a"}


def node_b(state: AccState) -> dict:
    return {"items": ["b1"], "total": 5, "latest": "from_b"}


builder = StateGraph(AccState)
builder.add_node("a", node_a)
builder.add_node("b", node_b)
builder.set_entry_point("a")
builder.add_edge("a", "b")
builder.add_edge("b", END)
graph = builder.compile()

result = graph.invoke({"items": [], "total": 0, "latest": ""})
# items = ["a1", "a2", "b1"], total = 15, latest = "from_b"
print(result)

Кастомная функция-редуктор

def keep_unique(existing: list, new: list) -> list:
    """Добавляем только уникальные элементы."""
    return existing + [x for x in new if x not in existing]


class UniqueState(TypedDict):
    tags: Annotated[list[str], keep_unique]

Pydantic-модель как схема

from pydantic import BaseModel
from typing import Annotated
import operator


class PydanticState(BaseModel):
    messages: Annotated[list[str], operator.add] = []
    score: float = 0.0


# StateGraph(PydanticState) — Pydantic валидирует типы при каждом обновлении

add_messages — встроенный умный редуктор

from langgraph.graph.message import add_messages
from langchain_core.messages import HumanMessage, RemoveMessage
from typing import Annotated, TypedDict


class ChatState(TypedDict):
    messages: Annotated[list, add_messages]


# add_messages:
# 1. Добавляет новые сообщения в список
# 2. Обновляет существующие (по id)
# 3. Удаляет через RemoveMessage(id=...)

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

  • Мутация вместо возврата нового объекта — если редуктор изменяет existing in-place и возвращает его, возникают трудноотлаживаемые side-эффекты.
  • operator.add для int в параллельных ветвях — LangGraph вызовет редуктор дважды; убедитесь, что сложение коммутативно и идемпотентно.
  • Pydantic и Annotated — в Pydantic v2 синтаксис Annotated поддержан, но Field(default_factory=...) может конфликтовать с редуктором.
  • Отсутствие поля в возврате узла — если узел не возвращает поле, оно не трогается редуктором; это нормальное поведение, но часто путает новичков.
  • None-значения — редуктор вызывается даже если узел вернул {"items": None}; защищайте редуктор от None.
  • Сериализация checkpointer — кастомные объекты в состоянии должны быть JSON-сериализуемы для SqliteSaver/RedisSaver.

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

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

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

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

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

  • Может ли связать state schema reducers с реальным контрактом входов и выходов.
  • Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
  • Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.

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

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

Источники

  • https://docs.langchain.com/oss/python/langgraph/graph-api
←Предыдущий вопросКакие риски есть у LangGraph: data leakage, неверная оценка качества, memory usage, latency, cost, drift или observability?Следующий вопрос→Что такое `ToolNode` в LangGraph и как добавить возможности вызова инструментов в граф?

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

LangGraphdata-ailanggraphllm-orchestrationtool-calling