LangChain vs LangGraph: когда нужны цепочки, а когда граф

LangGraph не конкурирует с LangChain, а лежит ниже. Разбираем, когда хватает цепочки и create_agent, а когда нужен граф с состоянием, и показываем код на одной модели.

5 мин · · разработка · агенты

Вопрос «langchain vs langgraph» кажется выбором из двух библиотек, но это скорее выбор уровня абстракции. В документации LangChain сказано прямо: LangGraph — низкоуровневая среда оркестрации, а агенты LangChain построены поверх неё. Ниже объясняем разницу простыми словами, показываем минимальный код на каждом уровне с одной моделью через шлюз и считаем, сколько стоит граф с циклом.

LangChain vs LangGraph: в чём разница

LangChain даёт компоненты (модели, промпты, парсеры, инструменты) и готового агента create_agent: минимальную настраиваемую «обвязку» вокруг цикла «модель думает, вызывает инструмент, получает результат». Вы описываете модель, инструменты и системный промпт, а цикл уже написан.

LangGraph — среда, где вы сами описываете граф: узлы (функции), рёбра между ними и общее состояние. Документация перечисляет его сильные стороны: смешение жёстких шагов и шагов с моделью в одном графе, сохранение состояния и возобновление после сбоя, вмешательство человека в любой точке, потоковая выдача, память. LangGraph можно использовать и без LangChain.

Рекомендация из документации LangChain сводится к тому, что для настраиваемого агента берут create_agent, а для сложных случаев, где детерминированные шаги сочетаются с агентными, берут LangGraph.

ЗадачаЧто взять
Промпт, модель, разбор ответа по порядкуЦепочка из компонентов
Модель вызывает инструменты в циклеcreate_agent
Ветвления и возвраты по условиюLangGraph
Состояние между шагами и сохранение после сбояLangGraph с чекпоинтером
Пауза и подтверждение человекомLangGraph
Долгий процесс, который может прерватьсяLangGraph

Подготовка

Нужны ключ fetch_... из кабинета и адрес https://api.zukko.pro/v1. Установка: pip install langchain langchain-openai langgraph. Подключение и формат запросов описаны в справочнике Python. Общая часть для примеров:

bash
from langchain_openai import ChatOpenAI

writer = ChatOpenAI(
    model="claude-sonnet-5-5",
    base_url="https://api.zukko.pro/v1",
    api_key="fetch_ваш_ключ",
)

Уровень 1: цепочка

Если шаги идут по порядку и ветвлений нет, граф не нужен:

bash
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages(
    [("system", "Отвечай кратко."), ("user", "{question}")]
)
chain = prompt | writer | StrOutputParser()
print(chain.invoke({"question": "Что такое кэш промптов?"}))

Оператор | склеивает компоненты в конвейер. Это самый дешёвый вариант по числу запросов: один вызов модели.

Уровень 2: агент с инструментом

Когда модель сама решает, какую функцию вызвать и сколько раз, берут create_agent:

bash
from langchain.agents import create_agent

PRICES = {"claude-sonnet-5-5": (0.4, 2.0), "gpt-6.1-sol": (0.27, 1.32)}

def get_price(model: str) -> str:
    """Вернуть цену входа и выхода модели в долларах за 1M токенов."""
    pin, pout = PRICES[model]
    return f"вход {pin}, выход {pout}"

agent = create_agent(model=writer, tools=[get_price], system_prompt="Ты помощник по ценам.")
result = agent.invoke({"messages": [{"role": "user", "content": "Сколько стоит выход у gpt-6.1-sol?"}]})
print(result["messages"][-1].content)

Для агента важно, чтобы модель поддерживала вызов инструментов. Проверьте это на выбранной модели одним тестовым запросом. Цикл здесь скрыт внутри: вы не управляете тем, сколько раз модель обратится к инструменту, кроме системного промпта и лимитов ключа.

Уровень 3: граф с состоянием

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

bash
from typing import TypedDict

from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.graph import END, START, StateGraph

checker = ChatOpenAI(
    model="deepseek-v4.1-flash",
    base_url="https://api.zukko.pro/v1",
    api_key="fetch_ваш_ключ",
    temperature=0,
)

class State(TypedDict):

Что здесь происходит. State — общий словарь, который каждый узел читает и частично обновляет. Узлы write и check — обычные функции. Обычное ребро ведёт из write в check, а условное ребро после check решает, закончить или вернуться. Чекпоинтер InMemorySaver сохраняет состояние по thread_id, так что выполнение можно изучить или продолжить, а в продакшене его заменяют хранилищем на диске или в базе. Важная деталь экономии: проверяющий узел использует дешёвую модель, и граф позволяет выбирать модель под каждый шаг.

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

  • Адрес. В обоих классах base_url заканчивается на /v1, потому что это OpenAI-совместимый клиент. Без суффикса запросы уйдут на несуществующий путь и вернут 404.
  • Цикл — это деньги. Каждый проход по графу делает новые запросы. Поэтому в маршрутизаторе стоит счётчик попыток, а ключу задан дневной лимит расхода в долларах; когда он исчерпан, шлюз вернёт 429 key_daily_limit_reached. Подробнее: как ограничить расход ключа. Ищите в документации LangGraph и параметр recursion_limit, он ограничивает число шагов выполнения.
  • Кэш Claude. В OpenAI-формате (а ChatOpenAI по умолчанию работает именно так) для Claude весь вход идёт по цене входа. Если у вас длинный повторяющийся контекст, посмотрите расчёт с кэшем в статье про чтение и запись кэша.

Сколько стоит цикл

Цены на 18 октября 2026, за 1M токенов. Один проход графа: write на claude-sonnet-5-5 (вход 0.4, выход 2) с 300 токенами входа и 150 выхода; check на deepseek-v4.1-flash (вход 0.013, выход 0.038) с 250 токенами входа и 5 выхода.

  • write: 300 × 0.4 + 150 × 2 = 120 + 300 = 420 микродолларов.
  • check: 250 × 0.013 + 5 × 0.038 = 3.25 + 0.19 = 3.44 микродоллара.
  • Проход: 423.44 микродоллара. Худший случай, три прохода: 3 × 423.44 = 1 270.32, около $0.0013 за документ, около $1.27 за 1 000 документов.

Если бы проверку делала та же claude-sonnet-5-5, check стоил бы 250 × 0.4 + 5 × 2 = 110 микродолларов, а проход 530. Основная стоимость в узле генерации, а дешёвый проверяющий экономит немного, но и не вредит: подходит ли такая модель для проверки, решит тест на ваших текстах. Цены и список моделей: GET https://api.zukko.pro/v1/models. Оплата: СБП (комиссия платёжной страницы 8,5% сверху), криптовалюта или карты MasterCard. Базовое подключение LangChain: LangChain: как указать наш base_url.

Частые вопросы

Нужен ли LangChain для LangGraph?

Нет. Документация LangGraph прямо говорит, что его можно использовать без LangChain, но компоненты LangChain удобно брать для моделей и инструментов.

Устарели ли цепочки?

Для линейных задач они остаются самым простым вариантом. В актуальной документации главной точкой входа для агентов названа create_agent.

Что такое Deep Agents?

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

Нужен ли LangSmith?

Он не обязателен. Это отдельный сервис для трассировки и оценки, который подключается по желанию. Для начала хватит логов и раздела «Использование» в кабинете Zukko.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.